rsync是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。它使用所谓的“Rsync演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。所以通常可以作为备份工具来使用。
运行Rsync server的机器也叫backup server,一个Rsync server可同时备份多个client的数据;也可以多个Rsync server备份一个client的数据。Rsync可以搭配ssh甚至使用daemon模式。Rsync server会打开一个873的服务通道(port),等待对方rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
基本特点:
命令语法:
rsync的命令格式可以为以下六种:
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]
对应于以上六种命令格式,我们可以总结rsync有2种不同的工作模式:
rsync --daemon
使用独立进程的方式,或者通过xinetd超级进程来管理rsync后台进程。当rsync作为daemon运行时,它需要一个用户身份。如果你希望启用chroot,则必须以root的身份来运行daemon,监听端口,或设定文件属主;如果不启用chroot,也可以不使用root用户来运行daemon,但该用户必须对相应的模块拥有读写数据、日志和lock file的权限。当rsync以daemon模式运行时,它还需要一个配置文件——rsyncd.conf。修改这个配置后不必重启rsync daemon,因为每一次的client连接都会去重新读取该文件。
我们一般把DEST远程服务器端成为rsync Server,运行rsync命令的一端SRC称为Client。
# rsync -auvrtzopgP --progress /root/ /tmp/rsync_bak/
会看到从/root/
传输文件到/tmp/rsync_bak/
的列表和速率,再运行一次会看到sending incremental file list下没有复制的内容,可以在/root/下touch
某一个文件再运行看到只同步了修改过的文件。
上面需要考虑以下问题:
--delete
选项 在服务器间rsync传输文件,需要有一个是开着rsync的服务,而这一服务需要两个配置文件,说明当前运行的用户名和用户组,这个用户名和用户组在改变文件权限和相关内容的时候有用,否则有时候会出现提示权限问题。配置文件也说明了模块、模块化管理服务的安全性,每个模块的名称都是自己定义的,可以添加用户名密码验证,也可以验证IP,设置目录是否可写等,不同模块用于同步不同需求的目录。
** /etc/rsyncd.conf: **
5 # configuration example:
6
7 uid = root //设置运行rsync 进程的用户
8 gid = root
9 use chroot = no
10 max connections = 4
11 # pid file = /var/run/rsyncd.pid
12 exclude = lost+found/
13 transfer logging = yes
14 timeout = 900
15 ignore nonreadable = yes //同步时跳过没有权限的目录
16 # dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
17
18 # [ftp]
19 # path = /home/ftp
20 # comment = ftp export area
21 [module_test] //此名字即客户端使用rsync来同步的路径
22 path=/temp/ //实际需要同步的路径
23 comment=rsync test logs
24 auth user=root //客户端获取文件的身份此用户并不是本机中确实存在的用户
25 secrets file=/etc/rsync.secrets //用来认证客户端的秘钥文件 格式 USERNAME:PASSWD 权限改为600
26 read only=no
27 write only=no
28 list=no
29 host allow=* //允许所有主机访问
这里配置socket方式传输文件,端口873,[module_test]开始定义一个模块,指定要同步的目录(接收)path,授权用户,密码文件,允许哪台服务器IP同步(发送)等。
** /etc/rsyncd.secrets: **
sean:password
单向同步时,客户端只需要一个包含密码的文件。
vim /etc/rsync_client.pwd:
password
chmod 600 /etc/rsync_client.pwd
命令:
将本地/root/
目录同步到远程172.29.88.223的/tmp/rsync_bak2目录(module_test指定):
/usr/bin/rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd /tmp/ rsyncuser@172.16.250.200::module_test
当然你也可以将远程的/tmp/rsync_bak2目录同步到本地目录/root/tmp:
/usr/bin/rsync -auvrtzopgP --progress --password-file=/etc/rsync_client.pwd [email protected]::module_test /tmp/
从上面两个命令可以看到,其实这里的服务器与客户端的概念是很模糊的,rsync daemon都运行在远程172.29.88.223上,第一条命令是本地主动推送目录到远程,远程服务器是用来备份的;第二条命令是本地主动向远程索取文件,本地服务器用来备份,也可以认为是本地服务器恢复的一个过程。
借鉴https://segmentfault.com/a/1190000002427568