文:小州老師

 

 

講師專長
LINUX SYSTEM
NETWORKING
ADMINISTRATION
UNIX系統管理
UNIX網路管理
UNIX程式設計
C、C++
UNIX SYSTEM PROGRAMMING

講師經歷
聯成電腦專任講師
(RHCE 原廠認證講師)
優士達資訊工程師 
碩誠資訊網管
程式設計師
專業證照
Linux RHCE
Linux LPI-I
Linux LPI-II
NCLP

 

前言:

談到檔案的同步與備份,一般來說 linux 系統都可以簡單透過 cp 命令來備份檔案,不過今天要來介紹一個 rsync 命令,除了可以提供目錄之前同步備份檔案之外,也可以支援網路的連線環境來進行檔案目錄備份傳輸。

談到檔案的複製與備份,傳統一般來說都是使用 cp 的方式來複製進而備份檔案,該方式一般使用上非常的方便。不過在一些特殊需求環境時候,cp 的複製作法會顯得不是非常足夠,尤其同步限制不少。常見問題:

1. 同步兩個目錄內的檔案,只能夠針對時間修改進行比對,無法針對其他項目比對
2. 若是刪除來源檔案時候,目的的檔案不會一併刪除,目的的檔案沒完全同步
3. 複製方式需要重新讀取一份來源檔案覆蓋過目的檔案,效率上比較慢
4. 不支援指定排除特定項目不同步更新
5. 支援先壓縮更新的資料後再傳輸,節省傳輸的資料量
5. 當然,不支援網路傳輸,得透過其他網路工具一起搭配

基於這個問題,使用 rsync 能夠提供更有效率方式來解決。

rsync 程式本身為 samba 該專案計畫的成員所開發,目前已經很廣泛被使用,尤其許多 ftp站台之間同步檔案部份,透過 rsync 能夠用非常有效率方式的完成同步與傳輸。

rsync 程式提供於檔案同步傳輸的架構設計上,提供了一個很獨到的設計演算法,簡單說當要同步目錄之間甚至網路兩台主機之間的檔案目錄時,只會傳輸實際上有異動的資料部份進行更新,而不是再次複製來源檔案所有內容一份到目的,所以同步的資料量傳輸不會很多,所以所耗費時間就相當的少。

rsync 使用上,一般可以簡單用於本機目錄之間同步,也可以使用網路的連線作業模式。而其中網路連線架構又可以簡單區分架設 rsync server 與搭配 ssh 服務一起使用。本文部份只會針對本機使用部份與搭配 ssh 連線兩個方式介紹,透過架設標準 rsync server 方式也不複雜,可以參閱 rsync 官網與網路上相關的文件說明。

本機目錄之前同步方式:

rsync 用於本機目錄之間的同步複製更新方式,大致上使用方式如下:

rsync [options...] src_path.... dest_path

簡單來說就是 rsync 可以傳入必要參數,後面接要同步的多個來源,最後接目的的路徑甚至檔案位置即可。而參數部份有非常多的選擇,這邊就單純使用 -a (archive) 的參數達成完成同步應對的功能,並搭配 -v參數提供複製同步過程的訊息輸出。

比方使用例子:

rsync -av /etc .

這表示把 /etc 檔案目錄同步備份到目前工作目錄,所以後續工作目錄內會有一個 etc 該目錄。當執行完成後,
若是再執行一次,會發現 rsync 不會傳輸檔案過來,因為來源都沒有異動,所以就不進行任何動作。

=====================================================================================

rsync 測試:

這邊給一些使用例子:

--------------------------------------------------------------------------------------------------

測試 1

這邊實際測試部份,我們先於目前工作目錄內建立 test1 與 test2 目錄,然後 test1 目錄建立多檔案如下:

SayyaBBS:kendlee@~/test/test1> cp /etc/termcap test1.dat
SayyaBBS:kendlee@~/test/test1> cp /etc/termcap test2.dat
SayyaBBS:kendlee@~/test/test1> cp /etc/termcap test3.dat
SayyaBBS:kendlee@~/test/test1>
SayyaBBS:kendlee@~/test/test1> ls -lh
總計 2.1M
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:49 test1.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:49 test2.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:49 test3.dat

目前進入 test2 目錄後,要把 test1 內的檔案複製一份過來到目前目錄內。

SayyaBBS:kendlee@~/test/test2> rsync -av ../test1/ .
sending incremental file list
./
test1.dat
test2.dat
test3.dat

sent 2110999 bytes received 72 bytes 4222142.00 bytes/sec
total size is 2110518 speedup is 1.00

--------------------------------------------------------------------------------------------------

測試 2

所以可以看出來已經完成部份,傳輸量的確是是 2.1MB 上下。然後重新跑一次:

SayyaBBS:kendlee@~/test/test2> rsync -av ../test1/ .
sending incremental file list

sent 97 bytes received 12 bytes 218.00 bytes/sec
total size is 2110518 speedup is 19362.55

各位會發現到其實 rsync 沒有啥動作,所以一下子就跑完了。

--------------------------------------------------------------------------------------------------

測試 3

現在繼續再 test1 內使用 cp 複製 /etc/termcap 一個檔案成為 test4.dat 後,然後再跑 rsync 同步更新一次:

SayyaBBS:kendlee@~/test/test2> rsync -av ../test1/ .
sending incremental file list
./
test4.dat

sent 703748 bytes received 34 bytes 1407564.00 bytes/sec
total size is 2814024 speedup is 4.00

所以各位可以看出來只有傳輸新增的 test4.dat 檔案,其他沒有異動的檔案都不會再複製一次過來。

--------------------------------------------------------------------------------------------------

測試 4

那現在要模擬 test1.dat 檔案被修改了,所以我們測試方式就是把 test2.dat 檔案內容附加到 test1.dat 檔案內容後面,操作如下:

cat test2.dat >> test1.dat

然後再次跑 rsync 同步更新測試一次:

SayyaBBS:kendlee@~/test/test2> rsync -av ../test1/ .
sending incremental file list
test1.dat

sent 20974235 bytes received 31 bytes 41948532.00 bytes/sec
total size is 52428800 speedup is 2.50

所以可以看出來只有更新 test1.dat 檔案內容部份而已.....

--------------------------------------------------------------------------------------------------

測試 5

然後再次測試修改 test2.dat 檔案內容,我用 vi 編輯該檔案,修改內容與刪除一些部份

SayyaBBS:kendlee@~/test> ls -lh test1/
總計 3.3M
-rw-r--r-- 1 kendlee kendlee 1.4M 2009-08-25 16:51 test1.dat
-rw-r--r-- 1 kendlee kendlee 590K 2009-08-25 16:55 test2.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:49 test3.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:51 test4.dat

然後再次跑 rsync 同步更新測試一次:

SayyaBBS:kendlee@~/test/test2> rsync -av ../test1/ .
sending incremental file list
./
test2.dat

sent 603900 bytes received 34 bytes 1207868.00 bytes/sec
total size is 3417694 speedup is 5.66

的確也只有傳輸 test2.dat 該檔案內容項目。

--------------------------------------------------------------------------------------------------

測試 6

目前修改 test1 內 test2.dat 檔案內容,但是修改後檔案大小與原本還是一樣大小。

SayyaBBS:kendlee@~/test/test1> ls -l
總計 3347
-rw-r--r-- 1 kendlee kendlee 1407012 2009-08-25 16:51 test1.dat
-rw-r--r-- 1 kendlee kendlee 603670 2009-08-25 16:59 test2.dat
-rw-r--r-- 1 kendlee kendlee 703506 2009-08-25 16:49 test3.dat
-rw-r--r-- 1 kendlee kendlee 703506 2009-08-25 16:51 test4.dat
SayyaBBS:kendlee@~/test/test1>

 

