1.關(guān)于rsync
rsync是remote synchronize的簡稱志电,是一款遠(yuǎn)程同步軟件导俘,在項目中多有用到。其采用的rsync算法(酷殼上有一篇介紹rsync核心算法的博文rsync的核心算法)提供了一種比較快速的方法用于客戶機(jī)和遠(yuǎn)程文件服務(wù)器同步。
rsync的特點(diǎn)是安裝和配置都比較方便,然后同步文件時能夠保持符號鏈接憨琳,硬鏈接,權(quán)限旬昭,文件時間篙螟,文件歸屬等數(shù)學(xué)。安全性方面則提供了密碼问拘、讀寫權(quán)限控制和IP權(quán)限控制遍略。
2.rsync安裝和配置
由于我用的是ubuntu,已經(jīng)預(yù)裝了rsync骤坐,所以就不用安裝了绪杏。我的配置文件是/etc/rsyncd.conf,配置如下纽绍,更詳細(xì)的配置介紹參見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設(shè)置同步目錄只讀蕾久,uid和gid為同步采用的用戶和用戶組。pid file和log file為pid文件和日志文件存放地址顶岸。
test為同步目錄腔彰,path為同步目錄叫编,注意該變量后面加注釋如#XXX之類辖佣,加了會報chroot錯誤。另外搓逾,hosts allow是限制同步的ip卷谈,多個ip空格分隔。auth users和secrets file分別是認(rèn)證的用戶和密碼文件霞篡。其中secrets file權(quán)限必須為600世蔗,否則會同步會出錯端逼,格式為用戶名:密碼,這里的用戶名不一定是系統(tǒng)用戶污淋,可以隨便取名顶滩,比如我的是rsynctest:testpasswd
。
3.rsync同步命令
rsync同步有兩種模式寸爆,一種通過遠(yuǎn)程shell如ssh進(jìn)行連接礁鲁,另外則是通過TCP直接連接rsync服務(wù)器。因為使用ssh等同步需要設(shè)置ssh對應(yīng)端口赁豆,比較麻煩點(diǎn)仅醇,我一般都是采用直接連接rsync服務(wù)器這種方式。同步的命令最常見的就是下面這樣:
rsync -avz --progress --delete rsync://rsynctest@10.211.55.11/test/ rsynctarget/
其中rsynctest是我同步的用戶名魔种,10.211.55.11是我的rsync服務(wù)器的ip析二。運(yùn)行命令然后輸入密碼就行了。如果不想每次都輸入密碼节预,可以加上參數(shù)--password-file=/etc/rsyncd.secrets
叶摄,其中rsyncd.secrets是你rsync客戶端機(jī)器上的文件,權(quán)限也要600安拟,內(nèi)容格式跟rsync服務(wù)器的不一樣准谚,這里只需要密碼testpasswd即可。--progress顯示同步的進(jìn)度去扣,--delete則是刪除rsynctarget中多余的文件柱衔。
這幾個選項avz很常用,其中v是verbose愉棱,z是壓縮唆铐,a相當(dāng)于rlptgoD,其中r是遞歸同步目錄奔滑,如果不加-r而是用-d艾岂,則只會同步對應(yīng)的目錄,而不會同步目錄下面的文件朋其;l同步符號鏈接王浴,p同步文件保持權(quán)限不變,t保持文件時間梅猿,g保持文件所屬組氓辣,o保持文件所屬用戶,D保持設(shè)備文件袱蚓。一般情況用avz就可以了钞啸。另外還有個選項-P也會常用,表示保持部分同步的文件,如果同步中斷体斩,可以續(xù)傳梭稚。
另外有個地方要注意下,就是在同步一個子目錄的時候絮吵,比如我同步rsynctest/testdir這個目錄弧烤,如果命令是這樣rsync -avz rsync://rsynctest@10.211.55.11/test/testdir rsynctarget/
,因為testdir后面沒有加"/",則同步結(jié)果就是rsynctarget目錄下面會有一個testdir目錄蹬敲,即rsynctarget/testdir這樣扼褪。如果命令是````rsync -avz rsync://rsynctest@10.211.55.11/test/testdir/ rsynctarget/```,那結(jié)果就是把testdir目錄下面的文件全部同步到rsynctarget目錄下粱栖,rsynctarget目錄下面不會有testdir這個目錄话浇。
4.實(shí)例
為了方便,我建了個目錄用來做rsync測試闹究。目錄rsynctest中的內(nèi)容如下:
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的硬鏈接渣淤。
同步的目標(biāo)目錄rsynctarget的內(nèi)容如下:
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
采用不同的參數(shù)赏寇,同步的結(jié)果會不一樣。
1)不用-a參數(shù)价认,也不用-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被當(dāng)做一個新文件了碎乃,沒有保留硬鏈接關(guān)系,如果要保留惠奸,需要加上-H選項梅誓。此外,文件所有者也不是原來的nobody:nogroup了佛南,如果需要保留梗掰,要加-og參數(shù)。該命令同步后嗅回,rsynctarget目錄內(nèi)容如下:
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參數(shù)及穗。命令如下:
rsync -avz --progress --delete rsync://rsynctest@10.211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets
同步后rsynctarget目錄內(nèi)容如下,可以看到使用-a后妈拌,文件所有者都得到保留拥坛,軟連接也同步過來了蓬蝶,不過硬鏈接關(guān)系沒有保留尘分。要保留的話猜惋,加上-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)另外還有一個重要參數(shù)就是-P培愁,注意這個P不是progress的意思著摔,他是partial的意思,就是說同步過程如果出現(xiàn)中斷(比如主動停止了同步或者網(wǎng)絡(luò)問題導(dǎo)致同步中斷)定续,如果一個文件沒有傳完谍咆,是否保留這些已經(jīng)傳輸?shù)牟糠志褪怯?P來控制。這里我在rsynctest目錄下面加了一個test.tar.gz文件私股,大小為2M摹察,而我用bwlimit參數(shù)限制傳輸速度為10K/s以內(nèi),這樣倡鲸,中途終止同步供嚎,這樣可以看到,如果沒有加-P參數(shù)的時候峭状,rsynctarget沒有保存tornado.tar.gz這個文件已經(jīng)傳輸?shù)牟糠值目说危绻恿?P則會保存已經(jīng)傳輸?shù)牟糠郑募彩莟ornado.tar.gz优床,下次重傳會斷點(diǎn)續(xù)傳劝赔,即已經(jīng)同步的部分不會重新傳。同步過程中臨時文件名是.tornado.tar.gz.qesuQR這樣的格式胆敞。如果有程序是從同步目錄取數(shù)據(jù)并處理的着帽,最好不要用-P參數(shù),因為如果網(wǎng)絡(luò)問題會導(dǎo)致文件傳了一部分移层,然后被處理了启摄,這樣會影響處理結(jié)果。
rsync -avzP --progress --delete --bwlimit=10 rsync://rsynctest@10.211.55.11/test/ rsynctarget/ --password-file=/etc/rsyncd.secrets