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: [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日).