一、rsync 簡介
Rsync(remote synchronize)是一個遠端資料同步工具,可透過LAN/WAN快速同步多臺主機間的檔案,也可以使用 Rsync 同步本地硬碟中的不同目錄。
Rsync 是用於取代rcp的一個工具,Rsync使用所謂的 “Rsync 演算法” 來使本地和遠端兩個主機之間的檔案達到同步,這個演算法只傳送兩個檔案的不同部分,而不是每次都整份傳送,因此速度相當快。您可以參考 How Rsync Works A Practical Overview 進一步瞭解 rsync 的運作機制。
Rsync支援大多數的類Unix系統,無論是Linux、Solaris還是BSD上都經過了良好的測試。此外,它在windows平臺下也有相應的版本,比較知名的有cwRsync和Sync2NAS。
Rsync 的初始作者是 Andrew Tridgell 和 Paul Mackerras,它當前由 http://rsync.samba.org維護。
Rsync的基本特點如下:
1. 可以映象儲存整個目錄樹和檔案系統;
2. 可以很容易做到保持原來檔案的許可權、時間、軟硬連結等;
3. 無須特殊許可權即可安裝;
4. 最佳化的流程,檔案傳輸效率高;
5. 可以使用rcp、ssh等方式來傳輸檔案,當然也可以透過直接的socket連線;
6. 支援匿名傳輸,以方便進行網站映象。
在使用 rsync 進行遠端同步時,可以使用兩種方式:遠端 Shell 方式(建議使用 ssh,使用者驗證由 ssh 負責)和 C/S 方式(即客戶連線遠端 rsync 伺服器,使用者驗證由 rsync 伺服器負責)。
無論本地同步目錄還是遠端同步資料,首次執行時將會把全部檔案複製一次,以後再執行時將只複製有變化的檔案(對於新檔案)或檔案的變化部分(對於原有檔案)。
rsync 在首次複製時沒有速度優勢,速度不如 tar,因此當資料量很大時您可以考慮先使用 tar 進行首次複製,然後再使用 rsync 進行資料同步。
二、系統環境
系統平臺:CentOS release 6.3 (Final)
rsync 版本:rsync-3.0.9-2.el6.rfx.x86_64.rpm
rsync 客戶端:TS-CLIENT (172.16.1.136)
三、伺服器端安裝rsync服務
3.1. 檢查rsync 是否已經安裝
# rpm -qa|grep rsync
若已經安裝,則使用rpm -e 命令解除安裝。
3.2. 下載RPM包
# wget http://pkgs.repoforge.org/rsync/rsync-3.0.9-2.el6.rfx.x86_64.rpm
3.3. 安裝rsync
# rpm -ivh rsync-3.0.9-2.el6.rfx.x86_64.rpm
四、配置 rsync 服務
4.1. 配置 rsync 伺服器的步驟
-
首先要選擇伺服器啟動方式
-
對於負荷較重的 rsync 伺服器應該使用獨立執行方式
-
對於負荷較輕的 rsync 伺服器可以使用 xinetd 執行方式
-
-
建立配置檔案 rsyncd.conf
-
對於非匿名訪問的 rsync 伺服器還要建立認證口令檔案
4.2. 以 xinetd 執行 rsync 服務
CentOS 預設以 xinetd 方式執行 rsync 服務。rsync 的 xinetd 配置檔案
在 /etc/xinetd.d/rsync。要配置以 xinetd 執行的 rsync 服務需要執行如下的命令:
# chkconfig rsync on # service xinetd restart
管理員可以修改 /etc/xinetd.d/rsync 配置檔案以適合您的需要。例如,您可以修改配置行
server_args = --daemon
在後面新增 rsync 的服務選項。
4.3. 獨立執行 rsync 服務
最簡單的獨立執行 rsync 服務的方法是執行如下的命令:
# /usr/bin/rsync --daemon
您可以將上面的命令寫入 /etc/rc.local 檔案以便在每次啟動伺服器時執行 rsync 服務。當然,您也可以寫一個指令碼在開機時自動啟動 rysnc 服務。
4.4. 配置檔案 rsyncd.conf
兩種 rsync 服務執行方式都需要配置 rsyncd.conf,其格式類似於 samba 的主配置檔案。
配置檔案 rsyncd.conf 預設在 /etc 目錄下。為了將所有與 rsync 服務相關的檔案放在單獨的目錄下,可以執行如下命令:
# mkdir /etc/rsyncd # touch /etc/rsyncd/rsyncd.conf # ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
配置檔案 rsyncd.conf 由全域性配置和若干模組配置組成。配置檔案的語法為:
-
模組以 [模組名] 開始
-
引數配置行的格式是 name = value ,其中 value 可以有兩種資料型別:
-
字串(可以不用引號定界字串)
-
布林值(1/0 或 yes/no 或 true/false)
-
-
以 # 或 ; 開始的行為註釋
-
\ 為續行符
全域性引數
在檔案中 [module] 之外的所有配置行都是全域性引數。當然也可以在全域性引數部分定義模組引數,這時該引數的值就是所有模組的預設值。
引數 | 說明 | 預設值 |
---|---|---|
address | 在獨立執行時,用於指定的伺服器執行的 IP 地址。由 xinetd 執行時將忽略此引數,使用命令列上的 –address 選項替代。 | 本地所有IP |
port | 指定 rsync 守護程式監聽的埠號。 由 xinetd 執行時將忽略此引數,使用命令列上的–port 選項替代。 | 873 |
motd file | 指定一個訊息檔案,當客戶連線伺服器時該檔案的內容顯示給客戶。 | 無 |
pid file | rsync 的守護程式將其 PID 寫入指定的檔案。 | 無 |
log file | 指定 rsync 守護程式的日誌檔案,而不將日誌傳送給 syslog。 | 無 |
syslog facility | 指定 rsync 傳送日誌訊息給 syslog 時的訊息級別。 | daemon |
socket options | 指定自定義 TCP 選項。 | 無 |
模組引數
模組引數主要用於定義 rsync 伺服器哪個目錄要被同步。模組宣告的格式必須為 [module] 形式,這個名字就是在 rsync 客戶端看到的名字,類似於 Samba 伺服器提供的共享名。而伺服器真正同步的資料是透過 path 來指定的。可以根據自己的需要,來指定多個模組,模組中可以定義以下引數:
a. 基本模組引數
引數 | 說明 | 預設值 |
---|---|---|
path | 指定當前模組在 rsync 伺服器上的同步路徑,該引數是必須指定的。 | 無 |
comment | 給模組指定一個描述,該描述連同模組名在客戶連線得到模組列表時顯示給客戶。 | 無 |
b. 模組控制引數
引數 | 說明 | 預設值 |
---|---|---|
use chroot | 若為 true,則 rsync 在傳輸檔案之前首先 chroot 到 path 引數所指定的目錄下。這樣做的原因是實現額外的安全防護,但是缺點是需要 root 許可權,並且不能備份指向 path 外部的符號連線所指向的目錄檔案。 | true |
uid | 指定該模組以指定的 UID 傳輸檔案。 | nobody |
gid | 指定該模組以指定的 GID 傳輸檔案。 | nobody |
max connections | 指定該模組的最大併發連線數量以保護伺服器,超過限制的連線請求將被告知隨後再試。 | 0(沒有限制) |
lock file | 指定支援 max connections 引數的鎖檔案。 | /var/run/rsyncd.lock |
list | 指定當客戶請求列出可以使用的模組列表時,該模組是否應該被列出。如果設定該選項為 false,可以建立隱藏的模組。 | true |
read only | 指定是否允許客戶上傳檔案。若為 true 則不允許上傳;若為 false 並且伺服器目錄也具有讀寫許可權則允許上傳。 | true |
write only | 指定是否允許客戶下載檔案。若為 true 則不允許下載;若為 false 並且伺服器目錄也具有讀許可權則允許下載。 | false |
ignore errors | 指定在 rsync 伺服器上執行 delete 操作時是否忽略 I/O 錯誤。一般來說 rsync 在出現 I/O 錯誤時將將跳過 –delete 操作,以防止因為暫時的資源不足或其它 I/O 錯誤導致的嚴重問題。 | true |
ignore nonreadable | 指定 rysnc 伺服器完全忽略那些使用者沒有訪問許可權的檔案。這對於在需要備份的目錄中有些不應該被備份者獲得的檔案時是有意義的。 | false |
timeout | 該選項可以覆蓋客戶指定的 IP 超時時間。從而確保 rsync 伺服器不會永遠等待一個崩潰的客戶端。對於匿名 rsync 伺服器來說,理想的數字是 600(單位為秒)。 | 0 (未限制) |
dont compress | 用來指定那些在傳輸之前不進行壓縮處理的檔案。該選項可以定義一些不允許客戶對該模組使用的命令選項列表。必須使用選項全名,而不能是簡稱。當發生拒絕某個選項的情況時,伺服器將報告錯誤資訊然後退出。例如,要防止使用壓縮,應該是:”dont compress = *”。 | *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz |
c. 模組檔案篩選引數
引數 | 說明 | 預設值 |
---|---|---|
exclude | 指定多個由空格隔開的多個檔案或目錄(相對路徑),並將其新增到 exclude 列表中。這等同於在客戶端命令中使用 –exclude 來指定模式。 | 空 |
exclude from | 指定一個包含 exclude 規則定義的檔名,伺服器從該檔案中讀取 exclude 列表定義。 | 空 |
include | 指定多個由空格隔開的多個檔案或目錄(相對路徑),並將其新增到 include 列表中。這等同於在客戶端命令中使用 –include 來指定模式 。 | 空 |
include from | 指定一個包含 include 規則定義的檔名,伺服器從該檔案中讀取 include 列表定義。 | 空 |
- 一個模組只能指定一個exclude 引數、一個include 引數。
- 結合 include 和 exclude 可以定義複雜的exclude/include 規則 。
- 這幾個引數分別與相應的rsync 客戶命令選項等價,唯一不同的是它們作用在伺服器端。
- 關於如何書寫規則檔案的內容請參考http://www.howtocn.org/rsync:use_rsync。
d. 模組使用者認證引數
引數 | 說明 | 預設值 |
---|---|---|
auth users | 指定由空格或逗號分隔的使用者名稱列表,只有這些使用者才允許連線該模組。這裡的使用者和系統使用者沒有任何關係。使用者名稱和口令以明文方式存放在 secrets file 引數指定的檔案中。 | (匿名方式) |
secrets file | 指定一個 rsync 認證口令檔案。只有在 auth users 被定義時,該檔案才起作用。 | 空 |
strict modes | 指定是否監測口令檔案的許可權。若為 true 則口令檔案只能被 rsync 伺服器執行身份的使用者訪問,其他任何使用者不可以訪問該檔案。 | true |
- rsync 認證口令檔案的許可權一定是 600,否則客戶端將不能連線伺服器。
- rsync 認證口令檔案中每一行指定一個 使用者名稱:口令 對,格式為:
username:passwd
- 一般來說口令最好不要超過8個字元。若您只配置匿名訪問的 rsync 伺服器,則無需設定上述引數。
e. 模組訪問控制引數
引數 | 說明 | 預設值 |
---|---|---|
hosts allow | 用一個主機列表指定哪些主機客戶允許連線該模組。不匹配主機列表的主機將被拒絕。 | * |
hosts deny | 用一個主機列表指定哪些主機客戶不允許連線該模組。 | 空 |
客戶主機列表定義可以是以下形式:
- 單個IP地址。例如:192.168.0.1
- 整個網段。例如:192.168.0.0/24,192.168.0.0/255.255.255.0
- 可解析的單個主機名。例如:centos,centos.bsmart.cn
- 域內的所有主機。例如:*.bsmart.cn
- “*”則表示所有。
- 多個列表項要用空格間隔。
f. 模組日誌引數
引數 | 說明 | 預設值 |
---|---|---|
transfer logging | 使 rsync 伺服器將傳輸操作記錄到傳輸日誌檔案。 | false |
log format | 指定傳輸日誌檔案的欄位。 | ”%o %h [%a] %m (%u) %f %l” |
設定了”log file”引數時,在日誌每行的開始會新增”%t [%p]“。
- %a - 遠端IP地址
- %h - 遠端主機名
- %l - 檔案長度字元數
- %p - 該次 rsync 會話的 PID
- %o - 操作型別:”send” 或 “recv”
- %f - 檔名
- %P - 模組路徑
- %m - 模組名
- %t - 當前時間
- %u - 認證的使用者名稱(匿名時是 null)
- %b - 實際傳輸的位元組數
- %c - 當傳送檔案時,記錄該檔案的校驗碼
五、rsync 伺服器應用案例
5.1. 在伺服器端TS-DEV上配置rsync 服務
a. 編輯配置檔案
# vi /etc/rsyncd/rsyncd.conf
# Minimal configuration file for rsync daemon # See rsync(1) and rsyncd.conf(5) man pages for help # This line is required by the /etc/init.d/rsyncd script
# GLOBAL OPTIONS uid = root gid = root
use chroot = no
read only = yes #limit access to private LANs hosts allow=172.16.0.0/255.255.0.0 192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0 hosts deny=*
max connections = 5
pid file = /var/run/rsyncd.pid
secrets file = /etc/rsyncd/rsyncd.secrets
#lock file = /var/run/rsync.lock
motd file = /etc/rsyncd/rsyncd.motd #This will give you a separate log file log file = /var/log/rsync.log #This will log every file transferred - up to 85,000+ per user, per sync transfer logging = yes log format = %t %a %m %f %b syslog facility = local3 timeout = 300
# MODULE OPTIONS [davidhome] path = /home/david/ list=yes ignore errors auth users = david comment = David home exclude = important/ [chinatmp] path = /tmp/china/ list=no ignore errors auth users = china comment = tmp_china
b. 建立/etc/rsyncd/rsyncd.secrets檔案
# vim /etc/rsyncd/rsyncd.secrets
david:asdf #格式 使用者名稱:口令
china:jk #該使用者不要求是系統使用者
c. 為了密碼的安全性,我們把許可權設為600
# chown root:root /etc/rsyncd/rsyncd.secrets
# chmod 600 /etc/rsyncd/rsyncd.secrets
d. 建立連線到伺服器的客戶端看到的歡迎資訊檔案/etc/rsyncd/rsyncd.motd
# vim /etc/rsyncd/rsyncd.motd
+++++++++++++++++++++++++++
+ David Camp +
+++++++++++++++++++++++++++
e. 啟動rsync
# /etc/init.d/xinetd restart
f. 檢視873埠是否起來
# netstat -an | grep 873
如果rsync啟動成功的話可以看到873埠已經在監聽了。
g. 伺服器端檔案詳細
5.2. 客戶端配置
a. 客戶端安裝rsync
# yum -y install rsync
b. 透過rsync客戶端來同步資料
場景一:
# rsync -avzP david@172.16.1.135::davidhome /tmp/david/
Password: 這裡要輸入david的密碼,是伺服器端提供的,在前面的例子中,我們用的是 asdf,輸入的密碼並不顯示出來;輸好後就回車;
注: 這個命令的意思就是說,用david 使用者登入到伺服器上,把davidhome資料,同步到本地目錄/tmp/david/上。當然本地的目錄是可以你自己定義的,比如 dave也是可以的;當你在客戶端上,當前操作的目錄下沒有davidhome這個目錄時,系統會自動為你建立一個;當存在davidhome這個目錄中,你要注意它的寫許可權。
說明:
-a 引數,相當於-rlptgoD,-r 是遞迴 -l 是連結檔案,意思是複製連結檔案;-p 表示保持檔案原有許可權;-t 保持檔案原有時間;-g 保持檔案原有使用者組;-o 保持檔案原有屬主;-D 相當於塊裝置檔案;
-z 傳輸時壓縮;
-P 傳輸進度;
-v 傳輸時的進度等資訊,和-P有點關係,自己試試。可以看文件;
場景二:
# rsync -avzP --delete david@172.16.1.135::davidhome /tmp/david/
這回我們引入一個 –delete 選項,表示客戶端上的資料要與伺服器端完全一致,如果 /tmp/david/目錄中有伺服器上不存在的檔案,則刪除。最終目的是讓/tmp/david/目錄上的資料完全與伺服器上保持一致;用的時候要小心點,最好不要把已經有重要數所據的目錄,當做本地更新目錄,否則會把你的資料全部刪除;
場景三:
# rsync -avzP --delete --password-file=/tmp/rsync.password david@172.16.1.135::davidhome /tmp/david/
這次我們加了一個選項 –password-file=rsync.password ,這時當我們以david使用者登入rsync伺服器同步資料時,密碼將讀取 /tmp/rsync.password 這個檔案。這個檔案內容只是david使用者的密碼。我們要如下做;
# touch /tmp/rsync.password
# chmod 600 /tmp/rsync.password
# echo "asdf"> /tmp/rsync.password
# rsync -avzP --delete --password-file=/tmp/rsync.password david@172.16.1.135::davidhome /tmp/david/
注: 這樣就不需要密碼了;其實這是比較重要的,因為伺服器透過crond 計劃任務還是有必要的;
5.3. rsync 客戶端自動與伺服器同步資料
編輯crontab
# crontab -e
加入如下程式碼:
10 0 * * * rsync -avzP --delete --password-file=/tmp/rsync.password david@172.16.1.135::davidhome /tmp/david/
表示每天0點10分執行後面的命令。
六、錯誤分析
rsync: opendir "." (in xxxxxxx) failed: Permission denied (13)
解決辦法:
1、將 selinux 對 rsync 的限制全部去掉:
# /usr/sbin/setsebool -P rsync_disable_trans 1
# service xinetd restart
2、狠一點,禁止整個 selinux :
# vim /etc/selinux/config
將其中的 SELINUX=enforcing 修改為 SELINUX=disabled
儲存退出後,重啟機器。
至此,rsync伺服器配置完畢。
七、參考
關於rsync 命令的使用,請參考:http://www.howtocn.org/rsync:use_rsync
關於rsync 服務的詳細說明,請參考:http://www.howtocn.org/rsync:use_rsync_server
David Camp
- 技術交流,請加QQ群:
系統運維技術分享:296513821
- 業務合作,請聯絡作者QQ:562866602
- 我的微訊號:mchina_tang
- 給我寫信:mchina_tang@qq.com
- 我的地址:江蘇·蘇州
我們永遠相信,分享是一種美德 | We Believe, Great People Share Knowledge...