一、介紹 (不想看直接可以跳過)
Rsync是一個遠端資料同步工具,可通過LAN/WAN快速同步多台主機間的檔案。Rsync本來是用以取代rcp的一個工具,它目前由 rsync.samba.org維護。Rsync使用所謂的“Rsync演算法”來使本地和遠端兩個主機之間的檔案達到同步,這個算法隻傳送兩個檔案的不同部分,而不是每次都整份傳送,是以速度相當快。運作Rsync server的機器也叫backup server,一個Rsync server可同時備份多個client的資料;也可以多個Rsync server備份一個client的資料。
Rsync可以搭配rsh或ssh甚至使用daemon模式。Rsync server會打開一個873的服務通道(port),等待對方Rsync連接配接。連接配接時,Rsync server會檢查密碼是否相符,若通過密碼查核,則可以開始進行檔案傳輸。第一次連通完成時,會把整份檔案傳輸一次,下一次就隻傳送二個檔案之間不同的部份。
Rsync支援大多數的類Unix系統,無論是Linux、Solaris還是BSD上都經過了良好的測試。此外,它在windows平台下也有相應的版本,比較知名的有cwRsync和Sync2NAS。
Rsync的基本特點如下:
1.可以鏡像儲存整個目錄樹和檔案系統;
2.可以很容易做到保持原來檔案的權限、時間、軟硬連結等;
3.無須特殊權限即可安裝;
4.優化的流程,檔案傳輸效率高;
5.可以使用rcp、ssh等方式來傳輸檔案,當然也可以通過直接的socket連接配接;
6.支援匿名傳輸。
二、核心算法介紹:
假定在名為α和β的兩台計算機之間同步相似的檔案A與B,其中α對檔案A擁有通路權,β對檔案B擁有通路權。并且假定主機α與β之間的網絡帶寬很小。那麼rsync算法将通過下面的五個步驟來完成:
1.β将檔案B分割成一組不重疊的固定大小為S位元組的資料塊。最後一塊可能會比S 小。
2.β對每一個分割好的資料塊執行兩種校驗:一種是32位的滾動弱校驗,另一種是128位的MD4強校驗。
3.β将這些校驗結果發給α。
4.α通過搜尋檔案A的所有大小為S的資料塊(偏移量可以任選,不一定非要是S的倍數),來尋找與檔案B的某一塊有着相同的弱校驗碼和強校驗碼的資料塊。這項工作可以借助滾動校驗的特性很快完成。
5.α發給β一串指令來生成檔案A在β上的備份。這裡的每一條指令要麼是對檔案B經擁有某一個資料塊而不須重傳的證明,要麼是一個資料塊,這個資料塊肯定是沒有與檔案B的任何一個資料塊比對上的。
指令:
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有六種不同的工作模式:
1)拷貝本地檔案。當SRC和DES路徑資訊都不包含有單個冒号":"分隔符時就啟動這種工作模式。
2)使用一個遠端shell程式(如rsh、ssh)來實作将本地機器的内容拷貝到遠端機器。當DST路徑位址包含單個冒号":"分隔符時啟動該模式。
3)使用一個遠端shell程式(如rsh、ssh)來實作将遠端機器的内容拷貝到本地機器。當SRC位址路徑包含單個冒号":"分隔符時啟動該模式。
4)從遠端rsync伺服器中拷貝檔案到本地機。當SRC路徑資訊包含"::"分隔符時啟動該模式。
5)從本地機器拷貝檔案到遠端rsync伺服器中。當DST路徑資訊包含"::"分隔符時啟動該模式。
6)列遠端機的檔案清單。這類似于rsync傳輸,不過隻要在指令中省略掉本地機資訊即可。
三、安裝
系統介紹:
1
2
3
4
5
<code>root@ubuntu-rsync:~# cat /etc/issue</code>
<code>Ubuntu 12.04.1 LTS \n \l</code>
<code>root@ubuntu-rsync:~# uname -a</code>
<code>Linux ubuntu-rsync 3.2.0-29-generic #46-Ubuntu SMP Fri Jul 27 17:03:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux</code>
<code>root@ubuntu-rsync:~#</code>
安裝步驟:
注:如下操作部落客隻對上述作業系統和版本進行測試,博友僅供參考
步驟一
安裝依賴包gcc
更新系統apt源
<code>apt-get update</code>
安裝gcc
<code>apt-get install gcc</code>
步驟二
由于系統沒有安裝make指令,是以需要在安裝rsync之前需要把mack指令安裝上
apt-get install make
步驟三
配置被備份端
目前版本大概是 rsync-3.1.1.tar.gz
上傳軟體至root目錄解壓
<code>tar -zxvf rsync-3.1.1.tar.gz </code>
<code>cd rsync-3.1.1</code>
./configure --prefix=/usr/local/rsync && make && make install
安裝完成後在/usr/local/rsync目錄下應該産生bin share兩個目錄
然後在目前目錄下建立log、pid、conf、password 分别存放日志、程式程序号、配置檔案、密碼
設定配置檔案
6
7
8
9
10
11
12
13
14
15
16
17
<code>vim rsyncd.conf</code>
<code>use chroot = nomax </code>
<code>connections = 10</code>
<code>pid file = /usr/</code><code>local</code><code>/rsync/pid/rsyncd.pid</code>
<code>log file = /usr/</code><code>local</code><code>/rsync/log/rsyncd.log</code>
<code>[www]</code>
<code>uid = root</code>
<code>gid = root</code>
<code>path = /var/www</code>
<code>comment = wwwbackup</code>
<code>read</code> <code>only</code> <code>= </code><code>no</code>
<code>#write </code><code>only</code> <code>= </code><code>no</code>
<code>list = yes</code>
<code>hosts allow = 192.168.1.120/24</code>
<code>hosts dengy = *</code>
<code>auth users = backup</code>
<code>secrets file = /usr/</code><code>local</code><code>/rsync/</code><code>password</code><code>/server.pass</code>
設定密碼檔案
<code>vim server.pass </code>
<code>backup:BACKup_194</code>
修改密碼檔案權限
<code>chmod 600 server.pass</code>
啟動rsync服務
<code>/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/conf/rsyncd.conf</code>
過濾程式是否啟動成功
<code>ps -ef | grep rsync</code>
<code>root 22620 1 0 15:17 ? 00:00:00 ./bin/rsync --daemon --config=/usr/local/rsync/conf/rsyncd.conf</code>
配置備份端
建立password目錄存放password檔案
<code>BACKup_194</code>
修改密碼檔案權限
<code>chmod</code> <code>600 server.pass</code>
測試
<code>/usr/loca/rsync/bin/rsync -vzrtopg --progress --password-file=/usr/local/rsync/password/server.pass [email protected]::www /opt/back/local/www/</code>
測試成功後編寫腳本制定任務計劃
<code>vim rsyncback_194_www.sh </code>
<code>#!/bin/sh</code>
<code>date=`date +"%Y%m%d"`</code>
<code>/usr/local/rsync/bin/rsync -vzrtopg --progress --password-file=/usr/local/rsync/password/server.pass [email protected]::www /opt/back/local/www/$date</code>
制定任務計劃
設定每周五晚上8點執行同步任務
<code>crontab -e</code>
<code>00 20 * * 5 /opt/back/bin/rsyncback_194_www.sh</code>
****************************************************************************************************
修改服務端的端口啟動的時候加上--port=8081
<code>/usr/local/rsync/bin/rsync</code> <code>--port=8081 --daemon --config=</code><code>/usr/local/rsync/conf/rsyncd</code><code>.conf *</code>
用戶端這時候如果進行同步需要加上 --port=8081
<code>/usr/local/rsync/bin/rsync</code> <code>-vzrtopg --port=8081 --progress --password-</code><code>file</code><code>=</code><code>/usr/local/rsync/password/server</code><code>.pass [email protected]::www </code><code>/Disk/var/www/young51/about_life_service/</code>
被備份端的配置檔案介紹:
-、全局參數
在檔案中[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
同步報錯的解決:
網絡搜集問題
問題一:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]
原因:
伺服器端的目錄不存在或無權限,建立目錄并修正權限可解決問題。
問題二:
@ERROR: auth failed on module tee
伺服器端該子產品(tee)需要驗證使用者名密碼,但用戶端沒有提供正确的使用者名密碼,認證失敗。
提供正确的使用者名密碼解決此問題。
問題三:
@ERROR: Unknown module ‘tee_nonexists'
伺服器不存在指定子產品。提供正确的子產品名或在伺服器端修改成你要的子產品以解決問題。
問題1:
在client上遇到問題:
rsync -auzv --progress --password-file=/etc/rsync.pas [email protected]::backup /home/
rsync: could not open password file "/etc/rsync.pas": No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到這個問題:client端沒有設定/etc/rsync.pas這個檔案,而在使用rsync指令的時候,加了這個參數--password-file=/etc/rsync.pas
問題2:
遇到這個問題:client端已經設定/etc/rsync.pas這個檔案,裡面也設定了密碼111111,和伺服器一緻,但是
伺服器段設定有錯誤,伺服器端應該設定/etc/rsync.pas ,裡面内容root:111111 ,這裡登陸名不可缺少
問題3:
@ERROR: chdir failed
遇到這個問題,是因為伺服器端的/home/backup 其中backup這個目錄并沒有設定,是以提示:chdir failed
問題4:
rsync: write failed on "/home/backup2010/wensong": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync: connection unexpectedly closed (2721 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
磁盤空間不夠,是以無法操作。
可以通過df /home/backup2010 來檢視可用空間和已用空間
問題5:
1、權限問題
類似如下的提示:rsync: opendir "/kexue" (in dtsChannel) failed: Permission denied (13)注意檢視同步的目錄權限是否為755
2、time out
rsync: failed to connect to 203.100.192.66: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]
檢查伺服器的端口netstat –tunlp,遠端telnet測試。
可能因為用戶端或者服務端的防火牆開啟 導緻無法通信,可以設定規則放行 rsync(873端口) 或者直接關閉防火牆。
還有一種在同步過程中可能會提示沒有權限 (将同步目錄加上SvcwRsync全部權限即可,更簡單的方法就是将SvcwRsync設為管理者即可)
3、服務未啟動
rsync: failed to connect to 10.10.10.170: Connection refused (111)
啟動服務:rsync --daemon --config=/etc/rsyncd.conf
4、磁盤空間滿
rsync: recv_generator: mkdir "/teacherclubBackup/rsync……" failed: No space left on device (28)
*** Skipping any contents from this failed directory ***
5、Ctrl+C或者大量檔案
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [receiver=3.0.5]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [generator=3.0.5]
6、xnetid啟動
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5]
本文轉自 xinsir999 51CTO部落格,原文連結:http://blog.51cto.com/xinsir/1539563,如需轉載請自行聯系原作者