精品軟體與實用教程
Rsync詳解
1.什麼是Rsync
Rsync(remote synchronize)是一個遠端資料同步工具,可透過LAN/WAN快速同步多台主機間的檔案。 Rsync使用所謂的「Rsync演算法」來使本地和遠端兩個主機之間的檔案達到同步,這個演算法只傳送兩個檔案的不同部分,而不是每次都整份傳送,因此速度相當快。
Rsync本來是用來取代rcp的工具,目前由rsync.samba.org維護,所以rsync.conf檔案的格式類似samba的主設定檔。 Rsync可以透過rsh或ssh使用,也能以daemon模式去運行,在以daemon方式運行時Rsync server會打開一個873端口,等待客戶端去連接。連線時,Rsync server會檢查口令是否相符,若透過口令核,則可以開始進行檔案傳輸。第一次連通完成時,會把整份文件傳輸一次,以後只需進行增量備份。
Rsync支援大多數的類別Unix系統,無論是Linux、Solaris或BSD上都經過了良好的測試。此外,它在windows平台下方也有對應的版本,如cwRsync和Sync2NAS等工具。
Rsync的基本特性如下:
- 可以鏡像保存整個目錄樹和檔案系統;
- 可以輕鬆做到保持原來檔案的權限、時間、軟硬連結等;
- 無須特殊權限即可安裝;
- 優化的流程,文件傳輸效率高;
- 可以使用rsh、ssh等方式來傳輸文件,當然也可以透過直接的socket連線;
- 支援匿名傳輸。
2.Rsync同步演算法
Rsync只所以同步檔案的速度相當快,是因為「Rsync同步演算法」能在很短的時間內計算出需要備份的數據,關於Rsync的同步演算法描述如下:
假定在1號與2號兩台電腦之間同步相似的檔案A與B,其中1號對檔案A擁有存取權,2號對檔案B擁有存取權。且假定主機1號與2號之間的網路頻寬很小。那麼rsync演算法將透過下面的五個步驟來完成:
- 2號將檔案B分割成一組不重疊的固定大小為S位元組的資料區塊,最後一塊可能會比S 小。
- 2號對每一個分割好的資料塊執行兩種校驗:一種是32位元的滾動式弱校驗,另一種是128位元的MD4強校驗。
- 2號將這些校驗結果發給1號。
- 1號透過搜尋檔案A的所有大小為S的資料區塊(偏移量可以任選,不一定非要是S的倍數),來尋找與檔案B的某一塊有著相同的弱校驗碼和強校驗碼的資料區塊。這項工作可以藉助滾動校驗的特性很快完成。
- 1號發給2號一串指令來產生檔案A在2號上的備份。這裡的每一條指令要不是對檔案B經擁有某一個資料塊而不須重傳的證明,就是一個資料塊,這個資料塊肯定是沒有與檔案B的任何一個資料塊相符上的。
3.Rsync參數說明
3.1 rsyncd.conf設定文件
全域參數
在檔案中[module]之前的所有參數都是全域參數,當然也可以在全域參數部分定義模組參數,這時候該參數的值就是所有模組的預設值。
port:指定後台程式使用的連接埠號,預設為873。
motd file:"motd file"參數用來指定一個訊息文件,當客戶連接伺服器時該文件的內容顯示給客戶,預設是沒有motd檔的。
log file:"log file"指定rsync的日誌文件,而不將日誌傳送給syslog。例如可指定為“/var/log/rsyncd.log”。
pid file:指定rsync的pid文件,通常指定為「/var/run/rsyncd.pid」。
syslog facility:指定rsync發送日誌訊息給syslog時的訊息級別,常見的訊息等級是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。預設值是daemon。
模組參數
主要是定義伺服器哪個目錄要被同步。其格式必須為「[module]」形式,這個名字就是在rsync 用戶端看到的名字,其實有點象Samba伺服器提供的共享名稱。而伺服器真正同步的資料是透過path 來指定的。我們可以根據自己的需要,來指定多個模組,模組中可以定義以下參數:
comment:給模組指定一個描述,該描述連同模組名在客戶連接得到模組清單時顯示給客戶。預設沒有描述定義。
path:指定該模組的供備份的目錄樹路徑,此參數是必須指定的。
use chroot:如果"use chroot"指定為true,那麼rsync在傳輸檔案先前首先chroot到path參數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要以roots權限,並且不能備份指向外部的符號連接所指向的目錄檔案。預設chroot值為true。
uid:此選項指定當模組傳輸檔案時守護程式應該具有的uid,配合gid選項使用可以決定哪些可以存取怎麼樣的檔案權限,預設值是"nobody"。
gid:此選項指定當該模組傳輸檔案時守護程式應該具有的gid。預設值為"nobody"。
max connections:指定該模組的最大並發連接數量以保護伺服器,超過限制的連接請求將被告知隨後再試。預設值是0,也就是沒有限制。
list:此選項設定當客戶要求可以使用的模組清單時,該模組是否應該被列出。如果設定該選項為false,可以建立隱藏的模組。預設值是true。
read only:此選項設定是否允許客戶上載文件。如果為true那麼任何上載請求都會失敗,如果為false且伺服器目錄讀寫權限允許那麼上載是允許的。預設值為true。
exclude:用來指定多個由空格隔開的多個檔案或目錄(相對路徑),並將其新增至exclude清單。這等同於在客戶端指令中使用--exclude來指定模式,一個模組只能指定一個exclude選項。但是需要注意的一點是該選項有一定的安全性問題,客戶很有可能繞過exclude列表,如果希望確保特定的文件不能被訪問,那就最好結合uid/gid選項一起使用。
exclude from:指定一個包含exclude模式的定義的檔案名,伺服器從該檔案讀取exclude清單定義。
include:用來指定不排除符合要求的檔案或目錄。這等同於在客戶端指令中使用--include來指定模式,結合include和exclude可以定義複雜的exclude/include規則。
include from:指定包含include模式的定義的檔案名,伺服器從該檔案讀取include清單定義。
auth users:此選項指定由空格或逗號分隔的使用者名稱列表,只有這些使用者才允許連接該模組。這裡的使用者和系統使用者沒有任何關係。如果"auth users"被設置,那麼客戶端發出對該模組的連接請求以後會被rsync請求challenged進行驗證身份這裡使用的challenge/response認證協定。使用者的名稱和密碼以明文方式存放在"secrets file"選項指定的檔案中。預設無需密碼就可以連接模組(也就是匿名方式)。
secrets file:此選項指定一個包含定義使用者名稱:密碼對的檔案。只有在"auth users"被定義時,該文件才有作用。檔案每行包含一個username:passwd對。一般來說密碼最好不要超過8個字元。沒有預設的secures file名,需要限式指定一個(例如:/etc/rsyncd.passwd)。注意:該檔案的權限一定要是600,否則客戶端將無法連接伺服器。
strict modes:此選項指定是否監控密碼檔案的權限,如果該選項值為true那麼密碼檔案只能由rsync伺服器運行身分的使用者訪問,其他任何使用者不可以存取該檔案。預設值為true。
hosts allow:此選項指定哪些IP的客戶允許連接該模組。客戶模式定義可以是以下形式:
單一IP位址,例如:192.167.0.1
整個網段,例如:192.168.0.0/24,也可以是192.168.0.0/255.255.255.0
多個IP或網段需要用空格隔開,而「*」則表示所有,預設是允許所有主機連線。
hosts deny:指定不允許連接rsync伺服器的機器,可以使用hosts allow的定義方式來定義。預設是沒有hosts deny定義。
ignore errors:指定rsyncd在判斷是否執行傳輸時的刪除操作時忽略server上的IO錯誤,一般來說rsync在出現IO錯誤時將跳過--delete操作,以防止因為暫時的資源不足或其它IO錯誤導致的嚴重問題。
ignore nonreadable:指定rysnc伺服器完全忽略那些使用者沒有存取權限的檔案。這對於在需要備份的目錄中有些檔案是不應該被備份者得到的情況是有意義的。
lock file:指定支援max connections參數的鎖定文件,預設值是/var/run/rsyncd.lock。
transfer logging:使rsync伺服器使用ftp格式的檔案來記錄下載和上載操作在自己單獨的日誌中。
log format:透過此選項使用者在使用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] "。在原始程式碼中同時發布有一個叫做rsyncstats的perl腳本程式來統計這種格式的日誌檔。
timeout:透過此選項可以覆寫客戶指定的IP逾時時間。透過此選項可以確保rsync伺服器不會永遠等待一個崩潰的客戶端。超時單位為秒鐘,0表示沒有逾時定義,這也是預設值。對於匿名rsync伺服器來說,一個理想的數字是600。
refuse options:透過此選項可以定義一些不允許客戶對該模組使用的指令參數清單。這裡必須使用指令全名,不能是簡稱。但發生拒絕某個指令的情況時伺服器將報告錯誤訊息然後退出。如果要防止使用壓縮,應該是:"dont compress = *"。
dont compress:用來指定那些不進行壓縮處理再傳輸的文件,預設值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
3.2 Rsync命令
在對rsync伺服器設定結束以後,下一步就需要在客戶端發出rsync命令來實現將伺服器端的檔案備份到客戶端來。 rsync是一個功能非常強大的工具,其指令也有很多功能特色選項,我們以下就對它的選項一一進行分析說明。
Rsync的命令格式可以為以下六種:
- rsync [OPTION]... SRC DEST
- rsync [OPTION]... SRC [USER@]HOST:DEST
- rsync [OPTION]... [USER@]HOST:SRC DEST
- rsync [OPTION]... [USER@]HOST::SRC DEST
- rsync [OPTION]... SRC [USER@]HOST::DEST
- rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
對應以上六種指令格式,rsync有六種不同的工作模式:
- 拷貝本地文件。當SRC和DES路徑資訊都不包含單一冒號":"分隔符號時就啟動這種工作模式。如:rsync -a /data /backup
- 使用一個遠端shell程式(如rsh、ssh)來實現將本機的內容拷貝到遠端機器。當DST路徑位址包含單一冒號":"分隔符號時啟動該模式。如:rsync -avz *.c foo:src
- 使用一個遠端shell程式(如rsh、ssh)來實現將遠端機器的內容拷貝到本機。當SRC位址路徑包含單一冒號":"分隔符號時啟動該模式。如:rsync -avz foo:src/bar /data
- 從遠端rsync伺服器中拷貝檔案到本機。當SRC路徑資訊包含"::"分隔符號時啟動該模式。如:rsync -av root@172.16.78.192::www /databack
- 從本地機器拷貝檔案到遠端rsync伺服器。當DST路徑資訊包含"::"分隔符號時啟動該模式。如:rsync -av /databack root@172.16.78.192::www
- 列遠端機的文件清單。這類似於rsync傳輸,不過只要在指令中省略掉本地機資訊即可。如:rsync -v rsync://172.16.78.192/www
rsync參數的具體解釋如下:
- -v, --verbose 詳細模式輸出
- -q, --quiet 精簡輸出模式
- -c, --checksum 開啟校驗開關,強制對檔案傳輸進行校驗
- -a, --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性,等於-rlptgoD
- -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一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件
- --existing 僅僅更新那些已經存在於DST的文件,而不備份那些新建立的文件
- --delete 刪除那些DST中SRC沒有的文件
- --delete-excluded 同樣刪除接收端那些被該選項指定排除的文件
- --delete-after 傳輸結束以後再刪除
- --ignore-errors 及時出現IO錯誤也進行刪除
- --max-delete=NUM 最多刪除NUM個文件
- --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中的檔案來決定是否需要備份
- -P 等同於--partial
- --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 顯示幫助訊息
rsync在liunx下的配置
Rsync 3.2.4 版本發布
2022 年4 月15 日
Rsync 版本3.2.4 已經發布。另一個帶有錯誤修復和一些增強功能的典型版本。它還包含捆綁的zlib 1.2.8 的 安全修復程式 ,可能會或可能不會在您的特定建置配置中使用。
注意:現在有一個補丁可以 在“-pedantic-errors”生效時修復“signed char”的配置檢查。這適用於「char」預設為「unsigned char」的系統(例如ARM 系統)並將rsync 演算法返回到完全效率(沒有補丁,傳輸會發送更多文字資料而不是查找匹配的本機資料)。
請參閱3.2.4 新聞 了解詳細的變更日誌。最新的線上說明頁面也可用於:
源tar 可在此處取得: rsync-3.2.4.tar.gz (簽名),「補丁」目錄的tar 檔案在單獨的檔案中發布: rsync-patches-3.2.4.tar.gz (簽名),並且3.2.2 版本的差異可在此處獲得: rsync-3.2.3-3.2.4.diffs.gz (簽名)。
rsync伺服器配置
- 安裝rsync 略
- 修改設定檔Vim etc/rsyncd.conf
uid=root
gid=root
max connections=4
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
secrets file=/etc/rsyncd.pwd
hosts allow = 10.10.0.200
hosts deny = 0.0.0.0/0
[oa]
path=/home/sxit/appbak
comment = backup file
ignore errors
read only = no
list = yes
auth users = root
- 建pwd文件,並修改文件權限
Vim rsyncd.pwd
root:password
Chmod 600 rsyncd.pwd
- 啟動/usr/bin/rsync –daemon --config=/etc/rsyncd.conf 可能需要root權限
(查看/etc/init.d/rsyncd和/etc/xinetd.d/rsync文件,決定服務是由超級守護程序啟動,還是獨立程序啟動 Service xinetd start / service rsyncd start )
Rsync10.10.0.200客戶端配置
- 建存放密碼的文件
Vim /etc/rsyncd.pwd
Password
Chmod 600 rsyncd.pwd
- 同步伺服器資料/usr/bin/rsync –vazp –progress –password-file=/etc/rsyncd.pwd root@10.10.1.3::oa /home1/sxit/appbak(本地存放目錄)
- 可以把此命令放入計劃中,定時執行
Vim /etc/crontab
01 04 * * * root /usr/bin/rsync -vzau --progress --password-file=/etc/rsyncd.pwd root@10.10.1.3::oa /home1/sxit/appbak
rsync在windows下的配置
Rsync伺服器端配置
- 安裝rsync
rsync 官方網站:
https://rsync.samba.org/
[ WINDOWS RSYNC 服務端 ]
https://itefix.net/dl/free-software/cwrsync_6.2.4_x64_free.zip
https://itefix.net/dl/free-software/cwrsync_5.5.0_x86_free.zip
選擇安裝路徑 E:\cwRsyncServer , 註: rsync 是作為cgywin的一個包裝到windows下的
安裝時 Rsync 會做下面的工作
a. 新建一個使用者SvcwRsync 而這個使用者是管理者使用者 會產生密碼。
b. 設定好安裝目錄的權限E:\cwRsyncServer , 請不要自行變更權限
c. 建立服務RsyncServer
低版本中可能需要手工做上面的步驟, 並需要像下面相同手工創建服務, 不過這裡3個步驟安裝程序都已做好了
cygrunsrv.exe -I "Rsync" -p /cygdrive/d/cwRsyncServer/bin/rsync.exe -a "--config=/cygdrive/d/cwRsyncServer/etc/rsyncd.conf --daemon --no-detach"
-f "Rsync" -u Administrator -w 123456
- 修改設定檔conf
use chroot = false
strict modes = false
hosts allow = 10.10.1.3
log file = rsyncd.log
pid file = rsyncd.pid
secrets file = /cygdrive/e/cwRsyncServer/etc/rsyncd.txt
# Module definitions
# Remember cygwin naming conventions : c:\work becomes /cygwin/c/work
#
[郵件]
path = /cygdrive/d/MDaemon/Users
read only = false
ignore errors
auth users = root
transfer logging = yes
- 建帳號分配權限
在設定檔中我用的帳號是root,因此要新建root帳號,設定密碼,把root帳號加入管理員群組,並給予root帳號d/MDaemon/Users中完全控制權限
- 建立txt檔案
root:password
- 啟動服務
在服務中啟動rsyncserver 服務,設定為自動啟動正常的話可以看到873埠在監聽
Rsync客戶端配置
- 新建存放密碼文件
Vim /etc/rsync.pwd
Password
Chmod 600 rsync.pwd
2 、/usr/bin/rsync –auv –progress –password-file=/etc/rsync.pwd root@10.10.3.1::mail /home/maiusers (不加參數Z的,加了以後可以連接,但是不能傳輸檔案)