介紹
rsync,remote synchronize顧名思意就知道它是一款實作遠端同步功能的軟體,它在同步檔案的同時,可以保持原來檔案的權限、時間、軟硬連結等附加資訊。 rsync是用 “rsync 算法”提供了一個客戶機和遠端檔案伺服器的檔案同步的快速方法,而且可以通過ssh方式來傳輸檔案,這樣其保密性也非常好,還支援斷點續傳,資料可推也可以拉,而且是免費的.
能更新整個目錄和樹和檔案系統;
有選擇性的保持檔案夾和檔案的符号鍊鍊、硬連結、檔案屬于、權限、裝置以及時間等;
對于安裝來說,無任何特殊權限要求;
對于多個檔案來說,内部流水線減少檔案等待的延時;
能用rsh、ssh 或直接端口做為傳輸入端口;
支援匿名rsync 同步檔案,是理想的鏡像工具;
安裝
安裝rsync相當簡單,他幾乎完全不依賴什麼特殊庫,是以你可以直接yum安裝,編譯也很簡單,現在最新版是3.1.2.
雖然yum安裝的版本稍舊,但是勝在簡單,而且這個軟體是用C寫的,非常穩定.
<code># yum install -y rsync </code>
<code>Available Packages</code>
<code>rsync</code><code>.x86_64 3.0.6-12.el6 os</code>
源碼包編譯安裝
<code>wget </code><code>"https://download.samba.org/pub/rsync/src/rsync-3.1.2.tar.gz"</code>
<code>tar</code> <code>xvf </code><code>rsync</code><code>-3.1.2.</code><code>tar</code><code>.gz</code>
<code>cd</code> <code>rsync</code><code>--3.1.2</code>
<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/</code>
<code>make</code> <code>&& </code><code>make</code> <code>install</code>
安裝完成就會有指令rsync
配置與啟動
rsync的主要有以下三個配置檔案rsyncd.conf(主配置檔案)、rsyncd.secrets(密碼檔案)、rsyncd.motd(rysnc伺服器資訊)
伺服器配置檔案rsyncd.conf,該檔案預設不存在,請建立它,系統預設的配置檔案路徑是/etc下,假如你要集中管理,也是可以獨立檔案夾來存放,rsync允許這麼幹,啟動的時候指定配置檔案就可以了。
rsync分全局定義和子產品定義,我們來細看配置檔案要寫些什麼東西:
<code>vim rsyncd.conf</code>
全局定義
<code>#指定pid的檔案路徑,通常是存儲程序的ID号,路徑随意</code>
<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid</code>
<code>#指定運作端口,預設是873,您可以自己指定</code>
<code>port = 873</code>
<code>#指定伺服器IP位址,一般在本機運作,不需要指定</code>
<code>address = 10.0.2.6</code>
<code>#指定使用者和使用者組來執行,預設是nobody. 預設情況可能遇到權限問題,有些檔案從伺服器上拉不下來,具體情況自己去定義.</code>
<code>uid = nobody</code>
<code>gid = nobdoy </code>
<code>#用chroot,在傳輸檔案之前,伺服器守護程式在将chroot 到檔案系統中的目錄中,這樣做的好處是可能保護系統被安裝漏洞侵襲的可能。缺點是需要超級使用者權限。另外對符号連結檔案,将會排除在外。也就是說,你在 rsync伺服器上,如果有符号連結,你在備份伺服器上運作用戶端的同步資料時,隻會把符号連結名同步下來,并不會同步符号連結的内容,視乎情況可以設為no</code>
<code>use chroot = </code><code>yes</code>
<code>#隻讀,禁止用戶端上傳檔案到伺服器上,還有write only選項,因為rsync可以拉資料,也可以推資料,相當靈活,具體自己安排.</code>
<code>read</code> <code>only = </code><code>yes</code>
<code>#指定可用IP,可以是單個IP,也可以指定整個網段,全部寫一起也行,能提高安全性。格式是ip 與ip之間、ip和網段之間、網段和網段之間要用空格隔開</code>
<code>hosts allow=192.168.1.0</code><code>/255</code><code>.255.255.0 10.0.2.0</code><code>/255</code><code>.255.255.0 10.104.42.14</code>
<code>#最大連接配接數,</code>
<code>max connections = 5 </code>
<code>#motd file 是定義伺服器資訊的,要自己寫 rsyncd.motd 檔案内容,可以不寫,不影響運作,看個人喜好</code>
<code>motd </code><code>file</code> <code>= </code><code>/etc/rsyncd/rsyncd</code><code>.motd</code>
<code>#定義日志路徑</code>
<code>log </code><code>file</code> <code>= </code><code>/var/log/rsync</code><code>.log</code>
<code>#定義鎖路徑,通常在出錯後鎖住程序不允許讀寫</code>
<code>lock </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.lock</code>
<code>#逾時時間,超過這個時間将會斷開連接配接</code>
<code>timeout = 600</code>
<code>#是否記錄傳輸日志,可不用</code>
<code>transfer logging = </code><code>yes</code>
<code>#日志格式化,可不用</code>
<code>log </code><code>format</code> <code>= %t %a %m %f %b</code>
2.子產品定義
<code>#定義連結的名字,rsync将通過這個名字來确定同步那個檔案夾</code>
<code>[erpsdk]</code>
<code>#指定需要同步的檔案目錄所在位置</code>
<code>path = </code><code>/data/htdocs/www/erp_sdk</code>
<code>#是否顯示資料目錄,預設是yes,從安全的角度出發,這裡應該要no</code>
<code>list = no</code>
<code>#忽略IO錯誤</code>
<code>ignore errors</code>
<code>#排除不需要複制過去的或者被推送過來的檔案夾名字,空格隔開</code>
<code>exclude = beinan/ samba/</code>
<code>#用來同步的使用者,是必須在伺服器上存在的使用者</code>
<code>auth </code><code>users</code> <code>= backup</code>
<code>#指定密碼檔案的路徑,其實檔案字尾也不一定非.secrets不可,有不少朋友用的是.pass字尾</code>
<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsyncd</code><code>.secrets</code>
最後說說,全局定義并不代表隻能用在全局定義,也可以寫進子產品定義,細化權限,這個大家按需求來定義,下面是一個簡單的例子,僅供參考:
<code>gid = nobody</code>
<code>user chroot = no</code>
<code>max connections = 10</code>
<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log</code>
<code>path = </code><code>/data/htdocs/www/erp_sdk</code>
<code>read</code> <code>only = no</code>
<code>write only = no</code>
<code>host allow = *</code>
<code>uid = root</code>
<code>gid = root</code>
<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsyncd</code><code>.pass</code>
定義比較靈活,各位自己看看什麼适合自己,其中host allow定義*是很危險的,而且read only還沒看,各位自己衡量下.
最後來看看如何啟動:
<code>#--daemon參數方式,是讓rsync以伺服器模式運作,--config用于指定rsyncd.conf的位置,如果在/etc下可以不寫</code>
<code>/usr/bin/rsync</code> <code>--daemon --config=</code><code>/etc/rsyncd</code><code>.conf</code>
看看端口有沒有起來,起來了就成功了,非常簡單.
使用
rsync有很多功能選項,下面就對介紹一下常用的選項:
rsync的指令格式可以為:
1. rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST
2. rsync [OPTION]... [USER@]HOST:SRC DEST
3. rsync [OPTION]... SRC [SRC]... DEST
4. rsync [OPTION]... [USER@]HOST::SRC [DEST]
5. rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST
6. 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傳輸,不過隻要在指令中省略掉本地機資訊即可。
這麼多字,我自己都不是很想看,而且解釋确實有點抽象,先來看看參數說明,稅後來舉例一些語句怎麼寫.
參數說明:
-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的shell程式
--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 顯示幫助資訊
還有一些沒完全列出來,有興趣的可以另外再看,我後面也看看能不能補上吧,來直接看看例子:
下面是從伺服器拉資料的語句
<code>rsync</code> <code>-avzr --delete --progress --exclude </code><code>"*.svn"</code> <code>--exclude </code><code>"config.php"</code> <code>--exclude </code><code>"index.php"</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pfproduct [email protected]::erp_sdk </code><code>/data/htdocs/www/erp_sdk</code>
意思就是從伺服器10.10.45.55上面把erp_sdk子產品的檔案夾拉到本地/data/htdocs/www/erp_sdk,忽略檔案*.svn,config.php,index.php,如果有沖突的檔案就删掉從新拉.
下面是推資料到伺服器的語句
<code>rsync</code> <code>-avzr --delete --exclude </code><code>"*.svn"</code> <code>--exclude </code><code>"config.php"</code> <code>--exclude </code><code>"index.php"</code> <code>--password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pfproduct </code><code>/data/htdocs/www/erp_sdk</code> <code>[email protected]::erp_sdk</code>
眼尖的人已經發現,其實推或拉資料,取決于前後順序,參數的解析其實和上面差不多的.
報錯彙總
配置一:
ignore errors
說明:這個選項最好加上,否則再很多crontab的時候往往發生錯誤你也未可知,因為你不可能天天去看每時每刻去看log,不加上這個出現錯誤的幾率相對會很高,因為任何大點的項目和系統,磁盤IO都是一個瓶頸
Rsync error:
錯誤一:
@ERROR: auth failed on module xxxxx
rsync: connection unexpectedly closed (90 bytes read so far)
rsync error: error in rsync protocol data stream (code 12) at io.c(150)
說明:這是因為密碼設定錯了,無法登入成功,檢查一下rsync.pwd,看客服是否比對。還有伺服器端沒啟動rsync 服務也會出現這種情況。
錯誤二:
password file must not be other-accessible
continuing without password file
Password:
說明:這是因為rsyncd.pwd rsyncd.sec的權限不對,應該設定為600。如:chmod 600 rsyncd.pwd
錯誤三:
@ERROR: chroot failed
rsync: connection unexpectedly closed (75 bytes read so far)
說明:這是因為你在 rsync.conf 中設定的 path 路徑不存在,要建立目錄才能開啟同步
錯誤四:
rsync: failed to connect to 218.107.243.2: No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(104) [receiver=2.6.9]
說明:防火牆問題導緻,這個最好先徹底關閉防火牆,排錯的基本法就是這樣,無論是S還是C,還有ignore errors選項問題也會導緻
錯誤五:
@ERROR: access denied to www from unknown (192.168.1.123)
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(359)
說明:此問題很明顯,是配置選項host allow的問題,初學者喜歡一個允許段做成一個配置,然後子產品又是同一個,緻使導緻
錯誤六:
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [generator=2.6.9]
rsync error: received SIGUSR1 (code 19) at main.c(1182) [receiver=2.6.9]
說明:導緻此問題多半是服務端服務沒有被正常啟動,到伺服器上去查查服務是否有啟動,然後檢視下 /var/run/rsync.pid 檔案是否存在,最幹脆的方法是殺死已經啟動了服務,然後再次啟動服務或者讓腳本加入系統啟動服務級别然後shutdown -r now伺服器
錯誤七:
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(604) [sender=2.6.9]
說明:原資料目錄裡沒有資料存在
本文轉自arthur376 51CTO部落格,原文連結:http://blog.51cto.com/arthur376/1829677,如需轉載請自行聯系原作者