SayyaBBS:kendlee@~/test/test1> ls -l ../test2/
總計 3347
-rw-r--r-- 1 kendlee kendlee 1407012 2009-08-25 16:51 test1.dat
-rw-r--r-- 1 kendlee kendlee 603670 2009-08-25 16:55 test2.dat
-rw-r--r-- 1 kendlee kendlee 703506 2009-08-25 16:49 test3.dat
-rw-r--r-- 1 kendlee kendlee 703506 2009-08-25 16:51 test4.dat

 

那重新同步一次:

SayyaBBS:kendlee@~/test/test2> rsync -av ../test1/ .
sending incremental file list
./
test2.dat

sent 603900 bytes received 34 bytes 1207868.00 bytes/sec
total size is 3417694 speedup is 5.66

所以還是有達成同步效果。不過有人可能會說沒看出 rsync 很強大部份,但是若是搭配 -z 參數就可以將傳輸量減少,尤其目前一般網路速度之間有差異的。

--------------------------------------------------------------------------------------------------

測試 7

先執行 cat test3.dat >> test2.dat 命令,讓 test2.dat 檔案變大然後更新測試

SayyaBBS:kendlee@~/test> ls -l test1/
總計 4035
-rw-r--r-- 1 kendlee kendlee 1407012 2009-08-25 16:51 test1.dat
-rw-r--r-- 1 kendlee kendlee 1307176 2009-08-25 17:02 test2.dat
-rw-r--r-- 1 kendlee kendlee 703506 2009-08-25 16:49 test3.dat
-rw-r--r-- 1 kendlee kendlee 703506 2009-08-25 16:51 test4.dat

SayyaBBS:kendlee@~/test/test2> rsync -avz ../test1/ .
sending incremental file list
test2.dat

sent 416255 bytes received 31 bytes 832572.00 bytes/sec
total size is 4121200 speedup is 9.90

可以看出來來源端檔案 test2.dat 是 1.3MB 上下,但是傳輸過來的量卻只有400KB 的量,所以傳輸的量基本上很少,這在網路傳輸上非常的有用,尤其本身
網路的速度不快,可以透過該方式讓資料量更小。

補充其中可以搭配 --compress-level 指定壓縮率數值,數值越大壓縮率越高,不過預設中等壓縮數值一般來說已經夠用,而且不會佔用太多 CPU 的耗費。

--------------------------------------------------------------------------------------------------

測試 8

最後來測試刪除來源端檔案的同步備份方式,記得搭配 --delete 參數提供可以刪除來源已經被刪除時也可以刪除目的檔案方式:

SayyaBBS:kendlee@~/test> ls -lh test1 test2
test1:
總計 2.0M
-rw-r--r-- 1 kendlee kendlee 1.3M 2009-08-25 17:02 test2.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:51 test4.dat

test2:
總計 4.0M
-rw-r--r-- 1 kendlee kendlee 1.4M 2009-08-25 16:51 test1.dat
-rw-r--r-- 1 kendlee kendlee 1.3M 2009-08-25 17:02 test2.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:49 test3.dat
-rw-r--r-- 1 kendlee kendlee 688K 2009-08-25 16:51 test4.dat

可以看出來刪除 test1 內不少檔案了,所以跑 rsync 同步備份:

SayyaBBS:kendlee@~/test/test2> rsync -avz --delete ../test1/ .
sending incremental file list
deleting test3.dat
deleting test1.dat

sent 82 bytes received 12 bytes 188.00 bytes/sec
total size is 2010682 speedup is 21390.23

所以 test1.dat 與 test3.dat 檔案也都一併刪除掉了。

=====================================================================================

主機之間同步方式:

基本上主機之間同步使用部份,可以區分:

1. 使用 rsync server 架設,要讓 rsync 程式 listen 於 873 port 提供服務。不過由於 該方式沒有走 ssl 加密傳輸,某些環境使用上會比較有安全問題。再者若是要設定支援 帳號密碼驗證登入更是有更多議題要談。此外一般使用者也無法自行配置架設使用。

2. 使用 rsync + ssh 方式,該方式不需要建制 rsync 服務 listen 於 873 port,只要遠端 主機有 rsync 命令,而且可以支援 ssh 登入即可使用。這個方式非常推薦使用,因為安全性 都兼顧到,使用者也不需要具備 root 身份即可自行操作使用。

