rsync
rsync是Unix下的一款应用软件,它能同步更新两处计算机的檔案與目錄,並適當利用差分編碼以減少数据傳輸量。rsync中的一項同类软件不常见的重要特性是每個目標的镜像只需傳送一次。rsync可以拷貝/顯示目錄內容,以及拷貝檔案,並可選壓縮以及遞歸拷貝。
原作者 | 安德魯·垂鳩(Andrew Tridgell)與保羅·麥可拉斯(Paul Mackerras) |
---|---|
開發者 | 韋恩·大衛森(Wayne Davison) |
首次发布 | 1996年6月19日[1] |
当前版本 | 3.2.7(2022年10月20日 | )
源代码库 | |
编程语言 | C |
平台 | 跨平臺 |
类型 | 数据传输、差分備份 |
许可协议 | GNU GPLv3 |
网站 | 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: cola-liw-835153950-21793-0@liw.clinet.fi. (原始内容存档于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]. <cola-liw-835153950-21793-0@liw.clinet.fi>#1/1. (原始内容存档于2011-11-08).
- ^ Davison, Wayne. Rsync 3.0.0 released. rsync-announce (邮件列表). 2008年3月1日 [2008年10月24日]. (原始内容存档于2009年8月15日).