一、rsync同步工具介绍与使用

rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项
命令语法格式(6种):

rsync [OPTION]... SRC DEST
rsync [OPTION]... SRC [USER@]host:DEST
rsync [OPTION]... [USER@]HOST:SRC DEST
rsync [OPTION]... [USER@]HOST::SRC DEST
rsync [OPTION]... SRC [USER@]HOST::DEST
rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

语法格式说明:

1、拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。如:rsync -a /etc/passwd /tmp/passwd_bak
2、使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。如:rsync -av /etc/passwd 192.168.204.129:/tmp/passwd_bak
3、使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。如:rsync -av 192.168.204.129:/tmp/passwd_bak /etc/passwd
4、从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。如:rsync -av [email protected]::test /etc/passwd
5、从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。如:rsync -av /etc/passwd [email protected]::test tmp/passwd_bak
6、列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。如:rsync -v rsync://192.168.78.192/www

常用选项:

-a :包含-rtplgoD,a选项后面可以跟--no-OPTION这个表示关闭-rlptgoD中的某一个例如 -a--no-l 等同于-rptgoD
-r :同步目录时要加上,类似cp时的-r选项
-v :同步时显示-些信息,让我们知道同步的过程
-l :保留软连接
-L :加上该选项后,同步软连接时会把源文件给同步
-p :保持文件的权限属性
-o :保持文件的属主
-g :保持文件的属组
-D :保持设备文件信息
-t :保持文件的时间属性
--delete :删除DEST中SRC没有的文件
--exclude :过滤指定文件,如--exclude “logs”会把文件名含logs的文件或者目录过滤掉,不同步
-P :显示同步过程,比如速率,比-v更加详细
-u :加上该选项后,如果DEST中的文件比SRC新,则不同步
-z :传输时压缩

更多选项可以man以下,也可参考:http://man.linuxde.net/rsync

实例(常用选项):
在完成实例之前,先做好准备工作准备,建立实验所需要的文件目录等。
rsync同步工具介绍与使用_第1张图片
1、使用-a选项:
rsync同步工具介绍与使用_第2张图片
-a和--no-OPTION一起使用:
rsync同步工具介绍与使用_第3张图片
使用-v选项看来就是方便,上例告诉我们跳过了非普通文件123.txt,其实123.txt是一个软连接文件,如果不使用-l选项则不理会软连接文件的。虽然加上-l选项会把软连接文件给拷贝过去,但是软连接的目标文件却没有拷贝过去,有时候咱们指向拷贝软连接文件所指向的目标文件,那这时候该怎么办呢?
2、使用-L选项:
rsync同步工具介绍与使用_第4张图片
加上 -L 选项就可以把SRC中软连接的目标文件给拷贝到DEST。
3、使用--delete选项:
rsync同步工具介绍与使用_第5张图片
test333/目录并没有删除掉123.txt, 加上--delete 选项之后就删除了。

二、rsync应用实例

1、通过ssh方式同步

这种方式其实就是让用户去登录到远程机器,然后执行rsync的任务。
rsync同步工具介绍与使用_第6张图片
这个把本机的文件目录复制并重命名到192.168.204.129机器上,远程机器需要安装rsync工具,安装命令yum install -y rsync。在远程机上查看是否接收到了:
rsync同步工具介绍与使用_第7张图片

2、通过后台服务的方式同步

这种方式可以理解成这样,在远程主机上建立一个rsync的服务器,在服务器上配置好rsync的各种应用,然后本机作为rsync的一个客户端去连接远程的rsync服务器。下面就介绍一下,如何去配置一台rsync服务器。
在128主机上建立并配置rsync的配置文件/etc/rsync,如下所示样例配置:

## 配置样例 ##
port=873
log file=/var/log/rsync.log
pid file=/var/run/rsyncd.pid
address=192.168.204.128
[test]                #模块的名字
path=/root/rsync
use chroot=true
max connections=4
read only=no
list=true
uid=root
gid=root
auth users=test
secrets file=/etc/rsyncd.passwd
hosts allow=192.168.204.129

参数解释说明:

