Rsync(remote? rynchronization)是一款開源的、快速的、多功能的、可實現全量以及增量的本地或者遠程數據同步的備份的優秀工具,可使本地主機不同分區或目錄之間及本地和遠程兩臺主機之間的數據快速同步鏡像,遠程備份等功能同時它在同步文件的同時可以保持原來文件的權限、時間、軟硬鏈接等附加信息。可以再本地不同分區以及目錄之間全量以及增量的復制數據,不是加密的,可以實現刪除文件和目錄的功能。在同步備份數據時,通過其獨特的quick check算法,僅同步大小或者最后的修改時間發生變化的文件或者目錄,當然也可以根據權限、屬主等屬性的變化同步,但需指定相應的參數,甚至可以實現只同步一個文件里面變化的部分,實現數據的差異化備份,所以可以實現快速的同步備份數據
一、Rsync大致使用三種主要的傳輸數據方式。
本地傳輸(local) ? | 當SRC和DES路徑信息都不包含有單個冒號”:”分隔符時就啟動這種工作模式 | rsync -a /data /backup rsync -b --suffix=.bak2 --backup-dir=/tmp/ /etc/passwd /home/passwd.bak --suffix=xxx 指定舊備份文件的后綴名 --backup-dir=xxxx 指定將舊備份文件移動到哪個位置下 |
遠程通道 傳輸 remote shell ? | 利用ssh實現數據的遠程傳輸,類似于 scp rsync默認也是基于ssh來實現的,如果目標主機的ssh端口不是22,那么在用rsync的必須用-e選項 | 拉取: ? |
守護進程傳輸 | rsync的配置文件: /etc/rsyncd.conf(默認不存在) | ? |
本地傳輸、遠程通道傳輸的本質是通過管道通信,即使是遠程shell。而守護進程傳輸則是讓遠程主機上運行rsync服務,使其監聽在一個端口上,等待客戶端的連接。 但是,通過遠程shell也能臨時啟動一個rsync daemon,這不同于守護進程傳輸,它不要求遠程主機上事先啟動rsync服務,而是臨時派生出rsync daemon,它是單用途的一次性daemon,僅用于臨時讀取daemon的配置文件,當此次rsync同步完成,遠程shell啟動的rsync daemon進程也會自動消逝。此通信方式的命令行語法格式同"Access via rsync daemon",但要求options部分必須明確指定"--rsh"選項或其短選項"-e"。 遠程shell連接的兩端是通過管道完成通信和數據傳輸的,即使連接的一端是遠程主機,當連接到目標端時,將在目標端上根據遠程shell進程fork出rsync進程使其成為rsync server。而rsync daemon是事先在server端上運行好的rsync后臺進程(根據啟動選項,也可以設置為非后臺進程),它監聽套接字等待client端的連接,連接建立后所有通信方式都是通過套接字完成的。 注意,rsync中的server的概念從來就不代表是rsync daemon,server在rsync中只是一種通用稱呼,只要不是發起rsync請求的client端,就是server端,你可以認為rsync daemon是一種特殊的server,其實daemon更應該稱之為service |
二、選項說明:
-v:顯示rsync過程中詳細信息。可以使用"-vvvv"獲取更詳細信息。 -P:顯示文件傳輸的進度信息。(實際上"-P"="--partial --progress",其中的"--progress"才是顯示進度? ? ? 信息的)。 -n --dry-run :僅測試傳輸,而不實際傳輸。常和"-vvvv"配合使用來查看rsync是如何工作的。 -a --archive :歸檔模式,表示遞歸傳輸并保持文件屬性。等同于"-rtopgDl"。 -r --recursive:遞歸到目錄中去。 -t --times:保持mtime屬性。強烈建議任何時候都加上"-t",否則目標文件mtime會設置為系統時間,導致下? ? ? ? ? ? ? 次更新檢查出mtime不同從而導致增量傳輸無效。 -o --owner:保持owner屬性(屬主)。 -g --group:保持group屬性(屬組)。 -p --perms:保持perms屬性(權限,不包括特殊權限)。 -D :是"--device --specials"選項的組合,即也拷貝設備文件和特殊文件。 -l --links:如果文件是軟鏈接文件,則拷貝軟鏈接本身而非軟鏈接所指向的對象。 -z :-compress??傳輸時進行壓縮以提高傳輸效率 --compress-level=num可按級別壓縮。 -R --relative:使用相對路徑。意味著將命令行中指定的全路徑而非路徑最尾部的文件名發送給服務端,包括? ? ? ? ? ? ? ? ?它們的屬性。用法見下文示例。 --size-only :默認算法是檢查文件大小和mtime不同的文件,使用此選項將只檢查文件大小。 -u --update :僅在源mtime比目標已存在文件的mtime新時才拷貝。注意,該選項是接收端判斷的,不會影響? ? ? ? ? ? ? ? 刪除行為。 -d --dirs :以不遞歸的方式拷貝目錄本身。默認遞歸時,如果源為"dir1/file1",則不會拷貝dir1目錄,使? ? ? ? ? ? ? 用該選項將拷貝dir1但不拷貝file1。 --max-size :限制rsync傳輸的最大文件大小。可以使用單位后綴,還可以是一個小數值(例如:"--max- ? ? ? ? ? ? ?size=1.5m") --min-size :限制rsync傳輸的最小文件大小。這可以用于禁止傳輸小文件或那些垃圾文件。 --exclude :指定排除規則來排除不需要傳輸的文件。 ?? ? ? ? ? ?排除單個文件:–exclude=5.txt ? ? ? ? ? ? 排除多個文件:–exclude={5.txt, 7.txt} ? ? ? ? ? ? 基于通配符做排除:–exclude=*txt --delete :接收端的rsync會先刪除目標目錄下已經存在,但源端目錄不存在的文件。以SRC為主,對DEST進? ? ? ? ? ? ?行同步。多則刪 之,少則補之。注意"--delete"是在接收端執行的,所以它exclude/include? ? ? ? ? ? ?規則生效之后才執行的。 -b --backup :對目標上已存在的文件做一個備份,備份的文件名后默認使用"~"做后綴。 --backup-dir:指定備份文件的保存路徑。不指定時默認和待備份文件保存在同一目錄下。 -e :指定所要使用的遠程shell程序,默認為ssh。 --port :連接daemon時使用的端口號,默認為873端口。 --password-file:daemon模式時的密碼文件,可以從中讀取密碼實現非交互式。注意,這不是遠程shell認證? ? ? ? ? ? ? ? ? ?的密碼,而是rsync模塊認證的密碼。 -W --whole-file:rsync將不再使用增量傳輸,而是全量傳輸。在網絡帶寬高于磁盤帶寬時,該選項比增量傳? ? ? ? ? ? ? ? ? ?輸更高效。 --existing :要求只更新目標端已存在的文件,目標端還不存在的文件不傳輸。注意,使用相對路徑時如果上? ? ? ? ? ? ? ?層目錄不存在也不會傳輸。 --ignore-existing:要求只更新目標端不存在的文件。和"--existing"結合使用有特殊功能,見下文示例。 --remove-source-files:要求刪除源端已經成功傳輸的文件 |
三、配置文件
port=888 # 指定rsync端口。默認873
uid = rsync # rsync服務的運行用戶,默認是nobody,文件傳輸成功后屬主將是這個uid
gid = rsync # rsync服務的運行組,默認是nobody,文件傳輸成功后屬組將是這個gid
use chroot = no # rsync daemon在傳輸前是否切換到指定的path目錄下,并將其監禁在內
max connections = 200 # 指定最大連接數量,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的日志文件,而不把日志發送給syslog
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 指定哪些文件不用進行壓縮傳輸###########下面指定模塊,并設定模塊配置參數,可以創建多個模塊###########
[longshuai] # 模塊ID
path = /longshuai/ # 指定該模塊的路徑,該參數必須指定。啟動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用空格隔開或者設置區間
hosts deny = 0.0.0.0/32 # 指定不允許連接到該模塊的機器
auth users = rsync_backup # 指定連接到該模塊的用戶列表,只有列表里的用戶才能連接到模塊,用戶名和對應密碼保存在secrts file中,# 這里使用的不是系統用戶,而是虛擬用戶。不設置時,默認所有用戶都能連接,但使用的是匿名連接
secrets file = /etc/rsyncd.passwd # 保存auth users用戶列表的用戶名和密碼,每行包含一個username:passwd。由于"strict modes"# 默認為true,所以此文件要求非rsync daemon用戶不可讀寫。只有啟用了auth users該選項才有效。
[xiaofang] # 以下定義的是第二個模塊
path=/xiaofang/
read only = false
ignore errors
comment = anyone can access#客戶端推到服務端時,文件的屬主和屬組是配置文件中指定的uid和gid。但是客戶端從服務端拉的時候,#文件的屬主和屬組是客戶端正在操作rsync的用戶身份,因為執行rsync程序的用戶為當前用戶。#auth users和secrets file這兩行不是一定需要的,省略它們時將默認使用匿名連接。但是如果使用了#它們,則secrets file的權限必須是600。客戶端的密碼文件也必須是600。#關于secrets file的權限,實際上并非一定是600,只要滿足除了運行rsync daemon的用戶可讀即可。##是否檢查權限的設定是通過選項strict mode設置的,如果設置為false,則無需關注文件的權限。但默認是#yes,即需要設置權限。#配置完后,再就是提供模塊相關目錄、身份驗證文件等
?四、Inotify介紹
? ? ? ?Inotify可用于檢測單個文件,也可以檢測整個目錄。當檢測的對象是一個目錄的時候,目錄本身和目錄里的內容都會成為檢? ? ? ? ? ?測的對象。
? ? ? ?參數:
-e: 事件? ? ? -d:后臺運行? ? ? ?-m:始終保持事件監聽狀態? ? ? ?-q:打印很少的信息,僅僅打印監控事件的信息 安靜狀態 -r :遞歸查詢目錄? ? ? ? ? ? ? ? ? ? ?-timefmt:指定時間輸出的格式? ? ? -excluder:排除文件或者目錄的時候不區分大小寫 |
? ? ??
注解:
當發送端敲出rsync命令后,rsync將立即掃描命令行中給定的文件和目錄(掃描過程中還會按照目錄進行排序,將同一個目錄的文件放在相鄰的位置),這稱為拷貝樹(copy tree),掃描完成后將待傳輸的文件或目錄記錄到文件列表中,然后將文件列表傳輸給接收端。而篩選規則的作用時刻是在掃描拷貝樹時,所以會根據規則來匹配并決定文件是否記錄到文件列表中(嚴格地說是會記錄到文件列表中的,只不過排除的文件會被標記為hide隱藏起來),只有記錄到了文件列表中的文件或目錄才是真正需要傳輸的內容。換句話說,篩選規則的生效時間在rsync整個同步過程中是非常靠前的,它會影響很多選項的操作對象,最典型的如"--delete",實際上,排除規則和包含規則都只是"--filter"篩選規則的兩種特殊規則。"--filter"比較復雜,它有自己的規則語法和匹配模式 以下是rsync中的規則種類,不解之處請結合下文的"--delete"分析: (1).exclude規則:即排除規則,只作用于發送端,被排除的文件不會進入文件列表(實際上是加上隱藏規則進行隱藏)。 (2).include規則:即包含規則,也稱為傳輸規則,只作用于發送端,被包含的文件將明確記錄到文件列表中。 (3).hide規則:即隱藏規則,只作用于發送端,隱藏后的文件對于接收端來說是看不見的,也就是說接收端會認為它不存在于源端。 (4).show規則:即顯示規則,只作用于發送端,是隱藏規則的反向規則。 (5).protect規則:即保護規則,該規則只作用于接收端,被保護的文件不會被刪除掉。 (6).risk規則:即取消保護規則。是protect的反向規則。 除此之外,還有一種規則是"clear規則",作用是刪除include/exclude規則列表,如果將"--delete"選項和"--exlcude"選項一起使用,則被排除的文件不會被刪除。 在發送端將文件列表發送給接收端后,接收端的generator(要是不知道,你認為是某個就好了)進程會掃描每個文件列表中的信息,然后對列表中的每個信息條目都計算數據塊校驗碼,最后將數據庫校驗碼發給發送端,發送端通過校驗碼來匹配哪些數據塊是需要傳輸的,這樣就實現了增量傳輸的功能——只傳輸改變的部分,不會傳輸整個文件。而delete刪除的時間點是generator進程處理每個文件列表時、生成校驗碼之前進行的,先將目標上存在但源上不存在的多余文件刪除,這樣就無需為多余的文件生成校驗碼。 所以,delete動作是比"--exclude"規則更晚執行的,被"--exlcude"規則排除的文件不會進入文件列表中,在執行了delete時會認為該文件不存在于源端,從而導致目標端將這些文件刪除。但這是想當然的,盡管理論上確實是這樣的,但是rsync為了防止眾多誤刪除情況,提供了兩種規則:保護規則(protect)和取消保護規則(risk)。默認情況下,"--delete"和"--exclude"一起使用時,雖然發送端的exclude規則將文件標記為隱藏,使得接收端認為這些被排除文件在源端不存在,但rsync會將這些隱藏文件標記為保護文件,使得它們不受delete行為的影響,這樣delete就刪除不了這些被排除的文件。如果還是想要強行刪除被exclude排除的文件,可以使用"--delete-excluded"選項強制取消保護,這樣即使被排除的文件也會被刪除。 那么現在,是否理解了網上的言論"exclude排除的文件不會被刪除"? 除了"--delete",相關的選項還有"--delete-before"、"--delete-during"、"--delete-delay"等,它們都隱含了"--delete"選項,它們分別表示generator處理各個文件列表之前一次性全部刪除待刪除文件、處理文件列表時處理到哪個文件列表就刪除該文件列表中的待刪除文件,以及同步完所有數據后一次性刪除所有待刪除文件。 舉個例子,假如源端要傳輸3個目錄a、b、c,在目標端a目錄中有a1、a2、a3共3個文件需要被刪除,b目錄中有b1、b2、b3需要刪除,同理c目錄也一樣c1、c2、c3需要被刪除。 如果是"--delete-before",則在目標端rsync剛啟動時,就會把a1-a3、b1-b3、c1-c3一次性刪除,然后才會處理文件列表中的a目錄,處理完a后處理b,再是c。 如果是"--delete-during",則在目標端rsync剛啟動時,先處理文件列表中的a目錄,處理a目錄時發現此目錄中有待刪除文件a1-a3,順手就刪除它們,然后完成a目錄的相關操作,再處理文件列表中的b目錄,發現也有待刪除文件b1-b3,順手刪除它們,同理c1-c3也如此。 如果是"--delete-delay",則同步完文件列表中的a/b/c目錄后,最后一次性刪除a1-a3、b1-b3、c1-c3。 其實"--delete"選項大多數情況下默認采用的就是"--delete-during" |
?