rsync
原作者 | 安德鲁·垂鸠(Andrew Tridgell)与保罗·麦可拉斯(Paul Mackerras) |
---|---|
开发者 | 韦恩·大卫森(Wayne Davison) |
首次发布 | 1996年6月19日[1] |
当前版本 | 3.2.7(2022年10月20日 | )
源代码库 | |
编程语言 | C |
平台 | 跨平台 |
类型 | 数据传输、差分备份 |
许可协议 | GNU GPLv3 |
网站 | rsync |
rsync是Unix下的一款应用软件,它能同步更新两处计算机的档案与目录,并适当利用差分编码以减少数据传输量。rsync中的一项同类软件不常见的重要特性是每个目标的镜像只需传送一次。rsync可以拷贝/显示目录内容,以及拷贝档案,并可选压缩以及递归拷贝。
在常驻模式(daemon mode)下,rsync预设监听TCP埠873,以原生rsync传输协定或者透过远端shell如RSH或者SSH提供档案。SSH模式下,rsync用户端执行程式必须同时在本地和远端机器上安装。
rsync是以GNU通用公共许可证发行的自由软件。
演算法
[编辑]确定要发送哪些文件
[编辑]默认情况下,rsync通过检查每个文件的修改时间和大小来确定哪些文件在发送和接收系统之间存在差异。如果时间或大小在两个系统之间不同,它就把文件从发送系统转移到接收系统。由于只需要读取文件目录信息,这个过程很快,但会错过某些罕见的修改,碰巧这两者都没有改变。[2]
如果用--checksum调用,Rsync会执行一个较慢但全面的检查。这将强制对两个系统上的每个文件进行全面的校验和比较。除了罕见的校验和碰撞之外,可以避免遗漏已更改文件的风险。
确定文件的哪些部分有改变
[编辑]rsync实用程序使用由澳洲电脑程式师安德鲁·垂鸠(Andrew Tridgell)发明的演算法,在当接受端电脑已经有相同结构(例如档案)但不同版本时,有效的将结构传输过通讯连线。在他1999年的博士论文《Efficient Algorithms for Sorting and Synchronization》[3]中,详细介绍了rsync的设计、实现与性能。
接受端将档案拷贝打散成固定大小为的不重叠片段,并对每个片段计算两个校验和:MD4散列函数与一个较弱的旋转哈希。它将这些校验和送给发送者。通讯协议版本30(与rsync版本3.0.0一并发行)现在使用MD5散列函数以替代MD4。[4]
发送者对位于其版本的档案中每个大小为的片段计算轮替校验和,即使是重叠的片段。这可被有效的计算透过特别知识产权的轮替校验和算法:如果位元到的轮替校验和是,从位元到的轮替校验和可从,位元,以及位元计算出而不需要真正去检验中间的位元。因此,如果位元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[5]。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)。[6]
rsync 3.0于2008年3月1日发行。[7]
参见
[编辑]参考资料
[编辑]- ^ Tridgell, Andrew. First release of rsync - rcp replacement. Newsgroup: comp.os.linux.announce. 19 June 1996 [2007-07-19]. Usenet: [email protected]. (原始内容存档于2011-11-08).
- ^ rsync(1) - Linux man page. [2022-08-06]. (原始内容存档于2017-01-01).
- ^ Tridgell, Andrew; Efficient Algorithms for Sorting and Synchronization, February 1999, retrieved 29 September 2009
- ^ 存档副本. [2008-10-24]. (原始内容存档于2008-03-20).
- ^ 如在README (页面存档备份,存于互联网档案馆)所述
- ^ Tridgell, Andrew. First release of rsync - rcp replacement. Newsgroup: comp.os.linux.announce. 1996年6月19日 [2007-07-19]. <[email protected]>#1/1. (原始内容存档于2011-11-08).
- ^ Davison, Wayne. Rsync 3.0.0 released. rsync-announce (邮件列表). 2008年3月1日 [2008年10月24日]. (原始内容存档于2009年8月15日).