port :指定在哪个端口启动rsyncd服务,默认是873端口。
log file :指定日志文件。
pid file :指定pid文件,这个文件的作用涉及服务的启动、停止等进程管理操作。
address :指定启动rsyncd服务的IP。假如你的机器有多个IP,就可以指定由其中一个启动rsyncd服务,如果不指定该参数,默认是在全部IP上启动。
[] :指定模块名,里面内容自定义。
path : 指定数据存放的路径。
use chroot true|false : 表示在传输文件前首先chroot到PATH参数所指定的目录下。这样做的原因是实现额外的安全防护,但缺点是需要以roots权限,并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软连接文件,建议设置成false。
max connections :指定最大的连接数,默认是0,即没有限制。
read only ture|false :如果为true,则不能上传到该模块指定的路径下。
list :表示当用户查询该服务器上的可用模块时,该模块是否被列出,设定为true则列出,false则隐藏。
uid/gid :指定传输文件时以哪个用户/组身份传输。
auth users 指定传输时要使用的用户名。
secrets file :指定密码文件,该参数连同上面的参数如果不指定,则不使用密码验证。注意该密码文件的权限一定要是600。用户名:密码
hosts allow :表示被允许连接该模块的主机,可以是IP或者网段,如果是多个,中间用空格隔开。

编辑secrets file,保存后要赋予600权限,如果权限不对,不能完成同步:

[root@zlinux ~]# touch /etc/rsyncd.passwd
[root@zlinux ~]# vim /etc/rsyncd.passwd 

test:test123              //用户名和密码
[root@zlinux ~]# chmod 600 /etc/rsyncd.passwd 
[root@zlinux ~]# rsync --daemon --config=/etc/rsyncd.conf     //启动rsyncd服务
[root@zlinux ~]# cat /var/log/rsync.log 
2018/01/31 17:02:28 [3195] rsyncd version 3.0.9 starting, listening on port 873
[root@zlinux ~]# netstat -lnp |grep rsync
tcp        0      0 192.168.204.128:873     0.0.0.0:*               LISTEN      3195/rsync   

实例:
1、不需要用户名密码就可以同步:

[root@zhulinux-02 ~]# rsync -avL 192.168.204.128::test/test111 /tmp/test123
receiving incremental file list
created directory /tmp/test123
test111/
test111/123.txt
test111/456.txt
test111/dnsmasq.conf
test111/test222/
test111/test222/123.txt

sent 110 bytes  received 5416831 bytes  3611294.00 bytes/sec
total size is 5415850  speedup is 1.00

2、当设置了auth users和secrets file后,客户端连服务端也需要用用户名密码了,若想在命令行中带上密码,可以在客户端机器(192.168.204.129)设定一个密码文件,比如/etc/passwd_rsync,并在里面写入密码即可

[root@zhulinux-02 ~]# rsync -avP --password-file=/etc/passwd_rsync [email protected]::test/test111/ /tmp/test123/
receiving incremental file list
created directory /tmp/test123
./
123.txt
     1796879 100%   45.10MB/s    0:00:00 (xfer#1, to-check=4/6)
456.txt
     1796879 100%   21.97MB/s    0:00:00 (xfer#2, to-check=3/6)
dnsmasq.conf
       25213 100%  311.67kB/s    0:00:00 (xfer#3, to-check=2/6)
test222/
test222/123.txt
     1796879 100%   16.48MB/s    0:00:00 (xfer#4, to-check=0/6)

sent 137 bytes  received 5416857 bytes  10833988.00 bytes/sec
total size is 5415850  speedup is 1.00

其中/etc/passwd_rsync内容就是一个密码,权限要改为600
如果不要使用密码和用户就可同步:

sed -i 's/auth users/#auth users/;s/secrets file/#secrets file/' /etc/rsyncd.conf

上面的这个命令是把 “auth users” 和 “secrets file” 两行的最前面加一个 “#”, 这样就把这两行注释掉,使其失去意义。在前面学过sed的这种用法,其实也不难弄明白,只是用分号把两个替换的子命令块给替换了而已。
默认以root用户身份登录。