Mac OS X:更新rsync到最新版本
Tech Level 3 History: July 17, 2009: 若幹處修辭的修改. 添加了和TimeMachine的比較部分.
rsync簡介
rsync是開放許可GPL開放源碼的增量資料傳輸/同步指令行工具。它采用快速算法,隻把遠端檔案和本地檔案不同的部分傳輸,進而得到本地和遠端資料同步。作為系統管理者的一個難以置信好用的工具,它已經被接受和使用了好長時間了。
它的特點是:可以傳輸檔案/檔案夾/目錄樹/甚至是整個系統;可以保留符号連接配接/權限/硬連接配接/檔案屬性/裝置等;可以是用ssh/rsh等用于傳導;支援用于鏡象操作的匿名傳輸等等。
它在類Unix系統中廣泛存在和應用,這裡引用目前最新版本3.0.6的安裝使用,因為它的更新很快,是以請持續關注/更新。了解更多的詳細資訊,到它的官方網站http://samba.org/rsync/。
在Mac系統上的rsync
我目前的Mac OS X Leopard是10.5.7版本,它本身所帶的rsync版本是2.6.9,在3.0.5之前的版本耗費更多的記憶體處理檔案,并且對沒有修改的 resource forks也會傳輸,更緻命的是有可能在處理極多數量檔案(不是大檔案)的時候造成記憶體溢出的錯誤, 是以如果你沒有更新,那麼應該按照下面的方法更新。
rsync的版本更新
這裡涉及很多指令行,是以适合于熟悉Terminal的技術人員.
1. 下載下傳最新版本:
你可以使用浏覽器到rsync的官方下載下傳網站下載下傳源程式:http://samba.org/ftp/rsync/ . 也可以使用下面的指令行來下載下傳, 其中主要有兩個gz檔案:
$ mkdir -p /Users/Shared/rsync $ cd /Users/Shared/rsync $ curl -O http://http://samba.org/ftp/rsync/rsync-3.0.6.tar.gz $ curl -O http://http://samba.org/ftp/rsync/rsync-patches-3.0.6.tar.gz |
假設這些下載下傳的檔案儲存在/Users/Shared/rsync/目錄中, 後面我們也将工作在這個目錄中.
2. 展開tar.gz檔案:
使用下面指令解壓縮,或者是用Archive Utility.app來解壓縮:
$ tar -xzvf rsync-3.0.6.tar.gz $ tar -xzvf rsync-patches-3.0.6.tar.gz |
在/Users/Shared/目錄中将出現rsync-3.0.6的檔案夾。
3. 編譯安裝:
用下面的指令來打更新檔保留Mac OS X的中繼資料
$ patch -p1 <patches/fileflags.diff $ patch -p1 <patches/crtimes.diff |
配置編譯并安裝
$ ./prepare-source $ ./configure $ make $ sudo make install |
4. 版本驗證
$ /usr/local/bin/rsync --version |
應該輸出如下:
rsync version 3.0.6 protocol version 30 Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others. Web site: http://rsync.samba.org/ Capabilities: 64-bit files, 32-bit inums, 32-bit timestamps, 64-bit long ints, socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append, ACLs, xattrs, iconv, symtimes, file-flags rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions. See the GNU General Public Licence for details. |
注意, rsync自動安裝到/usr/local/bin/目錄中, 而Mac OS X自帶的rsync版本在/usr/bin/目錄中,你可以添加路徑或者将新版本的移動到/usr/bin/目錄中.
5. 清理
這時候已經用不着儲存這些下載下傳檔案和源程式了,删除他們:
$ rm -fr /Users/Shared/rsync $ sudo rm /usr/share/man/man1/rsync.1.gz |
因為最後的安裝腳本沒有考慮到需要删除原來Mac OS X自帶的rsync.1 man檔案,是以上面腳本的最後一行删除了舊版本的man檔案。
指令解釋
1. 基本形式
它的指令行的基本形式是:
rsync [OPTIONS] SRC [SRC]... DEST
其中
[OPTIONS]是參數
SRC [SRC]... 可以指定多個檔案源
DEST 最後一個參數指定目的地
當然檔案源SRC和目的地DEST可以是本地,可以是其它主機,可以是rsync服務程式位址等.
2. 常用參數:
-a:這個參數基本上包括了多數情況需要的複制選項,它等于選項-rlptgoD,
-r 所有子目錄,
-l 複制符号連接配接
-t 保留檔案修改日期
-g 保留group屬性
-o 保留擁有者屬性
-D 複制裝置和特殊檔案
-p 保留權限屬性
-A, --acls:複制檔案的ACLs
-N, --crtimes :保留生成日期屬性
-X, --xattrs: 保留擴充屬性(extended attributes)
--fileflags:複制檔案的狀态标志(Mac OS X使用)
--force-change: 取消目的地的檔案和目錄的系統和使用者的immutable标志
{上面這些尤其對Mac OS X檔案系統重要}
-H, --hard-links:複制硬連接配接
-q, --quiet:安靜模式,不輸出資訊
-x, --one-file-system: 禁止複制跨檔案系統的檔案
-s, --protect-args: 不分析檔案名,直接拷貝他們
3. 應用場景參數
下面根據不同的應用場景做解釋
- 對于更新大檔案可以使用--inplace選項,預設的是複制新檔案,在确認複制完畢後,在删除原來舊的已經存在的檔案,這樣對于大檔案,基于空間的考慮,可能造成備份的錯誤。
- 有的情況是隻需要更新已經存在的檔案,那麼使用--existing, --ignore-non-existing選項
- 如果是移動而不是備份,可以是用--remove-source-files删除源檔案
- 有的時候可能需要備份制定的檔案,指定的檔案在一個檔案清單中,那麼可以是用參數:--files-from=FILE
- 增量複制的時候,可以指定完全備份和其它增量備份的路徑,這樣本次的增量備份,隻備份以前以來改變的檔案,選項參數為:--compare-dest=DIR
- 壓縮傳輸,這樣資料被壓縮後傳輸,适用于低速網絡,-z, --compress
-
測試使用:
-n, --dry-run:這個參數隻是模拟備份過程,而不是實際傳輸資料
-v,--vverbose:顯示備份過程
-i, --itemize-changes:輸出一個檔案變化彙總。
--progress: 顯示備份位元組數,百分比,傳輸速度等資訊
更多的參數和使用細則可以參考:
- 使用rsync -h或者man rsync檢視幫助資訊。
- rsync指令的網上幫助:http://samba.org/ftp/rsync/rsync.html
- rsync作為伺服程式的線上幫助:http://samba.org/ftp/rsync/rsyncd.conf.html
應用執行個體:
1. 簡單的在一個主機上的資料備份:
比如将/Users/Shared目錄複制到/Users/Shared.Backup
$ /usr/local/bin/rsync -aANHXxs --progress /Users/Shared/ /Users/Shared.Backup/ |
2. 複制整個Mac OS X系統到另外一台機器的目錄中:
假設遠端機器和目錄是:remote_address:/Volumes/Backup/, 使用者使用root
$ /usr/local/bin/rsync -aNHAXx --protect-args --fileflags --force-change --rsync-path="/usr/local/bin/rsync" / [email protected]_address:/Volumes/Backup/ |
3. 使用ssh避免在遠端機上的認證過程:
下面假設使用root使用者作為遠端複制的使用者.
首先檢查目前是否已經存在認證鑰匙對:
$ sudo ls -la /var/root/.ssh |
如果有兩個檔案存在:id_dsa和id_dsa.pub, 如果不存在則運作下面的指令來生成
$ sudo ssh-keygen -t dsa -f /private/var/root/.ssh/id_dsa -C "this is for rsync over ssh" |
而id_dsa是私有鑰匙,id_dsa.pub是公開鑰匙.
現在就把id_dsa.pub公開鑰匙添加到遠端目标機上的"/var/root/.ssh/authorized_keys"中, 也可以用下面的指令添加:
$ sudo cat /private/var/root/.ssh/id_dsa.pub | ssh [email protected]_address 'cat - >> ~/.ssh/authorized_keys' |
完成上面的步驟兩個機器就可以使用root使用者互相信任了。
4. 使用Launchd來實作自動備份<待後續>
比較: rsync和Apple的Time Machine
大家不免要想到好多其它的備份軟體,其中對于普通Mac OS X Leopard使用者來說,當然要說是蘋果開發随Mac OS X Leopard釋出的"時間機器"(Time Machine)了.
有了時間機器還用rsync類似的第三方的備份/同步軟體嗎?
我說,對于普通使用者,時間機器提供了功能強大穩定的使用者資料備份功能,而且是在最少的使用者幹預情況下(使用者到System Preferences裡面,撥動那個開關就可以打開或者關閉它,然後就讓它自己工作了),這對于普通使用者的使用感受來說,簡直是美妙極了。相比較上面的 一大堆"非人性化的惡夢般的"參數,我很佩服時間機器的開發人員對于使用者需求的高度概括抽象能力和人性化的表達能力以及付諸實施的執行力,這方面微軟的備 份和恢複功能,對于使用者來說多少有點複雜和不夠人性化了。
但是對于企業使用者,或者說企業的系統管理者來說,那簡直像一個玩具,無法達到企業備份需求.
當然了,時間機器并不是不可能在企業應用中使用,它作為一種使用者個人輔助備份選擇,同樣可以發揮自己的桌面備份作用,至少是一個選項。
而rsync不僅提供了強大的功能,而且使用者可以進行再次開發,或者給于GUI的包裝,改進使用者的使用體驗,它很好地支援網絡使用者的需求,也給于了管理者 很多自由度以及對于細節的控制。結合其它的技術,可以實作完全/增量備份,定時備份,遠端備份恢複,使用者資料同步,可以利用rsync service而對遠端資料操作等等操作.
注釋:
這裡的指令行都以$為開始,用來标示後面是使用者輸入的指令的内容,使用者輸入指令的時候隻輸入後面的指令部分;有可能因為排版問題,指令會自動換行。