轉載:http://www.cnblogs.com/f-ck-need-u/p/7220009.html
1、什么是rsync
用于服務器同步目錄及文檔踪栋,功能相當強大上倦青。不過它是把一個文檔劃分成多個塊進行掃描對比祭饭,所以可以進行差異同步芜茵,效率高速度也快。并且備份文檔能保留源文檔的權限倡蝙、屬主九串、屬組、時間等屬性。
其工作方式分為命令行和服務模式兩種猪钮。前者就和scp命令接近品山,后者和samba工作模式相似。
2烤低、rsync 的三種工作模式
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
由此語法可知谆奥,rsync有三種工作方式:
(1).本地文件系統(tǒng)上實現(xiàn)同步。命令行語法格式為上述"Local"段的格式拂玻。
(2).本地主機使用遠程shell和遠程主機通信。命令行語法格式為上述"Access via remote shell"段的格式宰译。
(3).本地主機通過網(wǎng)絡套接字連接遠程主機上的rsync daemon檐蚜。命令行語法格式為上述"Access via rsync daemon"段的格式。
前兩者的本質是通過管道通信沿侈,即使是遠程shell闯第。而方式(3)則是讓遠程主機上運行rsync服務,使其監(jiān)聽在一個端口上缀拭,等待客戶端的連接咳短。
3、rsync的參數(shù)說明
-v:顯示rsync過程中詳細信息蛛淋×茫可以使用"-vvvv"獲取更詳細信息。
-P:顯示文件傳輸?shù)倪M度信息褐荷。(實際上"-P"="--partial --progress"勾效,其中的"--progress"才是顯示進度信息的)。
-n --dry-run :僅測試傳輸叛甫,而不實際傳輸层宫。常和"-vvvv"配合使用來查看rsync是如何工作的。
-a --archive :歸檔模式其监,表示遞歸傳輸并保持文件屬性萌腿。等同于"-rtopgDl"。
-r --recursive:遞歸到目錄中去抖苦。
-t --times:保持mtime屬性毁菱。強烈建議任何時候都加上"-t",否則目標文件mtime會設置為系統(tǒng)時間锌历,導致下次更新
:檢查出mtime不同從而導致增量傳輸無效鼎俘。
-o --owner:保持owner屬性(屬主)。
-g --group:保持group屬性(屬組)辩涝。
-p --perms:保持perms屬性(權限贸伐,不包括特殊權限)。
-D :是"--device --specials"選項的組合怔揩,即也拷貝設備文件和特殊文件捉邢。
-l --links:如果文件是軟鏈接文件脯丝,則拷貝軟鏈接本身而非軟鏈接所指向的對象。
-z :傳輸時進行壓縮提高效率伏伐。
-R --relative:使用相對路徑宠进。意味著將命令行中指定的全路徑而非路徑最尾部的文件名發(fā)送給服務端,包括它們的屬性藐翎。用法見下文示例材蹬。
--size-only :默認算法是檢查文件大小和mtime不同的文件,使用此選項將只檢查文件大小吝镣。
-u --update :僅在源mtime比目標已存在文件的mtime新時才拷貝堤器。注意,該選項是接收端判斷的末贾,不會影響刪除行為闸溃。
-d --dirs :以不遞歸的方式拷貝目錄本身。默認遞歸時拱撵,如果源為"dir1/file1"辉川,則不會拷貝dir1目錄,使用該選項將拷貝dir1但不拷貝file1拴测。
--max-size :限制rsync傳輸?shù)淖畲笪募笮∨移臁?梢允褂脝挝缓缶Y集索,還可以是一個小數(shù)值(例如:"--max-size=1.5m")
--min-size :限制rsync傳輸?shù)淖钚∥募笮〈缙搿_@可以用于禁止傳輸小文件或那些垃圾文件。
--exclude :指定排除規(guī)則來排除不需要傳輸?shù)奈募?--delete :以SRC為主抄谐,對DEST進行同步渺鹦。多則刪之,少則補之蛹含。注意"--delete"是在接收端執(zhí)行的毅厚,所以它是在
:exclude/include規(guī)則生效之后才執(zhí)行的。
-b --backup :對目標上已存在的文件做一個備份浦箱,備份的文件名后默認使用"~"做后綴吸耿。
--backup-dir:指定備份文件的保存路徑。不指定時默認和待備份文件保存在同一目錄下酷窥。
-e :指定所要使用的遠程shell程序咽安,默認為ssh。
--port :連接daemon時使用的端口號蓬推,默認為873端口妆棒。
--password-file:daemon模式時的密碼文件,可以從中讀取密碼實現(xiàn)非交互式。注意糕珊,這不是遠程shell認證的密碼动分,而是rsync模塊認證的密碼。
-W --whole-file:rsync將不再使用增量傳輸红选,而是全量傳輸澜公。在網(wǎng)絡帶寬高于磁盤帶寬時,該選項比增量傳輸更高效喇肋。
--existing :要求只更新目標端已存在的文件坟乾,目標端還不存在的文件不傳輸。注意蝶防,使用相對路徑時如果上層目錄不存在也不會傳輸甚侣。
--ignore-existing:要求只更新目標端不存在的文件。和"--existing"結合使用有特殊功能慧脱,見下文示例。
--remove-source-files:要求刪除源端已經成功傳輸?shù)奈募?
前兩中工作模式的簡單案例:
rsync /etc/fatab /tmp #本地同步
rsync -r /etc root@192.168.1.80:/tmp #將本地/etc目錄拷貝到遠程主機的/tmp下贺喝,以保證遠程/tmp目錄和本地/etc保持同步
rsync -r root@192.168.1.80:/etc /tmp #將遠程主機的/etc目錄拷貝到本地/tmp下菱鸥,以保證本地/tmp目錄和遠程/etc保持同步
rsync /etc/ #列出本地/etc/目錄下的文件列表
rsync root@192.168.1.80:/tmp/ #列出遠程主機上/tmp/目錄下的文件列表
另外,使用rsync一定要注意的一點是躏鱼,源路徑如果是一個目錄的話氮采,帶上尾隨斜線和不帶尾隨斜線是不一樣的,不帶尾隨斜線表示的是整個目錄包括目錄本身染苛,帶上尾隨斜線表示的是目錄中的文件鹊漠,不包括目錄本身。例如:
rsync -a /etc /tmp
rsync -a /etc/ tmp
第一個命令會在/tmp目錄下創(chuàng)建etc目錄茶行,而第二個命令不會在/tmp目錄下創(chuàng)建etc目錄躯概,源路徑/etc/中的所有文件都直接放在/tmp目錄下。
4畔师、rsync daemon 模式
既然rsync通過遠程shell就能實現(xiàn)兩端主機上的文件同步娶靡,還要使用rsync的服務干啥?試想下看锉,你有的機器上有一堆文件需要時不時地同步到眾多機器上去姿锭,比如目錄a、b伯铣、c是專門傳輸?shù)絯eb服務器上的呻此,d/e、f腔寡、g/h是專門傳輸?shù)絝tp服務器上的焚鲜,還要對這些目錄中的某些文件進行排除,如果通過遠程shell連接方式,無論是使用排除規(guī)則還是包含規(guī)則恃泪,甚至一條一條rsync命令地傳輸郑兴,這都沒問題,但太過繁瑣且每次都要輸入同樣的命令顯得太死板贝乎。使用rsync daemon就可以解決這種死板問題情连。而且,rsync daemon是向外提供服務的览效,這樣只要告訴了別人rsync的url路徑却舀,外人就能向ftp服務器一樣獲取文件列表并進行選擇性地下載
rsync daemon是"rsync --daemon"或再加上其他一些選項啟動的,它會讀取配置文件锤灿,默認是/etc/rsyncd.conf挽拔,并默認監(jiān)聽在873端口上,當外界有客戶端對此端口發(fā)起連接請求但校,通過這個網(wǎng)絡套接字就可以完成連接螃诅,以后與該客戶端通信的所有數(shù)據(jù)都通過該網(wǎng)絡套接字傳輸。
rsync daemon的通信方式和傳輸通道與遠程shell不同状囱。遠程shell連接的兩端是通過管道完成通信和數(shù)據(jù)傳輸?shù)氖趼悖词惯B接的一端是遠程主機,當連接到目標端時亭枷,將在目標端上根據(jù)遠程shell進程fork出rsync進程使其成為rsync server袭艺。而rsync daemon是事先在server端上運行好的rsync后臺進程(根據(jù)啟動選項,也可以設置為非后臺進程)叨粘,它監(jiān)聽套接字等待client端的連接猾编,連接建立后所有通信方式都是通過套接字完成的。
注意升敲,rsync中的server的概念從來就不代表是rsync daemon答倡,server在rsync中只是一種通用稱呼,只要不是發(fā)起rsync請求的client端驴党,就是server端苇羡,你可以認為rsync daemon是一種特殊的server,其實daemon更應該稱之為service鼻弧。
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
連接命令有兩種類型设江,一種是rsync風格使用雙冒號的"rsync user@host::src dest",一種是url風格的"rsync://user@host:port/src dest"攘轩。對于rsync風格的連接命令叉存,如果想要指定端口號,則需要使用選項"--port"度帮。
5歼捏、rsync daemon配置文件rsyncd.conf
默認"rsync --daemon"讀取的配置文件為/etc/rsyncd.conf稿存,有些版本的系統(tǒng)上可能該文件默認不存在。rsyncd.conf的配置見man rsyncd.conf瞳秽。瓣履。以下是部分內容:
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
# uid = nobody
# gid = nobody
# use chroot = yes
# max connections = 4
# pid file = /var/run/rsyncd.pid
# exclude = lost+found/
# transfer logging = yes
# timeout = 900
# ignore nonreadable = yes
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
# [ftp1]
# path = /home/ftp
# comment = ftp export area
一個簡單的示例
######### 全局配置參數(shù) ##########
port=873 # 指定rsync端口。默認873
uid = root # rsync服務的運行用戶练俐,默認是nobody袖迎,文件傳輸成功后屬主將是這個uid
gid = root # rsync服務的運行組,默認是nobody腺晾,文件傳輸成功后屬組將是這個gid
use chroot = no # rsync daemon在傳輸前是否切換到指定的path目錄下燕锥,并將其監(jiān)禁在內
max connections = 200 # 指定最大連接數(shù)量,0表示沒有限制
timeout = 300 # 確保rsync服務器不會永遠等待一個崩潰的客戶端悯蝉,0表示永遠等待
motd file = /var/rsyncd/rsync.motd # 客戶端連接過來顯示的消息
pid file = /var/run/rsyncd.pid # 指定rsync daemon的pid文件
lock file = /var/run/rsync.lock # 指定鎖文件
log file = /var/log/rsyncd.log # 指定rsync的日志文件归形,而不把日志發(fā)送給syslog
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 指定哪些文件不用進行壓縮傳輸
###########下面指定模塊,并設定模塊配置參數(shù)鼻由,可以創(chuàng)建多個模塊###########
[longshuai] # 模塊ID
path = /longshuai/ # 指定該模塊的路徑暇榴,該參數(shù)必須指定。啟動rsync服務前該目錄必須存在蕉世。rsync請求訪問模塊本質就是訪問該路徑蔼紧。
ignore errors # 忽略某些IO錯誤信息
read only = false # 指定該模塊是否可讀寫,即能否上傳文件讨彼,false表示可讀寫歉井,true表示可讀不可寫柿祈。所有模塊默認不可上傳
write only = false # 指定該模式是否支持下載哈误,設置為true表示客戶端不能下載。所有模塊默認可下載
list = false # 客戶端請求顯示模塊列表時躏嚎,該模塊是否顯示出來蜜自,設置為false則該模塊為隱藏模塊。默認true
hosts allow = 10.0.0.0/24 # 指定允許連接到該模塊的機器卢佣,多個ip用空格隔開或者設置區(qū)間
hosts deny = 0.0.0.0/32 # 指定不允許連接到該模塊的機器
auth users = rsync_backup # 指定連接到該模塊的用戶列表重荠,只有列表里的用戶才能連接到模塊,用戶名和對應密碼保存在secrts file中虚茶,
# 這里使用的不是系統(tǒng)用戶戈鲁,而是虛擬用戶。不設置時嘹叫,默認所有用戶都能連接婆殿,但使用的是匿名連接
secrets file = /etc/rsyncd.passwd # 保存auth users用戶列表的用戶名和密碼,每行包含一個username:passwd罩扇。由于"strict modes"
# 默認為true婆芦,所以此文件要求非rsync daemon用戶不可讀寫怕磨。只有啟用了auth users該選項才有效。
補充:
https://www.linuxidc.com/Linux/2012-10/71705.htm
排除故障
1.@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
這是因為密碼設錯了, 無法登入成功, 請檢查一下 rsyncd.scrt 中的密碼, 二端是否一致?
2.password file must not be other-accessible
continuing without password file
Password:
這表示 rsyncd.scrt 的檔案權限屬性不對, 應設為 600消约。
3.@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
這通常是您的 rsyncd.conf 中的 path 路徑所設的那個目錄并不存在所致.請先用 mkdir開設好要備份目錄
4.@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)
最后原因終于找到了肠鲫。因為有兩個網(wǎng)段都需要同步該文件夾內容,但沒有在hosts allow 后面添加另一個IP段
hosts allow = 192.168.1.0/24
改為
hosts allow = 192.168.1.0/24 192.168.2.0/24
重新啟動rsync服務或粮,問題解決
5.rsync: failed to connect to 172.21.50.8: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
對方沒開機导饲、防火墻阻擋、通過的網(wǎng)絡上有防火墻阻擋被啼,都有可能帜消。關閉防火墻,其實就是把tcp udp 的873端口打開
啟動服務:rsync --daemon --config=/etc/rsyncd.conf
6.@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
client端沒有設置/etc/rsync.pas這個文件浓体,而在使用rsync命令的時候泡挺,加了這個參數(shù)--password-file=/etc/rsync.scrt
7.rsync: recv_generator: mkdir "/teacherclubBackup/rsync……" failed: No space left on device (28)
*** Skipping any contents from this failed directory ***
磁盤空間滿了
8.rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)
同步目錄的權限設置不對,改為755
9.rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5]
未啟動xinetd守護進程
[root@CC02 /]# service xinetd start
10.rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory
xnetid查找的配置文件位置默認是/etc下命浴,在/etc下找不到rsyncd.conf文件
11.rsync: failed to connect to 203.100.192.66: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
連接服務器超時娄猫,檢查服務器的端口netstat –tunlp,遠程telnet測試
12.[root@client cron.daily.rsync]# sh root.sh
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(175) [Receiver=3.0.9]
創(chuàng)建密碼文件生闲,root用戶用的是 rsyncroot.password媳溺,權限是600
13.如何通過ssh進行rsync,而且無須輸入密碼碍讯?
可以通過以下幾個步驟
1. 通過ssh-keygen在server A上建立SSH keys悬蔽,不要指定密碼,你會在~/.ssh下看到identity和identity.pub文件
2. 在server B上的home目錄建立子目錄.ssh
3. 將A的identity.pub拷貝到server B上
4. 將identity.pub加到~[user b]/.ssh/authorized_keys
5. 于是server A上的A用戶捉兴,可通過下面命令以用戶B ssh到server B上了蝎困。e.g. ssh -l userB serverB。這樣就使server A上的用戶A就可以ssh以用戶B的身份無需密碼登陸到server B上了倍啥。
14.如何通過在不危害安全的情況下通過防火墻使用rsync?
解答如下:
這通常有兩種情況禾乘,一種是服務器在防火墻內,一種是服務器在防火墻外虽缕。無論哪種情況始藕,通常還是使用ssh,這時最好新建一個備份用戶氮趋,并且配置sshd 僅允許這個用戶通過RSA認證方式進入伍派。如果服務器在防火墻內,則最好限定客戶端的IP地址剩胁,拒絕其它所有連接诉植。如果客戶機在防火墻內,則可以簡單允許防 火墻打開TCP端口22的ssh外發(fā)連接就ok了摧冀。
15.我能將更改過或者刪除的文件也備份上來嗎倍踪?
當然可以系宫。你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13 ...這樣的命令來實現(xiàn)。這樣如果源文件:/path/to/some/file.c改變了建车,那么舊的文件就會被移到./backup- 2000-2-13/path/to/some/file.c扩借,這里這個目錄需要自己手工建立起來
16.我需要在防火墻上開放哪些端口以適應rsync?
視情況而定缤至。rsync可以直接通過873端口的tcp連接傳文件潮罪,也可以通過22端口的ssh來進行文件傳遞,但你也可以通過下列命令改變它的端口:
rsync --port 8730 otherhost::
或者
rsync -e 'ssh -p 2002' otherhost:
17.我如何通過rsync只復制目錄結構领斥,忽略掉文件呢嫉到?
rsync -av --include '/' --exclude '' source-dir dest-dir
18.為什么我總會出現(xiàn)"Read-only file system"的錯誤呢?
看看是否忘了設"read only = no"了