rsync
作者:帕胡德<pahud@linuxer.nu>
日期:2000/2/23
HTML Edition: http://www.linux.org.tw/~pahud/rsync.html
Palm Edition: http://www.linux.org.tw/~pahud/rsyncpalm.pdb
Copyright: 本文版權為作者所有,轉載必須經由作者同意
Last Modified: Feb 28,2000
![]()
實務篇
安裝
| 基本指令
|
rsync與ssh的結合
| 更新網頁原始碼
| 更新MandrakeCLE iso檔
|
rsync是一套應用在Unix系統上的檔案傳輸程式,使用獨特演算法能夠將遠端的檔案以飛快的速度同步存入本地端的檔案系統。由於rsync同步檔案只傳輸彼此之間不同的部分內容,因此毋須大費周章將整個檔案透過網路下載回來,是一套非常方便並且節省時間與網路資源的工具。 底下列舉幾個rsync的特色: 能夠更新整個目錄樹以及檔案系統
| 選擇性的保存符號連結、實體連結、檔案權限、裝置以及檔案修改時間
| 不需特殊權限即可安裝
| 可以使用rsh、ssh或直接sockets連線傳輸
| 支援匿名rsync功能,是mirror網站的好工具
| 運作原理 如果您在client端與server端各有兩個相似的檔案A與B,要將B更新至A,最原始的方法不外乎是將B複製成A並且蓋過原來的A檔案。然而,當受限於網路頻寬的時候,舉例來說當使用撥接上網的方式,若要比較有效率達到這樣的結果,聰明的您或許會想到傳輸之前先經過檔案壓縮處理,這樣會節省所花費的時間。的確沒錯,然而倘若今天兩端所需同步的是非常大的檔案,舉例來說:所有網頁備份壓縮起來的.tgz檔甚至製作光碟的iso映象檔,這些檔案大小往往可達數十甚至數百MB,若經由撥接的頻寬完整取回這些檔案,恐怕就必須花費相當多的時間,這時大概只有靠寬頻網路了。 試想,如果有一個機制或是演算法可以比對client與server兩端檔案的不同之處,然後只傳輸不同的檔案內容,這樣就可以大幅減少傳輸所花費的時間,同時達到更新的目的。rsync便是遵循這種模式的傳輸工具。 取得檔案
|
或是就近在國內下載: 當然您也可以下載source自行編譯: 設定rsync server
|
然後在/etc/services加入: 接著我們要決定那個目錄要開放出來提供rsync的下載服務,例如/home/ftp/pub以rsync開放下載的話,則在/etc/rsyncd.conf編輯下面的內容: [ftp] [ftp]以下定義該module的相關設定內容,這時候我們試試看設定是否正確,打下面的指令: 如要列出該module底下的所有檔案可以用這指令: 1. 對anonymous rsync server請求下載: 2. 若有限制帳號密碼的話,則用: 更多指令介紹請參考man page。 ssh(Security Shell)是一套Unix平台上廣受歡迎的安全登入程式,使用強大的加密技術能夠有效並且安全的保護資料的傳遞並且管理遠端主機。rsync與ssh結合不僅能夠保護資料內容的安全性,同時還能夠做最有效率的傳輸,因此普遍用來取代mirror程式或是一般的ftp程式。 舉例來說,一般大型網站會選擇將Web Server以co-location的方式放在ISP機房,自己公司內部的辦公室放置一台相同的Web Server,剛修改過的程式或檔案先用ftp或samba方式傳到公司內部的Web Server上測試完成之後再上傳到ISP機房的那台Web Server。公司內部的檔案傳輸或許安全要求比較小,不過從公司到ISP機房這一段則必須有安全的加密連線方式,如以mirror程式或許可以達成資料更新的要求,但是基本上mirror程式仍是使用ftp protocol,並且沒有安全加密的機制,因此不能符合我們的需要; 愛用SNP tools的朋友可能會鍾愛pftp,但是pftp雖經過安全加密,但基本上還是無法比較checksum之後只傳送檔案更新過的那部分內容。因此rsync+ssh的組合是最符合我們的需求。底下介紹指令語法,使用前請先確定server端與client端都裝了ssh,並且ssh版本必須一致。 SHELL> rsync -azv -e ssh /home/httpd/htdocs www.mysite.com:/home/httpd/htdocs 上面的範例使用ssh 加密方式,透過rsync將本地端的website檔案與server端檔案內容比對之後,送出更新過的部分。值得一提的,這裡指的送出更新過的部分不是指送出整個檔案,假如兩端都有foo.php檔案,而本地端的foo.php修改部分程式碼,這時rsync只會送出修改過的部分,而不是整個foo.php送到server覆蓋上去,因此一個foo.php檔或許有好幾十KB甚至上百KB,但是更新所傳輸的資料可能不到1KB喔! 聰明的您可能也想到了資料庫透過rsync定期同步的方式,以mysql為例,只要將 SHELL> rsync -azv -e ssh www.mysite.com:/usr/local/mysql/var/profile/ /usr/local/mysql/var/profile/ iso檔是用來燒錄光碟的image檔,喜歡下載Linux最新的iso檔燒錄光碟的朋友應該都有這樣的經驗,例如official iso檔更新的速度太快,每次一有新的iso檔release出來就得大費周章從新下載一次這六百多MB的檔案,網路頻寬吃不消,使用TAnet的學生或有T1專線的公司倒是沒感覺,但是使用撥接的朋友或64KB/128KB專線的朋友可就苦不堪言了。這時如果本機端已經有個先前版本的iso檔,使用rsync就可以比對新舊版本的差異,然後輕鬆將本地端舊的iso檔更新成跟server端一模一樣的iso檔。下面的例子教各位如何update MandrakeCLE的iso檔: 假設原本local有個mdk-7.0-JYJ-2000-Feb-18.iso,而目前latest是 mdk-7.0-JYJ-2000-Feb-21.iso,這時候先將local端的Feb-18這檔案改名為與Server端一樣的mdk-7.0-JYJ-2000-Feb-21.iso,當然我們知道其實內容是舊的,這時候使用下面這指令: SHELL> rsync -azv mdk.linux.org.tw::MandrakeCLE-iso/mdk-7.0-JYJ-2000-Feb-21.iso ./ 注意,local端更名後的mdk-7.0-JYJ-2000-Feb-21.iso必須在所在的目錄底下。這時候rsync client會連到mdk.linux.org.tw的rsync server,檢查server端與 client端的iso檔是否一致,一個block一個block檢查,這時候你會發現產生一個 .mdk-7.0-JYJ-2000-Feb-21.iso檔,不要管他,如果block內容不一致的話rsync會修改local端檔案block的內容,因此實際上傳輸的資料並不多,很快的rsync就會幫你更新iso檔了。這時候用md5sum檢查一下,如果OK就成功囉! rsync是一套相當好用的工具,國外越來越多的ftp server同時也提供rsync service,甚至有些檔案非得用rsync方式才能取得。Debian同樣也必須透過pseudo-image kit加上rsync才能做出Debian iso檔,在這頻寬不足的網路時代,懂得使用最小頻寬、最短時間完成最安全的傳輸工作乃是網管人員必須具備的常識,希望藉由本文能夠讓大家認識並且使用rsync工具,並呼籲ftp site的站長們也能多多提供rsync的服務。 [附錄一] TAnet rsync site 1. linuxer.nu 2. mdk.linux.org.tw 如果您的主機已經提供rsync service,歡迎mail給我讓我將貴站台加入附錄裡頭。 [附錄二] rsync首頁 http://rsync.samba.org ssh首頁 http://www.ssh.org |