rsync是Linux系统下最具代表性的数据备份工具,它具有以下特点:
rsync
命令的格式是:rsync [OPTION]... SRC DEST
;其中,SRC和DEST既可以取本地目录/文件,也可以取远程目录/文件,如rsync [OPTION]... SRC [USER@]HOST:DEST
或rsync [OPTION]... SRC [USER@]HOST::DEST
。
SRC可以由多个文件组成,以此来实现一次性指定同步多个文件:rsync [OPTION]... SRC1 SRC2 SRC3 DEST
。
-rlptgoD
,这是最常用的参数。另外,为灵活起见,-a
后可跟一个--no-OPTION
来表示关闭-rlptgoD
中的任意一个参数,比如-a--no-l
等同于-rptgoD
。-V
的效果)。虽然rsync可以在本地的两个目录中进行同步,但其实rsync更常见的应用场景应该是在两台机器中进行远程同步(不论是通过局域网还是互联网)。
其命令格式(注意是只有一个冒号)如下:
rsync [OPTION]... SRC [USER@]HOST:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
在输入命令后,接下来的事情其实跟openssh的反馈十分类似:如没有通过密钥认证,则需要输入密码进行认证。认证通过后,接下来的rsync执行结果就跟在本地同步操作的没有两样了。
这种方式的原理是在远程服务器上建立rsync服务器,并将本机看成是rsync客户端,这样我们就可以利用rsync客户端远程连接(via TCP)rsync服务器进行远程同步的操作了。
下面我们分服务器端和客户端两个部分来解释通过rsync后台服务(rsyncd)的方式进行远程同步的整个过程。
启动rsync后台服务rsyncd前,我们需要先准备一份rsyncd的配置文件——/etc/rsyncd.conf
,该配置可控制rsync的权限、可操作范围、日志、可用模块等方方面面的内容。
配置文件由两个部分组成:全局变量和模块变量,但你也可以把模块变量写在全局变量里,作为模块变量的一份默认值。
下面列出一些常用的变量,具体的变量列表请查询官方文档。
path=/home/%RSYNC_USER_NAME%
,则当连接服务器端的rsync用户名为test时,该模块的根目录就自动设置为/home/test
,但为了安全起见,不推荐这么干。chroot
到path参数所指定的目录下,这样做可以获得额外的安全防护;但是缺点是需要以root权限来启动rsyncd,并且,如果同步的内容里有软连接指向模块根目录以外的文件,则不能实现同步。uid=root;gid=root
。rsync
命令里也有对应的可选参数,但在服务器端设置的话,更具有强制性和隐蔽性(在客户端访问的时候,只会反馈”不存在”,而非”不允许访问”)。@
以区分开用户名),这个方式是依托于Linux系统的,因此客户端连接使用的用户名以及此处指定的用户组都必须是真实存在于Linux系统中。多个对象可用空格或逗号进行分隔(推荐使用逗号,因为如果使用空格来分隔,那么在用户名/组名中带有空格的情况下,会造成混淆)。另外可以使用参数deny
/ro
(read only)/rw
(read write)来具体控制某个用户或某个组的访问权限,如:auth users = , joe:deny, @Some Group:deny, admin:rw, @RO Group:ro
。用户名:用户密码
或@用户组名:用户组公共密码
的文件,该参数是auth users
参数的配套,仅在已设置auth users
参数的情况下生效,且没有默认值。另外,即使你在auth users
参数中指定了用户组作为对象,也不一定要在本文件中声明@用户组名:用户组公共密码
,完全可以罗列出用户组中所有用户的用户名:用户密码
来满足需求。secrits file
参数所对应的文件,其文件系统权限必须设定为600。这里给出一份参考的rsyncd配置文件:
port=873
log file=/var/log/rsync.log
pid file=/var/run/rsyncd.pid
[test]
path=/root/rsync/test
use chroot=false
max connections=0 # no limitation
read only=false
list=true
uid=root
gid=root
auth users=rsyncuser
secrets file=/etc/rsyncd.passwd
启动方式有以下两种:
rsync --daemon --config=/etc/rsyncd.conf
。为保证rsyncd的可用性(比如在系统异常重启后依然可用),需要把rsyncd设置为开机自启,具体方法请查询chkconfig
或systemd
。
在这种方式下的命令格式稍有区别:rsync [OPTION]... RSYNCUSER@HOST::[MODULE[/SRC]] DEST
。多个对象的命令也有所区别:rsync [OPTION]... RSYNCUSER@HOST::[MODULE1[/SRC1]] ::[MODULE2[/SRC2]] ::[MODULE3[/SRC3]] DEST
若rsyncd设置了auth users
,那么客户端在连接的时候就需要提供相应rsync用户的密码了:
rsync [OPTION]... RSYNCUSER@HOST::[MODULE[/SRC]] DEST
命令,接下来会提示需要输入密码。
# cat /etc/rsyncd.passwd
test123
需求假设是这样的:
如果我们用crond轮询来启动rsync发起同步,不仅实时性得不到保证,另外也很可能造成资源的浪费。
那么,就有了下面这套方案: