rsync是Unix下的一款应用软件,它能同步更新两处电脑的文件与目录,并适当利用差分编码以减少数据传输量。rsync中的一项同类软件不常见的重要特性是每个目标的镜像只需发送一次。rsync可以拷贝/显示目录内容,以及拷贝文件,并可选压缩以及递归拷贝。
在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输协议或者透过远程shell如RSH或者SSH提供文件。SSH模式下,rsync客户端执行程序必须同时在本地和远程机器上安装。
rsync是以GNU通用公共许可证发行的自由软件。
算法
默认情况下,rsync通过检查每个文件的修改时间和大小来确定哪些文件在发送和接收系统之间存在差异。如果时间或大小在两个系统之间不同,它就把文件从发送系统转移到接收系统。由于只需要读取文件目录资讯,这个过程很快,但会错过某些罕见的修改,碰巧这两者都没有改变。[3]
如果用--checksum调用,Rsync会执行一个较慢但全面的检查。这将强制对两个系统上的每个文件进行全面的校验和比较。除了罕见的校验和碰撞之外,可以避免遗漏已更改文件的风险。
rsync实用程序使用由澳洲计算机程序师安德鲁·垂鸠(Andrew Tridgell)发明的算法,在当接受端电脑已经有相同结构(例如文件)但不同版本时,有效的将结构传输过通讯连线。在他1999年的博士论文《Efficient Algorithms for Sorting and Synchronization》[4]中,详细介绍了rsync的设计、实现与性能。
接受端将文件拷贝打散成固定大小为的不重叠片段,并对每个片段计算两个校验和:MD4散列函数与一个较弱的旋转哈希。它将这些校验和送给发送者。通讯协议版本30(与rsync版本3.0.0一并发行)现在使用MD5散列函数以替代MD4。[5]
发送者对位于其版本的文件中每个大小为的片段计算轮替校验和,即使是重叠的片段。这可被有效的计算透过特别知识产权的轮替校验和算法:如果位元到的轮替校验和是,从位元到的轮替校验和可从,位元,以及位元计算出而不需要真正去检验中间的位元。因此,如果位元1到25的轮替校验和已被算出,那计算位元2到26的轮替校验和可完全依靠之前的校验和与位元1与位元26算出。
rsync使用的旋转哈希来自于马克艾德勒(Mark Adler)的adler-32校验和算法。该算法也被用于zlib,而它本身也基于Fletcher校验算法。
发送者其后以接收者送来的一组轮替校验和比较它自己的轮替校验和以决定是否任何匹配存在。如果是的话,它便透过计算匹配区块的MD4校验和与接受端送来的MD4校验和比较来验证匹配。
发送者稍后发送给接收者不与接收者方任何区块匹配的文件的那些部分,以及如何合并这些区块到接收者版本的组装指令。在实际上,这产生了与发送者端文件一模一样的拷贝。然而,在原则上是可能接收者的拷贝在这一点上不同:这可能发生在当两个文件有不同的区块但有着相同的MD4散列函数与轮替校验和;这种事情发生的几率在现实上极端罕见。
如果发送者与接收者文件版本有许多区段相同,该公用程序只需发送相对小部分的资料以将文件同步。
在rsync算法构成rsync应用程式核心并优化两台电脑间TCP/IP的传输同时,rsync应用程式也支持其他种显著增进文件传输或备份的重要功能。他们包括在发送端与接收端个别利用zlib进行区块区块间压缩解压缩,以及支持通讯协议如ssh。该协议让加密传输兼具压缩与效率,透过rsync算法产生的差分资料变得可能。除ssh以外,stunnel亦可被利用于创造加密通道以保全被传输的资料。
使用
- rsync -avh source destination
rsync的撰写是用来取代rcp与SCP[6]。rsync最早期程序的其中之一是用来实现透过rsync/ssh与标准Unix账号,从多重Unix客户端镜像或者备份到中央Unix伺服器。与如Cron类似的调度应用程式配合,任何人皆可调度介于多台电脑与中央伺服器间自动加密过、基于rsync的镜像备份。
变种
一个叫做rdiff的公用程序利用rsync的算法产生文件A与文件B间不同的差分文件(与公用程序diff类似,不过不同的差分文件格式)。差分文件可稍后被应用到文件A,转成文件B(类似patch公用程序)。
不像diff,产生差分文件的过程有两步:首先产生文件A的签名档,然后这个(相对较小)的签名档与文件B被用来产生差分档。又与diff相异的是,rdiff可适用于二进制文件。
利用rdiff,自由软件作者们写了一个叫做rdiff-backup的公用程序,它可以跨过网络维护位于另一台伺服器某个文件或者目录的备份镜像。rdiff-backup存储备份以及递增的rdiff差分档。这种方式让回溯到任何备份点成为可能。
duplicity是rdiff-backup的一个变种,它利用单一存储服务(像Amazon S3)达成不需要与存储伺服器合作的备份。它透过产生预先产生每个区块的散列函数,将它们加密,并送到伺服器存储,然后当进行递增备份时取回。剩下的资料为满足保全需求也被加密存储。
历史
rsync首度发布于1996年6月19日。原始作者为安德鲁·垂鸠(Andrew Tridgell)与保罗·麦可拉斯(Paul Mackerras)。[7]
rsync 3.0于2008年3月1日发行。[8]
参见
- casync
- Remote Differential Compression
- TCP/UDP端口列表
- CVSup
- Unison (file synchronizer)
- PowerFolder
- Jigdo
- Grsync
- cwRsync