以 rsync 進行遠端同步備份
rsync 是 Linux 當用的遠端檔案的備份、同步程式,目前由 samba 的團隊在發展,它有它自己的演算法,可以很有效率的傳輸檔案,支援 rsh 及 ssh 加密傳輸,應該是目前最常被做為資料同步或異地備援的工具。
大部份的 Linux 應該都有安裝 rsync 了,如果沒有,直接用 yum 安裝即可:
yum install rsync xinetd
本文章只有說到 Linux 上最基本的備份、同步方式,如果你要知道與 Windows 或 ssh 有關的實作方式,目前沒有。
名詞解釋
不知是否有人會誤解下列的名詞,不過,一開始使用 rsync 我就有點誤解了,所以先說明如下:
- 備份伺服器: 有執行 rsync 服務的伺服器,等待其它客戶端將檔案傳輸過來做備份。
- 用戶端: 在本地端執行 /usr/bin/rsync,將檔案傳到遠端的「備份伺服器」做備份。
啟動備份伺服器
在備份伺服器編輯 /etc/xinetd.d/rsync,找到
disable = yes
改為
disable = no
儲存後,執行
service xinetd restart
如果執行時出現「xinetd: 服務未能辨識」,請安裝 xinetd:
yum install xinetd
另外,rsync 的 port 是 873,在防火牆中必須允許通過。否則用戶端在同步時會出現類似下面的錯誤訊息:
rsync: failed to connect to 192.168.1.2: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
備份伺服器的設定檔
rsync 服務的設定檔主要有兩個,一個是 /etc/rsyncd.conf,一個是自訂的密碼檔。
rsyncd.conf 的設定格式如下:
#中括號內的文字是自訂的備份代號,設定檔內可以有多個備份代號,每個代號之下可以有自已的設定 #以下這一行是 log 檔的位置(非必要) log file = /var/log/rsync.log [Username] #備份之檔案的存放路徑 (請先建立好路徑,並且要讓下面的 uid 及 gid 可以寫入檔案) path = /var/backup/Username #驗證的用戶名稱 (此名稱只需存在於密碼檔裡面即可) auth users = Username #密碼檔的位置 secrets file = /etc/rsync/server.password #允許用戶的來源 hosts allow = 192.168.1.0/24 192.168.2.0/24 #執行程式時所使用的用戶及群組名稱,同時也會成為備份之後檔案的擁有者及擁有群組 uid = root gid = root read only = no
(這裡有個技巧,我通常會將「備份代號」、「存放路徑」及「用戶名稱」設為相同的名稱,這樣就很容易做為識別了)
我在 rsync.conf 內所設定的密碼檔位置為 /etc/rsync/server.password,這個密碼檔只是一個純文字檔,每一列一個用戶,密碼也僅是明碼而已。每一列的格式如下:
Username:UserPassword
新增密碼檔之後,要將權限設為 600 (如不設定權限為 600,則啟動 rsync 服務時會有錯誤):
chmod 600 /etc/rsync/server.password
完成設定檔之後不須要再重新啟動 xinetd。
用戶端
用戶端所需要做的僅是執行 /usr/bin/rsync。rsync 做為同步處理時,常用的參數如下:
- -a, --archive: 這最常被使用的參數,相當於同時使用 -rlptgoD,即: *
- -r: 子目錄遞迴
- -l: 複製符號連結
- -p: 複製檔案權限
- -t: 複製時間屬性
- -g: 複製群組屬性
- -o: 複製擁有者屬性
- -D: 複製裝置屬性
- -v, --verbose: 顯示詳細資訊 *
- -z, --compress: 壓縮傳輸的資料,以減少傳輸量 *
- -R, --relative: 備份後,使用用戶端完整的路徑 (不加此參數,則為相對路徑)
- -H, --hard-links: 保留檔案的連結 *
- -S, --sparse: 使有比較有效率的方式處理零散的檔案 *
- -P: 等同加了 --partial --progress,即: *
- --partial: 保留傳輸中斷的檔案以進行續傳
- --progress: 即時顯示檔案傳輸的進度
- -q: 如果沒有錯誤,則不輸出任何訊息
- --delete: 用戶端如果刪掉檔案,則備份伺服器也同時刪除該檔案,以保持兩邊檔案的一致 *
- --password-file: 密碼檔的位置 (如不輸入此參數,則程式執行時會詢問你) *
上面有加「*」者是我每次都會使用的參數
用戶端的密碼檔也是純文字檔,同樣是使用明碼,就是備份伺服器所設定的那個密碼。例如我的密碼檔放在 /etc/rsync/client.password,那檔案的內容就是:
UserPassword
新增密碼檔之後,同樣要將權限設為 600:
chmod 600 /etc/rsync/client.password
再來就是進行檔案的傳輸了,rsync 指令的語法如下:
/usr/bin/rsync [-參數] [--參數] [備份來源路徑] [備份目的路徑]
遠端同步的語法:
/usr/bin/rsync [-參數] [--參數] [--password-file=密碼檔位置] [本地端備份來源路徑] [用戶名稱@遠端備份伺服器位址::備份代號]
假設我要將本地端的 /var/www/html 下的檔案傳輸到備份伺服器 (備份伺服器的 IP 是「192.168.1.2」),那我就執行:
/usr/bin/rsync -avzHSP --delete --password-file=/etc/rsync/client.password /var/www/html Username@192.168.1.2::Username
第一次執行時,傳輸檔案的所花費的時間會比較長,第二次執行就只會傳輸有新增或更新過的檔案,時間就會縮短很多。
請注意備份來源 /var/www/html 的後面有沒有多一個 / 的結果會差很多,有 / 的話那同步過去的會是 /var/www/html 裡面的內容,即: /var/www/html/*,並不包含 html 的目錄本身。沒有 / 的話會在目標路徑建立一個 html 目錄,目錄下才是 /var/www/html 裡面的內容。至於「備份目的」有沒有加 / 的結果都一樣。
檔案傳輸完成之後,到備份伺服器的 /var/backup/Username 下查看,就會多出一個 html 目錄,這就是剛剛 rsync 傳輸過去的檔案。
將以上的指令加到系統的 crontab 就可以定時同步檔案了。
錯誤處理
1. No route to host
rsync: failed to connect to 192.168.1.2: No route to host (113) rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
原因: 遠端的 rsync server 未於防火牆允許 Port 873 通過。可嘗試用 telnet 來測試 port 是否可用:
$ telnet 192.168.1.2 873 Trying 192.168.1.2... telnet: connect to address 192.168.1.2: No route to host
2. Connection refused
rsync: failed to connect to 192.168.1.2: Connection refused (111) rsync error: error in socket IO (code 10) at clientserver.c(124) [sender=3.0.6]
原因: 遠端的 rsync server 未正確啟動。
3. connection unexpectedly closed
rsync: connection unexpectedly closed (0 bytes read so far) rsync error: error in rsync protocol data stream (code 12) at io.c
原因不明,請更新 rsync 後重新開機、重新啟動 rsync server。
4. 其它
通常 rsync 在同步時,如有錯誤會在第一行以 @ERROR 開頭顯示,Ex:
@ERROR: auth failed on module rsync: connection unexpectedly closed (92 bytes read so far) rsync error: error in rsync protocol data stream (code 12) at io.c
以 @ERRROR 後面的訊息去判斷,或是去搜尋就可以找到錯誤的原因。
No comments yet.