Rsync的使用


工作中需要用到rsync来备份服务器的数据,现在简单介绍一下怎么使用rsync。

用途

a fast, versatile, remote (and local) file-copying tool.

一个快速的,万能的,远程或本地文件拷贝工具。

命令介绍

Local:  rsync [OPTION...] SRC... [DEST]
Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

对于以上命令,rsync有六种不同的工作模式:

  1. 拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。

  2. 使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。

  3. 使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。

  4. 从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。

  5. 从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。

  6. 列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

-v, --verbose #详细模式输出。 
-q, --quiet #精简输出模式。 
-c, --checksum #打开校验开关,强制对文件传输进行校验。 
-a, --archive #归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。 
-r, --recursive #对子目录以递归模式处理。 
-R, --relative #使用相对路径信息。 
-b, --backup #创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。 
--backup-dir #将备份文件(如~filename)存放在在目录下。 
-suffix=SUFFIX #定义备份文件前缀。 
-u, --update #仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。 
-l, --links #保留软链结。 
-L, --copy-links #想对待常规文件一样处理软链结。 
--copy-unsafe-links #仅仅拷贝指向SRC路径目录树以外的链结。 
--safe-links #忽略指向SRC路径目录树以外的链结。 
-H, --hard-links #保留硬链结。 
-p, --perms #保持文件权限。 
-o, --owner #保持文件属主信息。 
-g, --group #保持文件属组信息。 
-D, --devices #保持设备文件信息。 
-t, --times #保持文件时间信息。 
-S, --sparse #对稀疏文件进行特殊处理以节省DST的空间。 
-n, --dry-run #现实哪些文件将被传输。 
-w, --whole-file #拷贝文件,不进行增量检测。 
-x, --one-file-system #不要跨越文件系统边界。 
-B, --block-size=SIZE #检验算法使用的块尺寸,默认是700字节。 
-e, --rsh=command #指定使用rsh、ssh方式进行数据同步。 
--rsync-path=PATH #指定远程服务器上的rsync命令所在路径信息。 
-C, --cvs-exclude #使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件。 
--existing #仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件。 
--delete #删除那些DST中SRC没有的文件。 
--delete-excluded #同样删除接收端那些被该选项指定排除的文件。 
--delete-after #传输结束以后再删除。 
--ignore-errors #及时出现IO错误也进行删除。 
--max-delete=NUM #最多删除NUM个文件。 
--partial #保留那些因故没有完全传输的文件,以是加快随后的再次传输。 
--force #强制删除目录,即使不为空。 
--numeric-ids #不将数字的用户和组id匹配为用户名和组名。 
--timeout=time #ip超时时间,单位为秒。 
-I, --ignore-times #不跳过那些有同样的时间和长度的文件。 
--size-only #当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间。 
--modify-window=NUM #决定文件是否时间相同时使用的时间戳窗口,默认为0。 
-T --temp-dir=DIR #在DIR中创建临时文件。 
--compare-dest=DIR #同样比较DIR中的文件来决定是否需要备份。 
-P #等同于 --partial。 
--progress #显示备份过程。 
-z, --compress #对备份的文件在传输时进行压缩处理。 
--exclude=PATTERN #指定排除不需要传输的文件模式。 
--include=PATTERN #指定不排除而需要传输的文件模式。 
--exclude-from=FILE #排除FILE中指定模式的文件。 
--include-from=FILE #不排除FILE指定模式匹配的文件。 
--version #打印版本信息。 
--address #绑定到特定的地址。 
--config=FILE #指定其他的配置文件,不使用默认的rsyncd.conf文件。 
--port=PORT #指定其他的rsync服务端口。 
--blocking-io #对远程shell使用阻塞IO。 
-stats #给出某些文件的传输状态。 
--progress #在传输时现实传输过程。 
--log-format=formAT #指定日志文件格式。 
--password-file=FILE #从FILE中得到密码。 
--bwlimit=KBPS #限制I/O带宽,KBytes per second。 
-h, --help #显示帮助信息。

服务端配置

如果采用第4,5种工作模式来使用rsync,则需要在服务器上有三个配置文件:rsyncd.conf(主配置文件)、rsyncd.secrets(密码文件)、rsyncd.motd(rysnc服务器信息),这三个配置文件内容如下所示:

#Global Settings
port=873	#运行端口,默认873
uid = root
gid = root
use chroot = no		 #将path目录作为进程的根目录,更安全,但path目录外的链接和相对路径的链接无法备份
#host allow = 		#允许的ip或ip段
motd file = /etc/rsyncd/rsyncd.motd		#rsyncd.motd定义服务器信息
max connections = 20	
log file = /var/log/rsyncd.log		#日志文件
pid file = /var/run/rsyncd.pid		#进程写到该文件中
lock file = /var/run/rsync.lock
[BBS]		#模块
path = /home/apache/htdocs/bbs
read only = yes
ignore errors		#忽略IO错误
list = yes
#exclude = 		#排除/path路径下对应的目录
#[backup]
#path = /home/backup
#read only = yes
#ignore errors
#list = yes

rsync相当于一个网络程序,已经绑定了自己的端口【873】,然后一直等待别人来通信。 可以使用别名这种方式,例如:

rsync -vzrtopgu --password-file=/etc/rsyncd/rsyncd.secrets --progress --delete --exclude 'pre-revprop-change' root@192.168.8.213::BBS /home

本地rsync链接到远程服务器192.168.8.213,然后把别名 BBS 传给远程服务器,服务器通过rsync.conf读取到BBS的配置信息,然后向本地询问用户名和密码,本地通过--password-file得到密码,并将其发给服务器,服务器得到用户名和密码后,读取/etc/rsyncd.secrets进行验证,验证通过后,服务器将数据同步到本地。

[user]:[passwd]	#例如:root:123456
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Welcome to use the http://pm.glodon.com/bbs/ rsync services!
                2016------2017
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

无密码同步

有3种方式进行无密码同步。

  1. rsync原生配置:用到了--password-file参数,需要分别在本地和服务端配置密码文件,rsync进程可自动读取。

  2. 使用ssh-keygen生成一对公钥和私钥,将公钥放在服务端,并写入authorized_keys中。

  3. 使用expect进行rsync同步:定义password变量。

核心算法

官网有对rsync算法的介绍。 这里做一个大概的描述: 现有两台机器a与b,a上有文件A,b上有文件B,且文件A与B非常相似(可能来自同一份源文件,只各自做了少量修改)。则rsync算法由如下若干步骤组成:

  1. b以s个字节为单位,将文件B分割成不重叠的若干块(例如B是1024字节,s是512字节,则B被分割成不重叠的2块)。最后一块可能不到s个字节。

  2. b对每个s字节块都计算两种校验和:32位的弱“滚动”校验和、128位的强MD4校验和。

  3. b将这些校验和发给a。

  4. a逐一搜索A中每个s字节块(因为A中出现不同内容的长度可能是非s整数倍的字节,所以A中每个s字节块的步进偏移量是1),找到与B中某s字节块有同样弱校验和与强校验和的字节块。(a如何找到文件A中与文件B中相同的字节块,这里就不详述了。该步骤是个计算密集的过程。为了提高性能,弱校验和的算法应该仔细设计,以到达单向、快速、计算量小。)

  5. a向b发送一串指令。b根据这些指令同步B文件。这些指令要么是到B某个字节块的引用,要么是数据内容。这些数据内容均是A中与B不同的字节块。

  6. b通过以上步骤,最终同步B文件。