天天看點

linux rsync同步指令

如果你是一位運維工程師,你很可能會面對幾十台、幾百台甚至上千台伺服器,除了批量操作外,環境同步、資料同步也是必不可少的技能。

說到“同步”,不得不提的利器就是rsync,今天就來說說我從這個工具中看到的同步的藝術。

[不帶任何選項]

我們經常這樣使用rsync:

$ rsync main.c machineB:/home/userB

1 隻要目的端的檔案内容和源端不一樣,就會觸發資料同步,rsync會確定兩邊的檔案内容一樣。

2 但rsync不會同步檔案的“modify time”,凡是有資料同步的檔案,目的端的檔案的“modify time”總是會被修改為最新時刻的時間。

3 rsync不會太關注目的端檔案的rwx權限,如果目的端沒有此檔案,那麼權限會保持與源端一緻;如果目的端有此檔案,則權限不會随着源端變更。

4 隻要rsync有對源檔案的讀權限,且對目标路徑有寫權限,rsync就能確定目的端檔案同步到和源端一緻。

5 rsync隻能以登陸目的端的賬号來建立檔案,它沒有能力保持目的端檔案的輸主和屬組和源端一緻。(除非你使用root權限,才有資格要求屬主一緻、屬組一緻)

[-t選項]

我們經常這樣使用-t選項:

$ rsync -t main.c machineB:/home/userB

1 使用-t選項後,rsync總會想着一件事,那就是将源檔案的“modify time”同步到目标機器。

2 帶有-t選項的rsync,會變得更聰明些,它會在同步前先對比兩邊檔案的時間戳和檔案大小,如果一緻,則就認為兩邊檔案一樣,對此檔案就不再采取更新動作了。

3 因為rsync的聰明,也會反被聰明誤。如果目的端的檔案的時間戳、大小和源端完全一緻,但是内容恰巧不一緻時,rsync是發現不了的。這就是傳說中的“坑”!

4 對于rsync自作聰明的情況,解決辦法就是使用-I選項。

[-I選項]

我們經常這樣使用-I選項:

$ rsync -I main.c machineB:/home/userB

1 -I選項會讓rsync變得很乖很老實,它會挨個檔案去發起資料同步。

2 -I選項可以確定資料的一緻性,代價便是速度上會變慢,因為我們放棄了“quick check”政策。(quick check政策,就是先檢視檔案的時間戳和檔案大小,依次先排除一批認為相同的檔案)

3 無論情況如何,目的端的檔案的modify time總會被更新到目前時刻。

【-v選項】

這個選項,簡單易懂,就是讓rsync輸出更多的資訊,我們可以舉一個例子:

<code>$</code><code>rsync</code> <code>-vI main.c machineB:</code><code>/home/userB</code>                         

<code>main.c</code>

<code>sent 81 bytes received 42 bytes 246.00 bytes</code><code>/sec</code>

<code>total size is 11 speedup is 0.09</code>

你增加越多的v,就可以獲得越多的日志資訊。

<code>$</code><code>rsync</code> <code>-vvvvt abc.c machineB:</code><code>/home/userB</code>

<code>cmd= machine=machineB user= path=</code><code>/home/userB</code>

<code>cmd[0]=</code><code>ssh</code> <code>cmd[1]=machineB cmd[2]=</code><code>rsync</code> <code>cmd[3]=--server cmd[4]=-vvvvte. cmd[5]=. cmd[6]=</code><code>/home/userB</code>

<code>opening connection using:</code><code>ssh</code> <code>machineB</code><code>rsync</code> <code>--server -vvvvte. .</code><code>/home/userB</code>

<code>note: iconv_open(</code><code>"ANSI_X3.4-1968"</code><code>,</code><code>"ANSI_X3.4-1968"</code><code>) succeeded.</code>

<code>(Client) Protocol versions: remote=28, negotiated=28</code>

<code>(Server) Protocol versions: remote=30, negotiated=28</code>

<code>[sender] make_file(abc.c,*,2)</code>

<code>[sender] flist start=0, used=1, low=0, high=0</code>

<code>[sender] i=0 abc.c mode=0100664 len=11 flags=0</code>

<code>send_file_list</code><code>done</code>

<code>file</code> <code>list sent</code>

<code>send_files starting</code>

<code>server_recv(2) starting pid=31885</code>

<code>recv_file_name(abc.c)</code>

<code>received 1 names</code>

<code>[receiver] i=0  abc.c mode=0100664 len=11</code>

<code>recv_file_list</code><code>done</code>

<code>get_local_name count=1</code><code>/home/userB</code>

<code>recv_files(1) starting</code>

<code>generator starting pid=31885 count=1</code>

<code>delta transmission enabled</code>

<code>recv_generator(abc.c,0)</code>

<code>abc.c is uptodate</code>

<code>generate_files phase=1</code>

<code>send_files phase=1</code>

<code>recv_files phase=1</code>

<code>generate_files phase=2</code>

<code>send files finished</code>

<code>total: matches=0 hash_hits=0 false_alarms=0 data=0</code>

<code>generate_files finished</code>

<code>recv_files finished</code>

<code>client_run waiting on 14318</code>

<code>sent 36 bytes received 16 bytes 104.00 bytes</code><code>/sec</code>

<code>total size is 11 speedup is 0.21</code>

<code>_exit_cleanup(code=0,</code><code>file</code><code>=main.c, line=1031): entered</code>

<code>_exit_cleanup(code=0,</code><code>file</code><code>=main.c, line=1031): about to call</code><code>exit</code><code>(0)</code>

[-z選項]

這是個壓縮選項,隻要使用了這個選項,rsync就會把發向對端的資料先進行壓縮再傳輸。對于網絡環境較差的情況下建議使用。

一般情況下,-z的壓縮算法會和gzip的一樣。

[-r選項]

我們在第一次使用rsync時,往往會遇到這樣的囧境:

<code>$</code><code>rsync</code> <code>superman machineB:</code><code>/home/userB</code>

<code>skipping directory superman</code>

如果你不額外告訴rsync你需要它幫你同步檔案夾的話,它是不會主動承擔的,這也正是rsync的懶惰之處。

是以,如果你真的想同步檔案夾,那就要加上-r選項,即recursive(遞歸的、循環的),像這樣:

<code>$</code><code>rsync</code> <code>-r superman machineB:</code><code>/home/userB</code>

我們在上面的講解中說過,如果時間戳和檔案大小完全一緻,隻有檔案内容不同,且你沒有使用-I選項的話,那麼,rsync是不會進行資料同步的。

那麼,提個問題:“因為在Linux的世界裡,檔案夾也是檔案,如果這類檔案(檔案夾)也隻有内容不同,而時間戳和檔案大小都相同,rsync會發現麼?”

實驗大家可以自己動手做,結論在這裡告訴大家:

對于檔案夾,rsync是會明察秋毫的,隻要你加了-r選項,它就會恪盡職守的進入到檔案夾裡去檢查,而不會隻對檔案夾本身做“quick check”的。

[-l選項]

如果我們要同步一個軟連結檔案,你猜rsync會提示什麼?

<code>$ ll</code>

<code>total 128</code>

<code>-rw-rw-r-- 1 userA userA 11 Dec 26 07:00 abc.c</code>

<code>lrwxrwxrwx 1 userA userA 5 Dec 26 11:35 softlink -&gt; abc.c</code>

<code>$</code><code>rsync</code> <code>softlink machineB:</code><code>/home/userB</code>

<code>skipping non-regular</code><code>file</code> <code>"softlink"</code>

嗯,你猜對了,rsync又無情地拒絕了我們。它一旦發現某個檔案是軟連結,就會無視它,除非我們增加-l選項。

代碼如下:

$ rsync -l softlink machineB:/home/userB

使用了-l選項後,rsync會完全保持軟連結檔案類型,原原本本的将軟連結檔案複制到目的端,而不會“follow link”到指向的實體檔案。

如果我偏偏就想讓rsync采取follow link的方式,那就用-L選項就可以了。你可以自己試試效果。

[-p選項]

這個選項的全名是“perserve permissions”,顧名思義,就是保持權限。

如果你不使用此選項的話,rsync是這樣來處理權限問題的:

1 如果目的端沒有此檔案,那麼在同步後會将目的端檔案的權限保持與源端一緻;