要使用該方式,搭配 -e ssh 參數指定即可正常使用,這邊舉一些例子:

--------------------------------------------------------------------------------------------------

測試 9

SayyaBBS:kendlee@~/test> rsync -avz -e ssh kendlee@10.0.0.254:/bin .
Password:
receiving incremental file list
bin/
bin/arch
bin/ash -> ../bin/dash.static
bin/awk -> gawk
bin/basename
bin/bash
bin/bash2
bin/bash3 -> bash
......
bin/cat
bin/zcat
bin/zsh

sent 1981 bytes received 7082524 bytes 674714.76 bytes/sec
total size is 16572867 speedup is 2.34

可以看出來透過網路方式就可以提供 rsync 檔案的傳輸功能。

--------------------------------------------------------------------------------------------------

測試 10

然後我在把複製過來的 bin/ 目錄內 c 開頭檔案都刪除掉後,重新同步一次:

SayyaBBS:kendlee@~/test> rsync -avz -e ssh kendlee@10.0.0.254:/bin .
Password:
receiving incremental file list
bin/
bin/cat
bin/chgrp
bin/chmod
bin/chown
bin/cifs.upcall3
bin/cp
bin/cpio
bin/csh -> tcsh
bin/cut

sent 170 bytes received 1835571 bytes 333771.09 bytes/sec
total size is 16572867 speedup is 9.03

所以 rsync 也只有把刪除掉的 c 開頭檔案再次同步回來一份到本機。

SayyaBBS:kendlee@~/test> ls -lh bin/c*
-rwxr-xr-x 1 kendlee kendlee 54K 2009-05-20 04:52 bin/cat*
-rwxr-xr-x 1 kendlee kendlee 60K 2009-05-20 04:52 bin/chgrp*
-rwxr-xr-x 1 kendlee kendlee 56K 2009-05-20 04:52 bin/chmod*
-rwxr-xr-x 1 kendlee kendlee 61K 2009-05-20 04:52 bin/chown*
-rwxr-xr-x 1 kendlee kendlee 4.9M 2009-02-25 23:46 bin/cifs.upcall3*
-rwxr-xr-x 1 kendlee kendlee 103K 2009-05-20 04:52 bin/cp*
-rwxr-xr-x 1 kendlee kendlee 130K 2008-12-21 01:47 bin/cpio*
lrwxrwxrwx 1 kendlee kendlee 4 2009-08-25 17:20 bin/csh -> tcsh*
-rwxr-xr-x 1 kendlee kendlee 52K 2009-05-20 04:52 bin/cut*

其中也可以看出來這些檔案相加大約有 5MB 多,但是傳輸量基本上沒用到這麼多,
因為有壓縮處理過了。

=====================================================================================

最後:

其實 rsync 最方便好用地方在於網路之間的傳輸備份,尤其手上有管理不少的 file server 與ftp server,要進行異地的備份與主機單純的同步上顯得非常方便.... 不過單純用於本機的檔案目錄複製上也很方便好用,尤其我非常喜歡 --exclude 這個參數,因為可以指定排除特定檔案目錄
不要進行傳輸這需求。

rsync 本身可以支援常駐方式透過 port 873 提供服務,這時候可以透過 /etc/rsyncd.conf 這類檔案指定開放哪些分享,與 samba 分享非常類似喔,所以上述的方式熟悉後請務必接觸這個部份的使用,相信對於 rsync 會更加喜愛呢。

更多技術文件,請到技術論壇小州老師專版

 

30期電子報相關文章:

聯成30電子報好禮相送

本期焦點:「行動創意 隨心所欲」Nokia 手機創意設計大賽

本期焦點:學員部落格 精彩的捨不得眨眼

軟體秘技:善用免費軟體創作精彩相簿

證照新知:ACE認證介紹

學員專欄:繪圖經驗分享-繪製眼睛

精彩人物:實現腦海藍圖的築夢導師-專訪吳信成 老師

arrow
arrow

    聯成電腦 發表在 痞客邦 留言(0) 人氣()