rsync那些事兒

本文簡書上的地址rsync那些事兒

1.關於rsync

rsync是remote synchronize的簡稱,是一款遠程同步軟件,在項目中多有用到。其採用的rsync算法(酷殼上有一篇介紹rsync核心算法的博文rsync的核心算法)提供了一種比較快速的方法用於客戶機和遠程文件服務器同步。

rsync的特點是安裝和配置都比較方便,然後同步文件時能夠保持符號鏈接,硬鏈接,權限,文件時間,文件歸屬等數學。安全性方面則提供了密碼、讀寫權限控制和IP權限控制。

2.rsync安裝和配置

由於我用的是ubuntu,已經預裝了rsync,所以就不用安裝了。我的配置文件是/etc/rsyncd.conf,配置如下,更詳細的配置介紹參見rsyncd.config

read only = yes
list = yes
uid = nobody
gid = nogroup

pid file = /var/run/rsyncd.pid
secrets file = /etc/rsyncd.secrets
log file = /var/log/rsync.log

[test]
comment = Welcome
path = /home/ssj/rsynctest
hosts allow = 127.0.0.1 10.211.55.11
auth users = rsynctest

其中read only設置同步目錄只讀,uid和gid爲同步採用的用戶和用戶組。pid file和log file爲pid文件和日誌文件存放地址。

test爲同步目錄,path爲同步目錄,注意該變量後面加註釋如#XXX之類,加了會報chroot錯誤。另外,hosts allow是限制同步的ip,多個ip空格分隔。auth users和secrets file分別是認證的用戶和密碼文件。其中secrets file權限必須爲600,否則會同步會出錯,格式爲用戶名:密碼,這裏的用戶名不一定是系統用戶,可以隨便取名,比如我的是rsynctest:testpasswd

3.rsync同步命令

rsync同步有兩種模式,一種通過遠程shell如ssh進行連接,另外則是通過TCP直接連接rsync服務器。因爲使用ssh等同步需要設置ssh對應端口,比較麻煩點,我一般都是採用直接連接rsync服務器這種方式。同步的命令最常見的就是下面這樣:

rsync -avz --progress --delete rsync://rsynctest@10.211.55.11/test/ rsynctarget/

其中rsynctest是我同步的用戶名,10.211.55.11是我的rsync服務器的ip。運行命令然後輸入密碼就行了。如果不想每次都輸入密碼,可以加上參數--password-file=/etc/rsyncd.secrets,其中rsyncd.secrets是你rsync客戶端機器上的文件,權限也要600,內容格式跟rsync服務器的不一樣,這裏只需要密碼testpasswd即可。–progress顯示同步的進度,–delete則是刪除rsynctarget中多餘的文件。

這幾個選項avz很常用,其中v是verbose,z是壓縮,a相當於rlptgoD,其中r是遞歸同步目錄,如果不加-r而是用-d,則只會同步對應的目錄,而不會同步目錄下面的文件;l同步符號鏈接,p同步文件保持權限不變,t保持文件時間,g保持文件所屬組,o保持文件所屬用戶,D保持設備文件。一般情況用avz就可以了。另外還有個選項-P也會常用,表示保持部分同步的文件,如果同步中斷,可以續傳。

另外有個地方要注意下,就是在同步一個子目錄的時候,比如我同步rsynctest/testdir這個目錄,如果命令是這樣rsync -avz rsync://[email protected]/test/testdir rsynctarget/,因爲testdir後面沒有加”/”,則同步結果就是rsynctarget目錄下面會有一個testdir目錄,即rsynctarget/testdir這樣。如果命令是`rsync -avz rsync://[email protected]/test/testdir/ rsynctarget/,那結果就是把testdir目錄下面的文件全部同步到rsynctarget目錄下,rsynctarget目錄下面不會有testdir這個目錄。

4.實例

爲了方便,我建了個目錄用來做rsync測試。目錄rsynctest中的內容如下:

root@ubuntu:/home/ssj/rsynctest# ls -la
total 20
drwxr-xr-x  3 nobody nogroup 4096 Mar  7 16:33 .
drwxr-xr-x 28 ssj    ssj     4096 Mar  7 16:13 ..
-rw-r--r--  2 nobody nogroup   13 Mar  7 16:32 link.txt
lrwxrwxrwx  1 nobody nogroup   12 Mar  7 15:13 outer.txt -> ../outer.txt
lrwxrwxrwx  1 nobody nogroup    8 Mar  7 14:52 softlink.txt -> test.txt
drwxr-xr-x  2 nobody nogroup 4096 Mar  7 14:51 testdir
-rw-r--r--  2 nobody nogroup   13 Mar  7 16:32 test.txt

其中softlink.txt是test.txt的符號鏈接,link.txt是test.txt的硬鏈接,而outer.txt是上一級目錄的outer.txt的硬鏈接。

同步的目標目錄rsynctarget的內容如下:

root@ssj-mbp ssj#ls -la rsynctarget/
total 8
drwxr-xr-x   3 65534  65534   102  3  7 17:15 .
drwxr-xr-x@ 94 ssj    staff  3196  3  6 23:38 ..
-rw-r--r--   1 root   65534     7  3  7 17:15 myfile.txt

採用不同的參數,同步的結果會不一樣。

1)不用-a參數,也不用-og等,命令如下:

rsync -rpvz --progress --delete rsync://rsynctest@10.211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets

由於用了–delete,則原來rsynctarget中的myfile.txt會被刪除,由於沒有加-l,則符號鏈接文件outer.txt和softlink.txt沒有同步過來。同步後,硬鏈接test.txt被當做一個新文件了,沒有保留硬鏈接關係,如果要保留,需要加上-H選項。此外,文件所有者也不是原來的nobody:nogroup了,如果需要保留,要加-og參數。該命令同步後,rsynctarget目錄內容如下:

root@ubuntu:/home/ssj# ls -la rsynctarget/
total 20
drwxr-xr-x  3 root root 4096 Mar  7 17:31 .
drwxr-xr-x 29 ssj  ssj  4096 Mar  7 17:31 ..
-rw-r--r--  1 root root   13 Mar  7 17:31 link.txt
drwxr-xr-x  2 root root 4096 Mar  7 17:31 testdir
-rw-r--r--  1 root root   13 Mar  7 17:31 test.txt

2)採用-a參數。命令如下:

rsync -avz --progress --delete rsync://rsynctest@10.211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets

同步後rsynctarget目錄內容如下,可以看到使用-a後,文件所有者都得到保留,軟連接也同步過來了,不過硬鏈接關係沒有保留。要保留的話,加上-H。

root@ubuntu:/home/ssj# ls -la rsynctarget/
total 20
drwxr-xr-x  3 nobody nogroup 4096 Mar  7 16:33 .
drwxr-xr-x 29 ssj    ssj     4096 Mar  7 17:31 ..
-rw-r--r--  1 nobody nogroup   13 Mar  7 16:32 link.txt
lrwxrwxrwx  1 nobody nogroup   12 Mar  7 15:13 outer.txt -> ../outer.txt
lrwxrwxrwx  1 nobody nogroup    8 Mar  7 14:52 softlink.txt -> test.txt
drwxr-xr-x  2 nobody nogroup 4096 Mar  7 14:51 testdir
-rw-r--r--  1 nobody nogroup   13 Mar  7 16:32 test.txt

3)另外還有一個重要參數就是-P,注意這個P不是progress的意思,他是partial的意思,就是說同步過程如果出現中斷(比如主動停止了同步或者網絡問題導致同步中斷),如果一個文件沒有傳完,是否保留這些已經傳輸的部分就是由-P來控制。這裏我在rsynctest目錄下面加了一個test.tar.gz文件,大小爲2M,而我用bwlimit參數限制傳輸速度爲10K/s以內,這樣,中途終止同步,這樣可以看到,如果沒有加-P參數的時候,rsynctarget沒有保存tornado.tar.gz這個文件已經傳輸的部分的,如果加了-P則會保存已經傳輸的部分,文件名也是tornado.tar.gz,下次重傳會斷點續傳,即已經同步的部分不會重新傳。同步過程中臨時文件名是.tornado.tar.gz.qesuQR這樣的格式。如果有程序是從同步目錄取數據並處理的,最好不要用-P參數,因爲如果網絡問題會導致文件傳了一部分,然後被處理了,這樣會影響處理結果。

rsync -avzP --progress --delete --bwlimit=10 rsync://rsynctest@10.211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets

5.參考資料

發佈了121 篇原創文章 · 獲贊 133 · 訪問量 68萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章