rsync那些事儿
1.关于rsync
rsync是remote synchronize的简称,是一款远程同步软件,在项目中多有用到。其采用的rsync算法(酷壳上有一篇介绍rsync核心算法的博文rsync的核心算法)提供了一种比较快速的方法用于客户机和远程文件服务器同步。
rsync的特点是安装和配置都比较方便,然后同步文件时能够保持符号链接,硬链接,权限,文件时间,文件归属等数学。安全性方面则提供了密码、读写权限控制和IP权限控制。
2.rsync安装和配置
由于我用的是ubuntu,已经预装了rsync,所以就不用安装了。我的配置文件是/etc/rsyncd.conf,配置如下,更详细的配置介绍参见rsyncd.config:
read only = yes
list = yes
uid = nobody
gid = nogroup
pid file = /var/run/rsyncd.pid
secrets file = /etc/rsyncd.secrets
log file = /var/log/rsync.log
[test]
comment = Welcome
path = /home/ssj/rsynctest
hosts allow = 127.0.0.1 10.211.55.11
auth users = rsynctest
其中read only设置同步目录只读,uid和gid为同步采用的用户和用户组。pid file和log file为pid文件和日志文件存放地址。
test为同步目录,path为同步目录,注意该变量后面加注释如#XXX之类,加了会报chroot错误。另外,hosts allow是限制同步的ip,多个ip空格分隔。auth users和secrets file分别是认证的用户和密码文件。其中secrets file权限必须为600,否则会同步会出错,格式为用户名:密码,这里的用户名不一定是系统用户,可以随便取名,比如我的是rsynctest:testpasswd
。
3.rsync同步命令
rsync同步有两种模式,一种通过远程shell如ssh进行连接,另外则是通过TCP直接连接rsync服务器。因为使用ssh等同步需要设置ssh对应端口,比较麻烦点,我一般都是采用直接连接rsync服务器这种方式。同步的命令最常见的就是下面这样:
rsync -avz --progress --delete rsync://[email protected].211.55.11/test/ rsynctarget/
其中rsynctest是我同步的用户名,10.211.55.11是我的rsync服务器的ip。运行命令然后输入密码就行了。如果不想每次都输入密码,可以加上参数--password-file=/etc/rsyncd.secrets
,其中rsyncd.secrets是你rsync客户端机器上的文件,权限也要600,内容格式跟rsync服务器的不一样,这里只需要密码testpasswd即可。–progress显示同步的进度,–delete则是删除rsynctarget中多余的文件。
这几个选项avz很常用,其中v是verbose,z是压缩,a相当于rlptgoD,其中r是递归同步目录,如果不加-r而是用-d,则只会同步对应的目录,而不会同步目录下面的文件;l同步符号链接,p同步文件保持权限不变,t保持文件时间,g保持文件所属组,o保持文件所属用户,D保持设备文件。一般情况用avz就可以了。另外还有个选项-P也会常用,表示保持部分同步的文件,如果同步中断,可以续传。
另外有个地方要注意下,就是在同步一个子目录的时候,比如我同步rsynctest/testdir这个目录,如果命令是这样rsync -avz rsync://[email protected]/test/testdir rsynctarget/
,因为testdir后面没有加”/”,则同步结果就是rsynctarget目录下面会有一个testdir目录,即rsynctarget/testdir这样。如果命令是`rsync -avz rsync://[email protected]/test/testdir/ rsynctarget/
,那结果就是把testdir目录下面的文件全部同步到rsynctarget目录下,rsynctarget目录下面不会有testdir这个目录。
4.实例
为了方便,我建了个目录用来做rsync测试。目录rsynctest中的内容如下:
root@ubuntu:/home/ssj/rsynctest# ls -la
total 20
drwxr-xr-x 3 nobody nogroup 4096 Mar 7 16:33 .
drwxr-xr-x 28 ssj ssj 4096 Mar 7 16:13 ..
-rw-r--r-- 2 nobody nogroup 13 Mar 7 16:32 link.txt
lrwxrwxrwx 1 nobody nogroup 12 Mar 7 15:13 outer.txt -> ../outer.txt
lrwxrwxrwx 1 nobody nogroup 8 Mar 7 14:52 softlink.txt -> test.txt
drwxr-xr-x 2 nobody nogroup 4096 Mar 7 14:51 testdir
-rw-r--r-- 2 nobody nogroup 13 Mar 7 16:32 test.txt
其中softlink.txt是test.txt的符号链接,link.txt是test.txt的硬链接,而outer.txt是上一级目录的outer.txt的硬链接。
同步的目标目录rsynctarget的内容如下:
[email protected]-mbp ssj#ls -la rsynctarget/
total 8
drwxr-xr-x 3 65534 65534 102 3 7 17:15 .
drwxr-xr-x@ 94 ssj staff 3196 3 6 23:38 ..
-rw-r--r-- 1 root 65534 7 3 7 17:15 myfile.txt
采用不同的参数,同步的结果会不一样。
1)不用-a参数,也不用-og等,命令如下:
rsync -rpvz --progress --delete rsync://[email protected].211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets
由于用了–delete,则原来rsynctarget中的myfile.txt会被删除,由于没有加-l,则符号链接文件outer.txt和softlink.txt没有同步过来。同步后,硬链接test.txt被当做一个新文件了,没有保留硬链接关系,如果要保留,需要加上-H选项。此外,文件所有者也不是原来的nobody:nogroup了,如果需要保留,要加-og参数。该命令同步后,rsynctarget目录内容如下:
root@ubuntu:/home/ssj# ls -la rsynctarget/
total 20
drwxr-xr-x 3 root root 4096 Mar 7 17:31 .
drwxr-xr-x 29 ssj ssj 4096 Mar 7 17:31 ..
-rw-r--r-- 1 root root 13 Mar 7 17:31 link.txt
drwxr-xr-x 2 root root 4096 Mar 7 17:31 testdir
-rw-r--r-- 1 root root 13 Mar 7 17:31 test.txt
2)采用-a参数。命令如下:
rsync -avz --progress --delete rsync://[email protected].211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets
同步后rsynctarget目录内容如下,可以看到使用-a后,文件所有者都得到保留,软连接也同步过来了,不过硬链接关系没有保留。要保留的话,加上-H。
[email protected]:/home/ssj# ls -la rsynctarget/
total 20
drwxr-xr-x 3 nobody nogroup 4096 Mar 7 16:33 .
drwxr-xr-x 29 ssj ssj 4096 Mar 7 17:31 ..
-rw-r--r-- 1 nobody nogroup 13 Mar 7 16:32 link.txt
lrwxrwxrwx 1 nobody nogroup 12 Mar 7 15:13 outer.txt -> ../outer.txt
lrwxrwxrwx 1 nobody nogroup 8 Mar 7 14:52 softlink.txt -> test.txt
drwxr-xr-x 2 nobody nogroup 4096 Mar 7 14:51 testdir
-rw-r--r-- 1 nobody nogroup 13 Mar 7 16:32 test.txt
3)另外还有一个重要参数就是-P,注意这个P不是progress的意思,他是partial的意思,就是说同步过程如果出现中断(比如主动停止了同步或者网络问题导致同步中断),如果一个文件没有传完,是否保留这些已经传输的部分就是由-P来控制。这里我在rsynctest目录下面加了一个test.tar.gz文件,大小为2M,而我用bwlimit参数限制传输速度为10K/s以内,这样,中途终止同步,这样可以看到,如果没有加-P参数的时候,rsynctarget没有保存tornado.tar.gz这个文件已经传输的部分的,如果加了-P则会保存已经传输的部分,文件名也是tornado.tar.gz,下次重传会断点续传,即已经同步的部分不会重新传。同步过程中临时文件名是.tornado.tar.gz.qesuQR这样的格式。如果有程序是从同步目录取数据并处理的,最好不要用-P参数,因为如果网络问题会导致文件传了一部分,然后被处理了,这样会影响处理结果。
rsync -avzP --progress --delete --bwlimit=10 rsync://[email protected].211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets