基本rsync設定

作者:csc@ocean-pioneer.com
建立日期:2003/09/18 
更新日期:2010/04/13
參考文章:rsync,rsyncd.conf 手冊, 程式:rsync,cygwin-rsyncd,,cwrsync
#這是一個入門的設定,如果你要深入了解每一個參數請參照 man rsync


一般來講跨平台檔案的備 份並不很容易以前我也用過使用磁帶機來備份一台五萬多還要買一套軟體來排程不同的端需要另外買又是一筆開銷然而現在硬碟是如此的便 宜,容量又大速度又快因此現在 可以使用硬碟來備份檔案但是如果你使用的作業系統包含了unix,windows,os/2 等,,以前並不容易備 份,但是使用rsync可以解決這些問題。 我想你可能聽過rsync,也知道它可以以用在linux之類的作業系統,它是ftp網站常用來同步(複製)的軟體,我一直以為它只能在linux, unix上跑,其實它也是可以用在winodws作業 系統上(跑在cygwin上),使用方法大致 上跟linux下一樣,因此只要設定好 了所有的檔案備份都可以由你自由的發揮
本文將談到linux上的rsync及windows上的rsync的設定,如此看完了,我們可以實作企業的資料遠端備援,如果你有使用VPN則安全性更 高


根據 rsync的manual上的說明,rsync類似rcp(remote cp)[也就是遠端複製],但是多了許多的功能,而且它的通訊協定可以加速檔案的傳送,其remote-update的 協定是使用差異性的備份方式它包含了 server及 client端因此我們可以在 不同機器間做備份的動作不需要額外設定其它的分享設定如特點:


rsync的使用方法 以 下是 rsync man中提及6種用法

rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

來源本地到目的遠端(使 用rsh ssh ):

rsync [OPTION]... [USER@]HOST:SRC DEST

來源遠端到目的本地(使 用rshssh):

rsync [OPTION]... SRC [SRC]... DEST

來源本地到目的本地,類 似複製的功能

rsync [OPTION]... [USER@]HOST::SRC [DEST]

來源遠端到目的本地(使 用rsync server),使用::

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

來源本地到目的遠端(使 用rsync server),使用::

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

來源遠端到目的本地,指定遠端的主機使用rsync:// URL

#在路徑中有使用到:::在稍後會解釋


實 作: 我要將windows nt上的資料備分到linux,不 使用網路芳鄰,純使用rsync來 備份,windows上 啟動rsyncd服 務,linux使 用cron來 定時執 行備份的功能,以 下是實作


LINUX

安 裝到linux
redhat
rsync是 有內建 有套件,因 此你可以直接安 裝光碟中的套件就可以了
rpm -Uvh rsync
 #你 也可以至rsync.samba.org下 載最新版自已編譯,
rpm -ql rsync
     #安裝完畢後, 查詢一下安裝了那些東西
/etc/xinetd.d/rsync
/usr/bin/rsync
#只有兩個程式,和幾個manual,和 文件,
/etc/xinetd.d/rsync
是透過xinetd.d的 啟動服務

rysnc 有兩種模式:

1.server

如果你要讓別人使用rsync來備份本機的資料,一般需要設定以daemon 的方式啟動 所有的焦點都在/etc/rsyncd.conf 這個檔上面你可以執行man rsyncd.conf查看設法 其結構有點像samba的環境檔
#目前一般在linux 我都不啟動server而是透過ssh來串接,也就是不啟動服務,而透過ssh來連線
詳細請參照本文後面

2.client

一般命令列操作 而已,它可以連線rsync serverssh server

/etc/rsyncd.conf 的參數: 請參考 man rsyncd.conf

全 域變數

motd file

指定連線進來的歡迎畫面的檔案

log file

連線記錄檔所在

pid file

行程的ID

syslog facility

記錄的詳細度

socket options


其 它常用參數

參數

註解

path

路徑,請使用的斜線

max connections

最大接受的連線數

lock file

預設/var/run/rsyncd.lock

read only

預設read only =true 讓使用者無法上傳,如果要讓使用者可以上傳read only= false 注 意:上下傳檔的權限還需要檔案系統的權限,如果沒有權限就無法傳檔,而傳檔的使 用 者預設uid.gid (nobody.nobody)

list

如果設為false則可以設定為隱藏的模組,無法查詢

uid

預設是nobody,建立檔案的擁有者

gid

預設是nobody

exclude

這是設定不要備份的樣本

exclude from

同上但是使用檔案

include

exclude 相反

include from

exclude from相反

auth users

准許的使用者,要配合secrets file

secrets file

設定了auth users之後一定要加入本設定,其格式為user:passwd使用冒號分隔,一個 使用者一行

strict modes

檢查權限,限制如果別人可以讀無法執行,會有錯誤訊息, 停止檢查設為false

hosts allow

予許連線的主機可以是
192.168.1.23
192.168.0.0/24
192.168.0.0/255.255.255.0
*.somehost.com.tw

hosts deny

拒絕連線的主機

ignore errors

忽略錯誤

ignore nonreadable

忽略無法讀取

transfer logging

傳送記錄

log format

記錄格式

以 下我們開始設定rsyncd 服務 設定檔rsyncd.conf範 例:

pid file =/var/run/rsyncd.pid
log file =/var/log/rsyncd.log
 
strict modes = false 設定比較好可以查詢連線的 記錄,如果不指定則在var/log/messages
[vol1] 模組vol1
path=/home/samba/vol1 模組的路徑
comment= samba share files 模組的說明


[etc] 模組etc
path=/etc 模組的路徑
comment= server etc 模組的說明
auth users= admin 可連線的使用者admin
secrets file=/etc/rsyncd.secrets admin的密碼所在檔


 [www] 模組www

path=/var/www/html
comment = wwww document

 

#我們這堭珧卣sync server來測試,稍後若你不想要使用,可以關掉本服務

接 著修改/etc/xinetd.d/rsync disable=yes 改為disable=no 然後重新啟動xinetd.d服務

service xinetd restart

現在我你可以測試連線 你可以從別台或是本機測試 假設該主機名稱是rsync.mytest.com.tw 
rsync -av rsync.mytest.com.tw::vol1

如果正常會顯示所有在 該主機下的所有檔案
選項v是瀏覽的模式,a=rlptgoD(r=recursive,l=link,p=perms,t=times,g=group,o=owner,D=Device)
也就是 包含下面的選項
:(子目錄,鏈結檔,權限,時間,群組,檔案擁有者,設備),因為沒有指定目的所以是顯示所有的 檔案
(
曾經在書局看到一本書,其中有介紹rsync,竟然將參數aro等參 數合用,真不曉得可以如此出書,太草率)
rsync -av admin@rsync.mytest.com.tw::etc

同上只是加入的使用者,它會提示密碼 
rsync -av admin@rsync.mytest.com.tw::etc --password-file=/home/backup/mypasswd

上述多了一個參考
--password-file,我們將密碼寫在 /home/backup/mypasswd(如果權限不對,無法使用,它強制, other不 可以讀,參考strict mode的 設定)如此它就不會問你密碼,可以批次執行
chmod o-r /home/backup/mypasswd
chmod 600 /home/backup/mypasswd
#
注意不要將其和rysncd.conf中的 "secrets file "參數弄混,該參數指定的檔案格式是"使用者:密碼",--password-file所指定檔案內只含"密碼"而已


windows

2008/03/12 新增

安 裝windows xp/2003/2000 rsyncd server 
cwRsync
是一個打包給windows使用的rsync(包含了serverh和client )

server端在安裝時它會幫你建立一個帳號給 rsync server 來使用
預設服務已經裝你裝好並啟用了,因為有了這個帳號可以加強其安全性,在設定模組時若要由遠端寫入時,記的要將授權給本機使用者SvcwRsync的對同步資料夾寫入權
如此才可以更新

設定之前請先參考路徑的表示方法

路徑的對應詳情請參照windows path
設定rsyncd.conf,請在cwrsync的安裝資料夾中開啟本檔 
以 下是由預設rsyncd.conf所修改而來

use chroot = false
max connections = 4
log file = c:/rsyncd/rsyncd.log
pid file = c:/rsyncd/rsyncd.pid
lock file = c:/rsyncd/rsyncd.lock


[vol1]
path=/cygdrive/c/v1
    comment =vol1
    strict modes = false
    auth users = csc
    secrets file = /cygdrive/c/rsyncd/rsyncd.secrets
    hosts allow = 192.168.0.0/24
    read only = true
    list = false
[test]
path=/cygdrive/D/v1/
comment=test    

#windows 沒有 chroot這個命令 最 大連線 記 錄檔 模 組vol1 不 檢查檔案的權限 模 組test
在 環境檔中有一個很重要的設定

use chroot = false
這一行一定要,因為你在windows系 統,無 法切換到root的身份(執 行chroot) 另外路徑的設法最好是使用unix之 類作業系統的用法/而不是\ 例如:
c:/windows  (
比較好)
c:\windows
假設本機是192.168.0.1

啟動服務的方式
目前使用cwrsync 已經完整幫你裝好

進 階設定(檔案樣本,指定檔案規 則,要備份或是不備份)
exclude
exclude-from
include
include-from
上述的的參數是用來排除,或 是包含某些樣本(如目錄或檔案) 例如:
--exclude "*.tmp"
將副檔名是tmp排除不備份

我們在備份時可能為了排除某些不需要備份的檔案類型或目錄,用 來減少備份的時間及空間,一般是直接下命令,但是如果太多樣本,我們會將其設定到檔案之中也 就是使用下面:
exclude-from=
檔案
include-from=
檔案 的好處

樣本規則

說明

/為啟始,代表是模組的根目錄

由於某一模組內有許多目錄及檔案,如 此設定有點像 絕對路徑

/為結尾,代表是其下的子目錄(不包含該目錄下的檔案)

備份主要分為檔案及目錄,如何區分,就在結尾

可以使用*,?,[

*代表0個以上的任意字
*.exe
?
代表一個任意字
abc???.txt
[  ---------
我還不知道是否如一般的正規表示法?
[abcd] -
代 表abcd的任一個字

**代表

我們有時要指定前面目錄及後面目錄,中 間的目錄未指明(可以是多層)
/directory/
未知目錄  /food
/directory/**/food

/ 但不是在結尾

它是代表路徑

+exclude可以用+來設定include,如此可以合併 excludeinclude在一個檔案內


-include可以用-來設定exclude,如此可以合併 include exclude在 一個檔案內



#
該使用在server端還是client?
rsync 命令列是--exclude-from=檔 案 rsyncd.conf 中  exclude from = 檔案可是要設在server端好還是client端 好呢
我是認為常用規則設在
server端 比較好,而不常用的規則則是設在client,管 理比較方便,可 否兩個一起用?

命令列範例:
--exclude "*.o"  
不含任何副檔名是o(任 何目錄中)
--exclude "/foo" 
不含在根目錄下其目錄為foo的 任何檔案(不含子目錄)
--exclude "foo/" 
不含目錄為foo(在 任何地方)
--exclude "/foo/*/bar"
不含根目錄下其目錄為foo及一層目錄及bar目錄下的任何檔案
--exclude "/foo/**/bar"
同上但是中間含了多層目錄
--include "*/" --include "*.c" --exclude "*"
包含任何目錄,副檔名為.c不含其它的檔案
--include "foo/" --include "foo/bar.c" --exclude "*"
包含目錄foo檔案bar.c不含其同的檔案

注意:每一個exclude只能使用一個樣本規則,如果你要使用多個在命令列中請參考下 面 --exclude '/foo' --exclude '/abc/'    --exclude '/abc.*'

使 用-- exclude-from=檔 案完整路徑 在檔案中不 用加引號" "' ' 而且是一行一個樣本,如 下:
*.tmp
*.TMP
*.lnk
/temp
/EDIDMS/APP/*.DBF

注 意:如 果rsyncd是 執行在windows系 統則大小寫是一樣的,但 是在linux則 大小寫不一樣


刪除不存在的檔案

在來源及目 的主機上常有一種情形是,來 源主機原來有一個檔案,但 是後才被刪除,而目的主機上的同一檔 案預設是不 會被刪除,可否清除不用的檔案呢?
rsync -az --delete 
來源  目的 最好是先使用 -n  查 看那些檔案會被刪除,如 果太長可以轉成檔案 > 檔 名
rsync -az --delete-excluded
來源 目的 這是排除檔案的刪除方法 上述都是只刪除接收端(目 的),不 刪除來源的檔案


rsync的演算法原理-差異性備份如何運作

參考:套 件中的tech_report.tex 一般最簡單的備份是直接複製,但 是如果只是變動部份就要全部備份,這會浪費太多時 間了,因此有人想出差異性備份,其 原理簡單說明如下: 假設有兩台電腦,A,B. A機器上有一個檔案叫AF,B機 器有一個檔案叫BF(一般的檔名 是相同的,但 這堿O為了區別)我 們要更新A->B,也 就是 AF->BF,首 先rsync會 將AFBF300K500K的 區塊計 算64128位 元的checksum,然 後比對其是否相等,如 果不相等 則會將該區塊傳送B電 腦,而 在B電 腦依據BF檔 案來重建BF(更 新為AF),區 塊的比對是 跨到別的區塊的checksum(你 可能會以為只有檔案後面變 動才會減少檔案的傳送,因 為是跨區塊,所 以不管資料的修改是在那堻ㄛO可以運用),在 傳送的過程中也可以加入壓縮的功能,如 此可以加速傳送的速度,如 果你 要知道更詳細的資料請參考tech_report.txt


使 用ssh

你 可能在前 面被:::所搞混了,我也是一直無法理解文件中的說法 最後要設定ssh的時才發現一些重要的觀念
1.rsync
client有兩種連線方式
   1.
連線rsync server
   2.
連線sshd sever(rsh server這 個我不會)

如果要連線rsync server 要 使用:: 後面接模組 如果要連線sshd server要 使用後面接路徑 ,並使用-e ssh

因為ssh並無法設定如rsyncd.conf 的環境檔所以後面要接絕對路 徑
ssh
兩種用法:
rsync -avz -e ssh root@dns1:/etc /backup/dns1
rsync --rsh="ssh -l root" dns1:/etc /backup/dns1

#為了安全的因素,有人會變更sshport,只能使用第二種方法 假設ssh的變更連接埠為122,--rsh 中加入參數-p 122
rsync -avz --rsh="ssh -l root -p 122"  dns1:/etc /backup/dns1


ssh免用密碼登入 請參考文章ssh基本應用


權限問題 

在設定rsync 時常會碰到 權限問題,如果要避免這個問題,我一般是設定由來源的機器上下命令,而不是由目的機器上下命令,這樣可以避免讀取來源檔時發生權限不足的問題


windows下磁碟機及路徑設定方式(2008/11/18更新)

因為使用cygwin來移植程式到windows,因此你可以使用cygwin的相關參 數

參數 說明 範例
cygdrive 硬碟的根目錄 c: = /cygdrive/c/
d:\abc = /cygdrive/d/abc/
cygwin cygwin的安裝目錄

如果你還不知道如何對應可以使用cygwin的程式(我在安裝cwrsync的bin中找到)

cygpath 範例

命令 回應 說明
cygpath -W  /cygdrive/c/windows windows安裝目錄
cygpath -H /cygdrive/c/Document and Settings  家目錄
cygpath -S /cygdrive/c/windows/system32 系統目錄
cygpath windows路徑 轉為cygwin的格式 很有用,當你不知道應如何轉換時可以使用本命令來轉


空白路徑的問題
windows 下兩個常用的路徑c:\Program Files\,c:\Documents and Settings\,先使用cygpath來解析,解析完畢後,你只要在路徑的前後加入雙引號,cwrsync就可以正常操作,如果這樣也無法解決你的問題,請先離

後言: 我本有一台電腦一般將近(1.86GB)備 份要一兩個小時,如果使用磁帶機 則更久,因 為使用差異性的備份,有 時候可以在幾十分鐘內完成,想 說一句話 真是太神奇了,傑 克.... 可以備份,也 減少了硬碟的存取次數,真 是一舉數得 如果你的電腦分散在不同的地方,我 們可以以此方法來做資料備援的動作,但是最好是加上vpn或 是ssh的 方式


問題和答案:
1.cwrsync server端無法指定模目包含中文路徑
  雖然我們無法指定,但是只要是子目錄是中文都可以正常的同步,因此解決方法是server端的模組使用英文"或資料夾上層有英文的目錄則以它來設模組",
  client端使用英文模組並接中文路徑來使用,也就是client端來指定中文

2.rsync 命令中若路徑含有空格則將整個路徑括起來""
3.2010/04/13最新版的cwrsync 使用cygwin-1.7.0-62已經支援utf-8因此不用上網下載最cygwin的utf-8修正dll來替
4.chdir()錯誤,一般是資料夾設定有問題,不是資料夾不存在(路徑設錯),或是不支援該編碼
5.另權限的錯誤還有一種,若設定檔沒有設定uid則會使用nobody ,因此你若沒有安全性的問題,可以將uid=root