2 如果目的端已存在此檔案,那麼隻會同步檔案内容,權限保持原有不變。

如果你使用了-p選項,則無論如何,rsync都會讓目的端保持與源端的權限一緻的。

[-g選項和-o選項]

這兩個選項是一對,用來保持檔案的屬組(group)和屬主(owner),作用應該很清晰明了。不過要注意的一點是,改變屬主和屬組,往往隻有管理者權限才可以。

[-D選項]

-D選項,原文解釋是“preserve devices(root only)”,從字面意思看,就是保持裝置檔案的原始資訊。由于部落客沒有實際體驗過它的好處,是以沒有太多發言權。

[-a選項]

1 -a選項是rsync裡比較霸道的一個選項,因為你使用-a選項,就相當于使用了-rlptgoD這一坨選項。以一敵七,唯-a選項也。(在看了前文之後,你應該可以很輕松的了解這七個選項的作用了)

2 -a選項的學名應該叫做archive option,中文叫做歸檔選項。使用-a選項,就表明你希望采取遞歸方式來同步,且盡可能的保持各個方面的一緻性。

3 但是-a選項也有阿克琉斯之踵,那就是-a無法同步“硬連結”情況。如果有這方面需求,要加上-H選項。

[--delete選項、--delete-excluded選項和--delete-after選項]

三個選項都是和“删除”有關的:

1 –delete:如果源端沒有此檔案,那麼目的端也别想擁有,删除之。(如果你使用這個選項,就必須搭配-r選項一起)

2 –delete-excluded:專門指定一些要在目的端删除的檔案。

3 –delete-after:預設情況下,rsync是先清理目的端的檔案再開始資料同步;如果使用此選項,則rsync會先進行資料同步,都完成後再删除那些需要清理的檔案。

看到這麼多delete,你是否有點肝顫? 的确,在rsync的官方說明裡也有這麼一句話:

This option can be dangerous if used incorrectly!  

It is a very good idea to run first using the dry  run  option

(-n) to see what files would be deleted to make sure 

important files aren't listed.

從這句話裡,我們學到了一個小技巧,那就是-n選項,它是一個吓唬人的選項,它會用受影響的檔案清單來警告你,但不會真的去删除,這就讓我們有了确認的機會和回旋的餘地。我們看看實際用法吧:

<code>$</code><code>rsync</code> <code>-n --delete -r . machineB:</code><code>/home/userB/</code>

<code>deleting superman</code><code>/xxx</code>

<code>deleting main.c</code>

<code>deleting acclink</code>

[--exclude選項和--exclude-from選項]

如果你不希望同步一些東西到目的端的話,可以使用–exclude選項來隐藏,rsync還是很重視大家隐私的,你可以多次使用–exclude選項來設定很多的“隐私”。

如果你要隐藏的隐私太多的話,在指令行選項中設定會比較麻煩,rsync還是很體貼,它提供了–exclude-from選項,讓你可以把隐私一一列在一個檔案裡,然後讓rsync直接讀取這個檔案就好了。

[--partial選項]

這就是傳說中的斷點續傳功能。預設情況下,rsync會删除那些傳輸中斷的檔案,然後重新傳輸。但在一些特别情況下,我們不希望重傳,而是續傳。

我們在使用中,經常會看到有人會使用-P選項,這個選項其實是為了偷懶而設計的。以前人們總是要手動寫–partial –progress,覺得太費勁了,倒不如用一個新的選項來代替,于是-P應運而生了。有些讀者會問–partial我知道作用了,可–progress是幹什麼用的呢?為什麼很多人要使用它呢,它有那麼大的吸引力?(真有…)

[--progress選項]

使用這個選項,rsync會顯示出傳輸進度資訊,有什麼用呢,rsync給了一個很有意思的解釋:

This gives a bored user something to watch.

好了,寫了這麼多,大家看的已經很乏味了,去實際用用–progress解解悶,是個不錯的選擇 ^_^

下面給大家介紹的是rsync參數的具體解釋: 

-v, --verbose 詳細模式輸出 

-q, --quiet 精簡輸出模式 

-c, --checksum 打開校驗開關,強制對檔案傳輸進行校驗 

-a, --archive 歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性,等于-rlptgoD 

-r, --recursive 對子目錄以遞歸模式處理 

-R, --relative 使用相對路徑資訊 

-b, --backup 建立備份,也就是對于目的已經存在有同樣的檔案名時,将老的檔案重新命名為~filename。可以使用--suffix選項來指定不同的備份檔案字首。 

--backup-dir 将備份檔案(如~filename)存放在在目錄下。 

-suffix=SUFFIX 定義備份檔案字首 

-u, --update 僅僅進行更新,也就是跳過所有已經存在于DST,并且檔案時間晚于要備份的檔案。(不覆寫更新的檔案) 

-l, --links 保留軟鍊結 

-L, --copy-links 想對待正常檔案一樣處理軟鍊結 

--copy-unsafe-links 僅僅拷貝指向SRC路徑目錄樹以外的鍊結 

--safe-links 忽略指向SRC路徑目錄樹以外的鍊結 

-H, --hard-links 保留硬鍊結 

-p, --perms 保持檔案權限 

-o, --owner 保持檔案屬主資訊 

-g, --group 保持檔案屬組資訊 

-D, --devices 保持裝置檔案資訊 

-t, --times 保持檔案時間資訊 

-S, --sparse 對稀疏檔案進行特殊處理以節省DST的空間 

-n, --dry-run現實哪些檔案将被傳輸 

-W, --whole-file 拷貝檔案,不進行增量檢測 

-x, --one-file-system 不要跨越檔案系統邊界 

-B, --block-size=SIZE 檢驗算法使用的塊尺寸,預設是700位元組 

-e, --rsh=COMMAND 指定使用rsh、ssh方式進行資料同步 

--rsync-path=PATH 指定遠端伺服器上的rsync指令所在路徑資訊 

-C, --cvs-exclude 使用和CVS一樣的方法自動忽略檔案,用來排除那些不希望傳輸的檔案 

--existing 僅僅更新那些已經存在于DST的檔案,而不備份那些新建立的檔案 

--delete 删除那些DST中SRC沒有的檔案 

--delete-excluded 同樣删除接收端那些被該選項指定排除的檔案 

--delete-after 傳輸結束以後再删除 

--ignore-errors 及時出現IO錯誤也進行删除 

--max-delete=NUM 最多删除NUM個檔案 

--partial 保留那些因故沒有完全傳輸的檔案,以是加快随後的再次傳輸 

--force 強制删除目錄,即使不為空 

--numeric-ids 不将數字的使用者群組ID比對為使用者名群組名 

--timeout=TIME IP逾時時間,機關為秒 

-I, --ignore-times 不跳過那些有同樣的時間和長度的檔案 

--size-only 當決定是否要備份檔案時,僅僅察看檔案大小而不考慮檔案時間 

--modify-window=NUM 決定檔案是否時間相同時使用的時間戳視窗,預設為0 

-T --temp-dir=DIR 在DIR中建立臨時檔案 

--compare-dest=DIR 同樣比較DIR中的檔案來決定是否需要備份 

-P 等同于 --partial 

--progress 顯示備份過程 

-z, --compress 對備份的檔案在傳輸時進行壓縮處理 

--exclude=PATTERN 指定排除不需要傳輸的檔案模式 

--include=PATTERN 指定不排除而需要傳輸的檔案模式 

--exclude-from=FILE 排除FILE中指定模式的檔案 

--include-from=FILE 不排除FILE指定模式比對的檔案 

--version 列印版本資訊 

--address 綁定到特定的位址 

--config=FILE 指定其他的配置檔案,不使用預設的rsyncd.conf檔案 

--port=PORT 指定其他的rsync服務端口 

--blocking-io 對遠端shell使用阻塞IO 

-stats 給出某些檔案的傳輸狀态 

--progress 在傳輸時現實傳輸過程 

--log-format=formAT 指定日志檔案格式 

--password-file=FILE 從FILE中得到密碼 

--bwlimit=KBPS 限制I/O帶寬,KBytes per second 

-h, --help 顯示幫助資訊 

一般同步傳輸目錄都使用azv選項.

     本文轉自yzy121403725 51CTO部落格,原文連結:http://blog.51cto.com/lookingdream/1826670,如需轉載請自行聯系原作者

繼續閱讀