!rsync同步模式
sync在進行同步或備份時,使用遠程shell,或TCP連接遠程daemon,有兩種途經連接遠程主機。
shell模式,不需要使用配置文件,也不需要啟動遠端rsync。遠程傳輸時一般使用ssh作為傳輸工具。
daemon模式,但必須在一台機器上啟動rsync。
!rsync命令調用格式
本地文件同步:
rsync [OPTION...] SRC... [DEST]
示例:
rsync -a /home/back1 /home/back2
基於遠程shell同步:
拉取: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
推送: rsync [OPTION...] SRC... [USER@]HOST:DEST
基於rsync daemon同步:
拉取: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
推送: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
如果只指定了源路徑,而沒有指定目的路徑,rsync將會顯示源路徑中的文件列表。
源路徑的最后有斜杠,則只復制目錄中的文件;沒有斜杠,不但要復制目錄中的文件,還要復制目錄本身。
目的路徑的最后有沒有斜杠,對傳輸沒有影響。
!常用參數說明
-delete 刪除服務端不存在的客戶端文件
-password-file=FILE 指定本機rsyncd.secrets的位置
-a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD
-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 打開校驗開關,強制對文件傳輸進行校驗
-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一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件
-f, --filter=RULE 從指定文件加載過濾規則。
--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新創建的文件
--delete 刪除那些DST中SRC沒有的文件
--delete-excluded 同樣刪除接收端那些被該選項指定排除的文件
--delete-after 傳輸結束以后再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個文件
-P, --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中的文件來決定是否需要備份
--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 顯示幫助信息
!rsyncd.conf配置,按“[]”設定的模塊划分同步模塊。每個模塊中包含格式為name = value的參數定義。格式、參數說明及常用設置如下:
#默認存放位置/etc/rsyncd.conf
#全局參數
#指定消息文本文件,當客戶端連接成功時顯示該文件的內容到客戶端
motd file=/usr/local/etc/rsyncdmsg
#指定pid文件
pid file=/var/run/rsyncd.pid
#指定rsync監聽端口,默認為873
port=873
#指定IP
address=127.0.0.1
#模塊參數,部分模塊參數也可在全局段定義,作用於全部模塊。
#模塊名為sync_test
[sync_test]
#以nobody身份運行rsync server
uid = nobody
#指定守護程序以root方式運行時模塊應當替換的文件傳入和傳出的組名或組ID,配合"uid"選項。
gid = nobody
#同步模塊備注
comment = backup demo
#需要做鏡像的目錄
path = /opt/data
#認證用戶名,未指定為允許匿名。多個用戶名可用空格或逗號分隔。
auth users = tester
#密碼文件存放路徑
secrets file = /usr/local/etc/rsyncd.secrets
#同步是否為只讀,默認為yes
read only = yes
#同步是否為只寫,默認為no
write only=no
#當客戶請求可以使用的模塊列表時,該模塊是否應該被列出。如果設置該選項為false,可以創建隱藏的模塊。默認為yes
list=yes
#不對指定類型文件壓縮
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz *.jpg
#如果設為true,則在傳輸文件時chroot到path指定的目錄下。需要rsync以root權限啟動,並且不能備份指向外部的符號連接所指向的目錄文件。默認值為true。
use chroot=true
#指定該模塊的最大並發連接數量,默認值是0。
max connections=0
#指定支持max connections參數的鎖文件。
lock file=/var/run/rsyncd.lock
#指定日志記錄消息級別,默認為daemon。
#常見的消息級別是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。
syslog facility=daemon
#指定同步日志文件位置,不指定則將日志存入syslog
log file=/var/log/rsyncd.log
#如果為true,則密碼文件只能被rsync服務器運行身份的用戶訪問,其他任何用戶不可以訪問該文件。默認值為true。
strict modes=true
# 只允許指定IP的客戶端連接該模塊
# 多個IP或網段用空格隔開,“*”則表示所有,默認是允許所有主機連接。
# 網段設定示例:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
hosts allow=*
# 不允許指定IP的客戶端連接該模塊,默認不指定
hosts deny
# 是否忽略server上的IO錯誤,一般來說rsync在出現IO錯誤時將將跳過--delete操作,以防止因為暫時的資源不足或其它IO錯誤導致的嚴重問題。
ignore errors=yes
#忽略沒有訪問權限的文件。
ignore nonreadable=yes
#用ftp格式的文件來記錄下載和上載操作在單獨的日志中。
transfer logging
# 定制日志文件的字段。其格式是一個包含格式定義符的字符串
# 主要定義符及含義:
# %h遠程主機名
# %a遠程IP地址
# %l文件長度字符數
# %p該次rsync會話的進程id
# %o操作類型:"send"或"recv"
# %f文件名
# %P模塊路徑
# %m模塊名
# %t當前時間
# %u認證的用戶名(匿名時是null)
# %b實際傳輸的字節數
# %c當發送文件時,該字段記錄該文件的校驗碼
#默認log格式為:"%o %h [%a] %m (%u) %f %l",一般來說,在每行的頭上會添加"%t [%p] "。
log format=%o %h [%a] %m (%u) %f %l
# 設定同步超時時間。單位為秒鍾,0表示沒有超時定義,這也是默認值。
timeout=100
# 列表禁止客戶端使用的命令參數列表。必須使用命令全名。
refuse options
# 用來指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到忽略列表中。一個模塊只能指定一個exclude選項。
# 但是需要注意的一點是該選項有一定的安全性問題,客戶很有可能繞過exclude列表,如果希望確保特定的文件不能被訪問,那就最好結合uid/gid選項一起使用。
exclude
# 指定一個包含exclude模式的定義的文件名,服務器從該文件中讀取exclude列表定義。
exclude from
# 用來指定不排除符合要求的文件或目錄。
include
# 指定一個包含include模式的定義的文件名,服務器從該文件中讀取include列表定義。
include from
!rsyncd.secrets配置,格式為用戶名:密碼,每一行指定一個用戶。
示例:tester:123456
rsyncd.secrets文件要將權限修改為600,否則同步時會報錯。
!rsync的過濾規則
rsync按照命令行中filter規則順序建立一個有序列表。filter規則的語法如下:
rule [pattern_or_filename]
rule,modfiers [pattern_or_filename]
可以使用完整規則名稱,也可以使用簡寫名稱。如果使用簡寫形式,前面語法中rule和modefiers之間的逗號是可選的,緊跟着的pattern或filename(如果存在)之后必須有一個空格或下划線。
如果規則是從文件中讀取的,那么文件中的空白行將被忽略,以#開頭的行被視為注釋。
可用rule如下:
exclude, - :排除模式
include, + :包含模式
merge, . :指定一個merge-file,供多個規則讀取
dir-merge, : :指定一個per-directory merge-file
hide, H :指定一個模式,符合該模式的文件將被隱藏,以防止傳輸
show, S :不隱藏符合該模式的文件
protect, p :指定一個模式來防止文件被刪除
risk, R :符合該模式的文件不會被保護
clear, ! :清除當前的include/exclude模式列表(該選項無參數)
exclude和include兩個rule支持modfiers,可用modfiers如下:
/,指定include/exclude規則要匹配當前項目的絕對路徑。例如,-/ /etc/passwd,每當從/etc目錄中傳輸文件時,都要排除密碼文件。
!,告訴rsync,當模式匹配失敗時,include/exclude規則才生效。如,-! */,它將匹配所有非目錄文件。
C,該修飾符指示,所有全局的CVS-exclude規則將插入到-C的地方。該修飾符后面無參數。
s,指示規則作用於發送端。當規則對發送端生效時,它將阻止文件被傳輸。該修飾符通常用於那些在兩端都生效的規則,除非指定了--delete-excluded;它將使規則默認只在發送端生效。另一種指定發送端includes/excludes的途經是使用hide(H)和show(S)。
r,通常用來指示規則應用於接收端。當規則對接收方生效時,它將防止文件被刪除。另一種指定接收端includes/excludes的方法是,使用protect(P)和risk(R)規則。
每個--filter、--include、--exclude選項只接受一個rule/pattern,如果想添加多個rule/pattern,可以在命令行中的重復這些選項,或在--filter選項中使用merge-file語法,或使用--include-from/--exclude-from選項。
--include和--exclude是--filter選項的簡化版。
daemon過濾鏈由”filter”、”include from”、”include”、”exclude from”、”exclude”參數組成,最先匹配的模式會生效。
!rsnyc的匹配原則
1 如果”/”出現在模式的開頭,那么它標記了層級中的一個特殊位置,否則,它只是匹配路徑的結束。
因此,”/foo”將匹配”root of the transfer”中的foo(對全局規則而言),或者merge-file目錄中的foo(對per-directory規則而言)。
而未經限定的foo將匹配文件系統中任何位置的foo,因為算法是自上而下遞歸地生效,就像是路徑的每個部分輪流變成文件或目錄的結尾。
例如foo/a/b/c,算法對該路徑的解釋將會是foo/a,foo/a/b,foo/a/b/c,算法依次把a、b、c作為文件或目錄結尾。實際上,非錨定的”sub/foo”將會匹配層次結構中包含子目錄sub的,任何位置的foo。
2 如果”/”出現在模式的結尾,那么它只匹配目錄,而不匹配常規文件、鏈接,或設備。
3 rsync會檢查模式中是否包含下列通配符,以確定做簡單的字符匹配還是通配符匹配:
* :匹配路徑的任何部分,遇到斜杠終止
** :匹配任何東西,包括斜杠
? :匹配任何單個字符,斜杠(“/”)除外
[ :匹配一個字符集,如[a-z],或[[:alpha:]]
4 在通配符模式中,反斜杠(“\”)對通配符進行轉義,如果通配符不存在,它會被解釋一個普通字符
5 如果模式包含”/”(尾部的”/”不計算在內)或”**”,它將匹配完整路徑,包括前導目錄(即foo/a,既匹配a,也匹配前導的foo);如果模式不包含”/”或”**”,它只匹配路徑最后的部分。注意:算法是遞歸地應用,所以實際上“完整路徑”可能是從起始目錄向下,路徑的任何一個部分。
6 以dir_name/***結尾的模式,既匹配目錄(就像指定了dir_name/),又匹配目錄中的所有文件(就像指定了dir_name/**)。
請注意:如果使用了-r選項(-a選項隱含了此選項),那么,自頂向下,路徑的每一個部分都將被訪問,所以,include/exclude模式會遞歸地對路徑的每個組成部分生效(如,要包含/foo/bar/baz,就不能排除/foo和/foo/bar)。
當rsync尋找要發送的文件時,exclude模式實際上是rsync在歷遍目錄時的一個短路。如果一個模式排除了特定的父目錄,它就能使一個更深的include模式無法生效,因為rsync無法穿過層級中的排除部分而向下(匹配文件)。 也就是說,如果模式排除一個指定的父目錄,那么它將無法繼續匹配該父目錄下的子目錄或文件。
rsync過濾及匹配單元重點參考了 rsync三:過濾規則 ,強烈建議大家認真學習一下。