详解rsync 命令

什么是 RsyncRsync(remote synchronize)是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件 。Rsync 使用所谓的 “Rsync 算法” 来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快 。
Rsync 本来是用于替代 rcp 的一个工具,目前由 rsync.samba.org 维护,所以 rsync.conf 文件的格式类似于 Samba 的 主配置文件 。Rsync 可以通过 rsh 或 ssh 使用,也能以 daemon 模式去运行,在以 daemon 方式运行时 Rsync server 会打开一个 873 端口,等待客户端去连接 。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输 。第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份 。
Rsync 支持大多数的类 Unix 系统,无论是 linux、Solaris 还是 BSD 上都经过了良好的测试 。此外,它在 windows 平台下也有相应的版本,如 cwRsync 和 Sync2NAS 等工具 。
Rsync 的基本特点如下:

  1. 可以镜像保存整个目录树和文件系统;
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等;
  3. 无须特殊权限即可安装;
  4. 优化的流程,文件传输效率高;
  5. 可以使用 rsh、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接;
  6. 支持匿名传输 。
Rsync 同步算法Rsync 只所以同步文件的速度相当快,是因为 “Rsync 同步算法” 能在很短的时间内计算出需要备份的数据,关于 Rsync 的同步算法描述如下:
假定在 1 号和 2 号两台计算机之间同步相似的文件 A 与 B,其中 1 号对文件 A 拥有访问权,2 号对文件 B 拥有访问权 。并且假定主机 1 号与 2 号之间的网络带宽很小 。那么 rsync 算法将通过下面的五个步骤来完成:
  1. 2 号将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块,最后一块可能会比 S 小 。
  2. 2 号对每一个分割好的数据块执行两种校验:一种是 32 位的滚动弱校验,另一种是 128 位的 MD4 强校验
  3. 2 号将这些校验结果发给 1 号 。
  4. 1 号通过搜索文件 A 的所有大小为 S 的数据块 (偏移量可以任选,不一定非要是 S 的倍数),来寻找与文件 B 的某一块有着相同的弱校验码和强校验码的数据块 。这项工作可以借助滚动校验的特性很快完成 。
  5. 1 号发给 2 号一串指令来生成文件 A 在 2 号上的备份 。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的 。
Rsync 参数说明配置文件:rsyncd.conf
全局参数
在文件中,[module]之前的所有参数都是全局参数,当然也可以在全局参数部分定义模块参数,这时候该参数的值就是所有模块的默认值 。
port指定后台程序使用的端口号,默认为 873 。
motd file用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认是没有 motd 文件的 。
log file指定 rsync 的日志文件,而不将日志发送给 syslog 。比如可指定为 “/var/log/rsyncd.log” 。
pid file指定 rsync 的 pid 文件,通常指定为 “/var/run/rsyncd.pid” 。
syslog facility指定 rsync 发送日志消息给 syslog 时的消息级别,常见的消息级别是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6 和 local7 。默认值是 daemon 。
模块参数
主要是定义服务器哪个目录要被同步 。其格式必须为 “[module]” 形式,这个名字就是在 rsync 客户端看到的名字,其实有点象 Samba 服务器提供的共享名 。而服务器真正同步的数据是通过 path 来指定的 。我们可以根据自己的需要,来指定多个模块,模块中可以定义以下参数:
comment给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户 。默认没有描述定义 。
path指定该模块的供备份的目录树路径,该参数是必须指定的 。
use chroot如果指定为 true,那么 rsync 在传输文件以前首先 chroot 到 path 参数所指定的目录下 。这样做的原因是实现额外的安全防护,但是缺点是需要以 root 权限,并且不能备份指向外部的符号连接所指向的目录文件 。默认值为 true 。
uid指定当该模块传输文件时守护进程应该具有的 uid,配合 gid 选项使用可以确定哪些可以访问怎么样的文件权限,默认值是”nobody” 。


推荐阅读