本文大部分引用自http://heylinux.com/archives/817.html虽然puppet之类的工具也很好用啦,但是仅仅是单向同步,总有种「まだあいつの出番ではない!w」(还没轮到那家伙出场呢!)的感觉。于是小小研究了下rsync+inotify-tools+ssh的方案,简单易行。在这里,暂时把同步的源头叫src,同步到的目的机器叫dst。本文以centos6为例,debian/ubuntu用户请自行把yum之类的脑补成apt-get之类的~
安装软件包
Linux kernel从2.6开始支持inotify-tools
。于是src机器
[root@src ~]# yum install rsync inotify-tools
dst机器
[root@dst ~]# yum install rsync
如果提示没找到软件包,请参考 @boypt pt桑的这篇博文。
设定同步专用帐号
接下来,为两边机器,即src与dst都设定同步专用帐户
[root@src ~]# useradd -m rsync
[root@src ~]# passwd rsync
[root@dst ~]# useradd -m rsync
[root@dst ~]# passwd rsync
最好在dst上编辑/etc/passwd
与/etc/group
使得两边rsync的uid和gid一致。别忘了改完这两个文件之后之后还要chown -R rsync:rsync /home/rsync
接下来作成src的公开键与秘密键,并把src的公开键扔到dst的/home/rsync/.ssh/authorized_keys
下面。记得authorized_keys
权限600,.ssh
目录权限700。
最后在两边机器上把想同步的目录的uid:gid也改成rsync:rsync
撰写同步脚本
[root@src ~]# vim dir.rsync
!/bin/sh
SRC=/path/to/dir/ #最后的\很重要!
DST=rsync@dst's_ip:/path/to/dir
#su - rsync
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
do
/usr/bin/rsync -ahqzt --delete $SRC $DST
done |
!/bin/sh
SRC=/path/to/dir/ #最后的\很重要!
DST=rsync@dst's_ip:/path/to/dir
#su - rsync
inotifywait -mrq -e modify,delete,create,attrib ${SRC} | while read D E F
do
/usr/bin/rsync -ahqzt --delete $SRC $DST
done
[root@src ~]# chmod +x !$
部分注释引用原文
相关注解如下:
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}
-m 是保持一直监听
-r 是递归查看目录
-q 是打印出事件
-e create,move,delete,modify,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件
/usr/bin/rsync -ahqzt –delete $SRC $DST
-a 存档模式
-h 保存硬连接
-q 制止非错误信息
-z 压缩文件数据在传输
-t 维护修改时间
-delete 删除于多余文件
要排除同步某个目录时,为rsync添加–exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。
要排除某个目录的事件监听的处理时,为inotifywait添加–exclude或–excludei参数,具体查看man inotifywait。
inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。
然后按照原文我始终不能成功,于是干脆以root权限运行,虽然有安全问题但是……不管了。
!$为bash中上一条命令的最后的参数。因为Meta键总是因为各种原因按不出来所以(ry (emacs什么的最讨厌了 #口亨
最后把dir.rsync
给&
进后台以及cat
进/etc/rc.local就ok了。如果中途感觉文件没同步过去记得检查要同步的目录里面的文件权限和各种其他的权限,以及善用bash -x
。