天天看點

Linux 檔案同步工具——rsync3、rsync伺服器搭建

1、介紹:

rsync是類unix系統下的資料鏡像備份工具,從軟體的命名上就可以看出來了——remote sync。

Rsync(remote synchronize)是一個遠端資料同步工具,可通過LAN/WAN快速同步多台主機間的檔案。Rsync使用所謂的“Rsync算法”來使本地和遠端兩個主機之間的檔案達到同步,這個算法隻傳送兩個檔案的不同部分,而不是每次都整份傳送,是以速度相當快。

  Rsync本來是用于替代rcp的一個工具,目前由rsync.samba.org維護,是以rsync.conf檔案的格式類似于samba的主配置檔案。Rsync可以通過rsh或ssh使用,也能以daemon模式去運作,在以daemon方式運作時Rsync server會打開一個873端口,等待用戶端去連接配接。連接配接時,Rsync server會檢查密碼是否相符,若通過密碼查核,則可以開始進行檔案傳輸。第一次連通完成時,會把整份檔案傳輸一次,以後則就隻需進行增量備份。

  Rsync支援大多數的類Unix系統,無論是Linux、Solaris還是BSD上都經過了良好的測試。此外,它在windows平台下也有相應的版本,如cwRsync和Sync2NAS等工具。

2、Rsync同步算法

Rsync隻是以同步檔案的速度相當快,是因為“Rsync同步算法”能在很短的時間内計算出需要備份的資料,關于Rsync的同步算法描述如下:

假定在1号和2号兩台計算機之間同步相似的檔案A與B,其中1号對檔案A擁有通路權,2号對檔案B擁有通路權。并且假定主機1号與2号之間的網絡帶寬很小。那麼rsync算法将通過下面的五個步驟來完成:

1、2号将檔案B分割成一組不重疊的固定大小為S位元組的資料塊,最後一塊可能會比S 小。

2、2号對每一個分割好的資料塊執行兩種校驗:一種是32位的滾動弱校驗,另一種是128位的MD4強校驗。

3、2号将這些校驗結果發給1号。

4、1号通過搜尋檔案A的所有大小為S的資料塊(偏移量可以任選,不一定非要是S的倍數),來尋找與檔案B的某一塊有着相同的弱校驗碼和強校驗碼的資料塊。這項工作可以借助滾動校驗的特性很快完成。

5、1号發給2号一串指令來生成檔案A在2号上的備份。這裡的每一條指令要麼是對檔案B經擁有某一個資料塊而不須重傳的證明,要麼是一個資料塊,這個資料塊肯定是沒有與檔案B的任何一個資料塊比對上的。

  架設rsync 伺服器比較簡單,寫一個配置檔案rsyncd.conf 。檔案的書寫也是有規則的,我們可以參照rsync.samba.org 上的文檔來做。當然我們首先要安裝好rsync這個軟體才行;

A、rsync的安裝;

  擷取rsync

[root@test sysconfig]# yum list|grep rsync

rsync.x86_64                   3.0.6-9.el6_4.1    @anaconda-RedHatEnterpriseLinux-201311111358.x86_64/6.5

rsync-debuginfo.x86_64         3.0.6-9.el6_4.1    rhel-x86_64-server-6-debuginfo

  軟體包安裝

  # sudo apt-get  install  rsync  注:在debian、ubuntu 等線上安裝方法;

  # yum install rsync    注:Fedora、Redhat 等線上安裝方法;

  # rpm -ivh rsync       注:Fedora、Redhat 等rpm包安裝方法;

  其它Linux發行版,請用相應的軟體包管理方法來安裝。

  源碼包安裝

  tar xvf  rsync-xxx.tar.gz

  cd rsync-xxx

  ./configure --prefix=/usr  ;make ;make install   注:在用源碼包編譯安裝之前,您得安裝gcc等編譯開具才行;

    

B、配置檔案

  rsync的主要有以下三個配置檔案rsyncd.conf(主配置檔案)、rsyncd.secrets(密碼檔案)、rsyncd.motd(rysnc伺服器資訊)

  伺服器配置檔案(/etc/rsyncd.conf),該檔案預設不存在,請建立它。具體步驟如下

用root使用者建立:

#touch /etc/rsyncd.conf  #建立rsyncd.conf,這是rsync伺服器的配置檔案。

#touch /etc/rsyncd.secrets  #建立rsyncd.secrets ,這是使用者密碼檔案。這個密碼檔案很好的哦,你可以設定一個使用者名:密碼的數值對,然後在用戶端設定一個密碼檔案,隻寫密碼就可以了,一會細講。

#chmod 600 /etc/rsyncd.secrets  #将rsyncd.secrets這個密碼檔案的檔案屬性設為root擁有, 且權限要設為600, 否則無法備份成功!

#touch /etc/rsyncd.motd

下面就是我們修改rsyncd.conf檔案的時候了。rsyncd.conf是rsync伺服器主要配置檔案。我們先來個簡單的示例,後面在詳細說明各項作用。

設定配置檔案/etc/rsyncd.conf:

 比如我們要備份伺服器上的/home和/opt,在/home中我想把easylife和samba目錄排除在外;

  # Distributed under the terms of the GNU General Public License v2

  # 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

  pid file = /var/run/rsyncd.pid   

  port = 873

  address = 192.168.1.171  

  #uid = nobody 

  #gid = nobody    

  uid = root   

  gid = root  

  use chroot = yes  

  read only = yes 

  #limit access to private LANs

  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0  

  hosts deny=*

  max connections = 5 

  motd file = /etc/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

  [rhel4home]   

  path = /home    

  list=yes 

  ignore errors 

  auth users = root

  secrets file = /etc/rsyncd.secrets  

  comment = This is RHEL 4 data  

  exclude = easylife/  samba/     

  [rhel4opt]

  path = /opt 

  list=no

  ignore errors

  comment = This is RHEL 4 opt 

  auth users = easylife

  secrets file = /etc/rsyncd/rsyncd.secrets

  注:關于auth users是必須在伺服器上存在的真實的系統使用者,如果你想用多個使用者以,号隔開,比如auth users = easylife,root

  

設定密碼檔案/etc/rsyncd.secrets :

  密碼檔案格式很簡單,rsyncd.secrets的内容格式為:

  使用者名:密碼

  我們在例子中rsyncd.secrets的内容如下類似的;在文檔中說,有些系統不支援長密碼,自己嘗試着設定一下吧。

  oraprod:rsyncmima

  root:rsyncmima

  chown root.root rsyncd.secrets  #修改屬主

  chmod 600 rsyncd.secrets     #修改權限

  注:1、将rsyncd.secrets這個密碼檔案的檔案屬性設為root擁有, 且權限要設為600, 否則無法備份成功! 出于安全目的,檔案的屬性必需是隻有屬主可讀。

    2、這裡的密碼值得注意,為了安全你不能把系統使用者的密碼寫在這裡。比如你的系統使用者oraprod密碼是123456,為了安全你可以讓rsync中的oraprod為rsyncmima。這樣,在用戶端連接配接的時候,會使用這個rsyncd.secrets作為認證檔案,不和os有任何牽連。

  設定rsyncd.motd 檔案:

   它是定義rysnc伺服器資訊的,也就是使用者登入資訊。比如讓使用者知道這個伺服器是誰提供的等;類似ftp伺服器登入時,我們所看到的 linuxsir.org ftp ……。 當然這在全局定義變量時,并不是必須的,你可以用#号注掉,或删除;我在這裡寫了一個 rsyncd.motd的内容為:

  ++++++++++++++++++++++++++++++++++++++++++++++

  Welcome to use the mike.org.cn rsync services!

          install by hand dba liuyuangang

rsyncd.conf伺服器的配置詳解:

A、全局定義

  在rsync 伺服器中,全局定義有幾個比較關健的,根據我們前面所給的配置檔案 rsyncd.conf 檔案;

  pid file = /var/run/rsyncd.pid              注:告訴程序寫到 /var/run/rsyncd.pid 檔案中;

  port = 873                                       注:指定運作端口,預設是873,您可以自己指定;

  address = 192.168.1.171               注:指定伺服器IP位址

  uid = nobody   

  gid = nobdoy                                注:伺服器端傳輸檔案時,要發哪個使用者和使用者組來執行,預設是nobody。 如果用nobody 使用者和使用者組,可能遇到權限問題,有些檔案從伺服器上拉不下來。是以我就偷懶,為了友善,用了root 。不過您可以在定義要同步的目錄時定義的子產品中指定使用者來解決權限的問題。

use chroot = yes 

   注:用chroot,在傳輸檔案之前,伺服器守護程式在将chroot 到檔案系統中的目錄中,這樣做的好處是可能保護系統被安裝漏洞侵襲的可能。缺點是需要超級使用者權限。另外對符号連結檔案,将會排除在外。也就是說,你在 rsync伺服器上,如果有符号連結,你在備份伺服器上運作用戶端的同步資料時,隻會把符号連結名同步下來,并不會同步符号連結的内容;這個需要自己來嘗試。

  注:read only 是隻讀選擇,也就是說,不讓用戶端上傳檔案到伺服器上。還有一個 write only選項,自己嘗試是做什麼用的吧;

  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0 

  注:在您可以指定單個IP,也可以指定整個網段,能提高安全性。格式是ip 與ip 之間、ip和網段之間、網段和網段之間要用空格隔開;

  max connections = 5      注:用戶端最多連接配接數

  注:motd file 是定義伺服器資訊的,要自己寫 rsyncd.motd 檔案内容。當使用者登入時會看到這個資訊。比如我寫的是:

           2002------2009

  log file = /var/log/rsync.log       注:rsync 伺服器的日志;

  transfer logging = yes   注:這是傳輸檔案的日志

B、子產品定義

   子產品定義什麼呢?主要是定義伺服器哪個目錄要被同步。每個子產品都要以[name]形式。這個名字就是在rsync 用戶端看到的名字,其實有點象Samba伺服器提供的共享名。而伺服器真正同步的資料是通過path 指定的。我們可以根據自己的需要,來指定多個子產品。每個子產品要指定認證使用者,密碼檔案、但排除并不是必須的

  下面是前面配置檔案子產品的例子:

  [rhel4home]  #子產品它為我們提供了一個連結的名字,在本子產品中連結到了/home目錄;要用[name] 形式

  path = /home    #指定檔案目錄所在位置,這是必須指定的 

  auth users = root   #認證使用者是root  ,是必須在伺服器上存在的使用者

  list=yes   #list 意思是把rsync 伺服器上提供同步資料的目錄在伺服器上子產品是否顯示列出來。預設是yes 。如果你不想列出來,就no ;如果是no是比較安全的,至少别人不知道你的伺服器上提供了哪些目錄。你自己知道就行了;

  ignore errors  #忽略IO錯誤

  secrets file = /etc/rsyncd.secrets   #密碼存在哪個檔案

  comment = linuxsir home  data  #注釋可以自己定義

  exclude = beinan/ samba/     

  注:exclude是排除的意思,也就是說,要把/home目錄下的easylife和samba排除在外; easylife/和samba/目錄之間有空格分開

  [rhel4opt]  

  comment = optdir   

  auth users = beinan  

4、啟動rsync伺服器及防火牆的設定

  啟動rsync伺服器相當簡單,有以下幾種方法

  A、--daemon參數方式,是讓rsync以伺服器模式運作

  #/usr/bin/rsync --daemon  --config=/etc/rsyncd/rsyncd.conf  #--config用于指定rsyncd.conf的位置,如果在/etc下可以不寫

  B、xinetd方式

  修改services加入如下内容

  # vi /etc/services

添加如下兩行:

  rsync  873/tcp  # rsync 

  rsync  873/udp  # rsync

  一般如果作業系統安裝了這個軟體,會有這兩行,到時候添加的時候你可以看下,如果已經有了,就不用再添加次了。修改的目的是讓系統知道873端口對應的服務名為rsync。如沒有的話就自行加入。

  設定 /etc/xinetd.d/rsync, 簡單例子如下:

  # default: off

  # description: The rsync server is a good addition to am ftp server, as it \

  #       allows crc checksumming etc.

  service rsync

  {

        disable = no

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/bin/rsync

        server_args     = --daemon

        log_on_failure  += USERID

  }

  上述, 主要是要打開rsync這個daemon, 一旦有rsync client要連接配接時, xinetd會把它轉介給 rsyncd(port 873)。然後service xinetd restart, 使上述設定生效.

注意:

    有時候,你可能發現/etc/目錄下沒有xinetd.d 、xinetd.conf檔案,這是因為你的os沒有安裝xinetd服務,直接從作業系統安裝包裡(或者yum源)安裝下:

[root@test var]# yum list|grep xinetd

xinetd.x86_64                  2:2.3.14-39.el6_4  @rhel-x86_64-server-6         

xinetd-debuginfo.x86_64        2:2.3.14-39.el6_4  rhel-x86_64-server-6-debuginfo

然後就可以改xinetd.d目錄下的檔案了。

關于如何啟動關閉xinetd服務,參考部落格 :http://blog.csdn.net/cymm_liu/article/details/9372255

rsync伺服器和防火牆

  Linux 防火牆是用iptables,是以我們至少在伺服器端要讓你所定義的rsync 伺服器端口通過,用戶端上也應該讓通過。

  #iptables -A INPUT -p tcp -m state --state NEW  -m tcp --dport 873 -j ACCEPT

  #iptables -L  檢視一下防火牆是不是打開了 873端口

  如果你不太懂防火牆的配置,可以先service iptables stop 将防火牆關掉。當然在生産環境這是很危險的,做實驗才可以這麼做喲!

關于linux 防火牆政策參考:http://blog.csdn.net/cymm_liu/article/details/11556365

5、通過rsync用戶端來同步資料

A、文法詳解

 

  在配置完rsync伺服器後,就可以從用戶端發出rsync指令來實作各種同步的操作。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傳輸,不過隻要在指令中省略掉本地機資訊即可。

  -a 以archive模式操作、複制目錄、符号連接配接 相當于-rlptgoD

  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、ssh方式進行資料同步

--rsync-path=PATH 指定遠端伺服器上的rsync指令所在路徑資訊

-C, --cvs-exclude 使用和CVS一樣的方法自動忽略檔案,用來排除那些不希望傳輸的檔案

--existing 僅僅更新那些已經存在于DST的檔案,而不備份那些新建立的檔案

--delete 删除那些DST中SRC沒有的檔案,delete是指如果伺服器端删除了這一檔案,那麼用戶端也相應把檔案删除,保持真正的一緻

--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中得到密碼;--password-file=/password/path/file來指定密碼檔案,這樣就可以在腳本中使用而無需互動式地輸入驗證密碼了,這裡需要注意的是這份密碼檔案權限屬性要設得隻有屬主可讀。

--bwlimit=KBPS 限制I/O帶寬,KBytes per second

-h, --help 顯示幫助資訊

B、一些執行個體

  B1、列出rsync 伺服器上的所提供的同步内容;

  首先:我們看看rsync伺服器上提供了哪些可用的資料源

             2002------2009

  rhel4home       This is RHEL 4 data

   注:前面是rsync所提供的資料源,也就是我們在rsyncd.conf中所寫的[rhel4home]子產品。而“This is RHEL 4 data”是由[rhel4home]子產品中的 comment = This is RHEL 4 data 提供的;為什麼沒有把rhel4opt資料源列出來呢?因為我們在[rhel4opt]中已經把list=no了。

             2002------2009

  Password: 

  drwxr-xr-x        4096 2009/03/15 21:33:13 .

  -rw-r--r--        1018 2009/03/02 02:33:41 ks.cfg

  -rwxr-xr-x       21288 2009/03/15 21:33:13 wgetpaste

  drwxrwxr-x        4096 2008/10/28 21:04:05 cvsroot

  drwx------        4096 2008/11/30 16:30:58 easylife

  drwsr-sr-x        4096 2008/09/20 22:18:05 giddir

  drwx------        4096 2008/09/29 14:18:46 quser1

  drwx------        4096 2008/09/27 14:38:12 quser2

  drwx------        4096 2008/11/14 06:10:19 test

  drwx------        4096 2008/09/22 16:50:37 vbird1

  drwx------        4096 2008/09/19 15:28:45 vbird2

  B2、rsync用戶端同步資料;

  Password: 這裡要輸入root的密碼,是伺服器端rsyncd.secrets提供的。在前面的例子中我們用的是rsyncmima,輸入的密碼并不回顯,輸好就回車。

   注: 這個指令的意思就是說,用root使用者登入到伺服器上,把rhel4home資料,同步到本地目前目錄rhel4home上。當然本地的目錄是可以你自己 定義的。如果當你在用戶端上目前操作的目錄下沒有rhel4home這個目錄時,系統會自動為你建立一個;當存在rhel4home這個目錄中,你要注意 它的寫權限。

   這回我們引入一個--delete 選項,表示用戶端上的資料要與伺服器端完全一緻,如果 linuxsirhome目錄中有伺服器上不存在的檔案,則删除。最終目的是讓linuxsirhome目錄上的資料完全與伺服器上保持一緻;用的時候要 小心點,最好不要把已經有重要數所據的目錄,當做本地更新目錄,否則會把你的資料全部删除;

  設定 rsync client:

  設定密碼檔案

  這次我們加了一個選項 --password-file=/etc/rsyncd.secrets,這是當我們以root使用者登入rsync伺服器同步資料時,密碼将讀取/etc/rsyncd.secrets這個檔案。這個檔案内容隻是root使用者的密碼。我們要如下做;

  # touch /etc/rsyncd.secrets

  # chmod 600 rsyncd.secrets

  # echo "rsyncmima"> rsyncd.secrets

  注:這裡需要注意的是這份密碼檔案權限屬性要設得隻有屬主可讀。

    這樣就不需要密碼了;其實這是比較重要的,因為伺服器通過crond 計劃任務還是有必要的;

  B3、讓rsync用戶端自動與伺服器同步資料:

   伺服器是重量級應用,是以資料的網絡備份還是極為重要的。我們可以在生産型伺服器上配置好rsync 伺服器。我們可以把一台裝有rysnc機器當做是備份伺服器。讓這台備份伺服器,每天在早上4點開始同步伺服器上的資料;并且每個備份都是完整備份。有時 硬碟壞掉,或者伺服器資料被删除,完整備份還是相當重要的。這種備份相當于每天為伺服器的資料做一個鏡像,當生産型伺服器發生事故時,我們可以輕松恢複數 據,能把資料損失降到最低;是不是這麼回事??

  step1:建立同步腳本和密碼檔案

  #mkdir   /etc/cron.daily.rsync

  #cd  /etc/cron.daily.rsync 

  #touch rhel4home.sh  rhel4opt.sh 

  #chmod 755 /etc/cron.daily.rsync/*.sh  

  #mkdir /etc/rsyncd/

  #touch /etc/rsyncd/rsyncrhel4root.secrets

  #touch /etc/rsyncd/rsyncrhel4easylife.secrets

  #chmod 600  /etc/rsyncd/rsync.*

   注: 我們在 /etc/cron.daily/中建立了兩個檔案rhel4home.sh和rhel4opt.sh ,并且是權限是755的。建立了兩個密碼檔案root使用者用的是rsyncrhel4root.secrets ,easylife使用者用的是 rsyncrhel4easylife.secrets,權限是600;

  我們編輯rhel4home.sh,内容是如下的:

  #!/bin/sh

  #backup 192.168.145.5:/home 

  我們編輯 rhel4opt.sh ,内容是:

  #backup 192.168.145.5:/opt 

  注:你可以把rhel4home.sh和rhel4opt.sh的内容合并到一個檔案中,比如都寫到rhel4bak.sh中;

  接着我們修改 /etc/rsyncd/rsyncrhel4root.secrets和rsyncrhel4easylife.secrets的内容;

  # echo "mike" > /etc/rsyncd/rsyncrhel4root.secrets

  # echo "keer"> /etc/rsyncd/rsyncrhel4easylife.secrets

   然後我們再/home目錄下建立rhel4homebak 和rhel4optbak兩個目錄,意思是伺服器端的rhel4home資料同步到備份伺服器上的/home/rhel4homebak 下,rhel4opt資料同步到 /home/rhel4optbak/目錄下。并按年月日歸檔建立目錄;每天備份都存檔;

  #mkdir /home/rhel4homebak

  #mkdir /home/rhel4optbak

  step2:修改crond伺服器的配置檔案 加入到計劃任務

  #crontab  -e

  加入下面的内容:

  # Run daily cron jobs at 4:10 every day  backup rhel4 data:  

  10 4 * * * /usr/bin/run-parts   /etc/cron.daily.rsync   1> /dev/null

  注:第一行是注釋,是說明内容,這樣能自己記住。

    第二行表示在每天早上4點10分的時候,運作 /etc/cron.daily.rsync 下的可執行腳本任務;

  配置好後,要重新開機crond 伺服器;

  # killall crond    注:殺死crond 伺服器的程序;

  # ps aux |grep crond  注:檢視一下是否被殺死;

  # /usr/sbin/crond    注:啟動 crond 伺服器;

  # ps aux  |grep crond  注:檢視一下是否啟動了?

  root      3815  0.0  0.0   1860   664 ?        S    14:44   0:00 /usr/sbin/crond

  root      3819  0.0  0.0   2188   808 pts/1    S+   14:45   0:00 grep crond

有個Solaris部署文檔,參考:http://www.blogjava.net/lishengliang/archive/2006/04/26/43309.html

6、FAQ 和 常見錯誤排除:

  Q:如何通過ssh進行rsync,而且無須輸入密碼?

  A:可以通過以下幾個步驟

  1. 通過ssh-keygen在server A上建立SSH keys,不要指定密碼,你會在~/.ssh下看到identity和identity.pub檔案 

  2. 在server B上的home目錄建立子目錄.ssh

  3. 将A的identity.pub拷貝到server B上

  4. 将identity.pub加到~[user b]/.ssh/authorized_keys

  5. 于是server A上的A使用者,可通過下面指令以使用者B ssh到server B上了。e.g. ssh -l userB serverB。這樣就使server A上的使用者A就可以ssh以使用者B的身份無需密碼登陸到server B上了。

  Q:如何通過在不危害安全的情況下通過防火牆使用rsync?

  A:解答如下:

   這通常有兩種情況,一種是伺服器在防火牆内,一種是伺服器在防火牆外。無論哪種情況,通常還是使用ssh,這時最好建立一個備份使用者,并且配置sshd 僅允許這個使用者通過RSA認證方式進入。如果伺服器在防火牆内,則最好限定用戶端的IP位址,拒絕其它所有連接配接。如果客戶機在防火牆内,則可以簡單允許防 火牆打開TCP端口22的ssh外發連接配接就ok了。

  Q:我能将更改過或者删除的檔案也備份上來嗎?

  A:當然可 以。你可以使用如:rsync -other -options -backupdir = ./backup-2000-2-13  ...這樣的指令來實作。這樣如果源檔案:/path/to/some/file.c改變了,那麼舊的檔案就會被移到./backup- 2000-2-13/path/to/some/file.c,這裡這個目錄需要自己手工建立起來

  Q:我需要在防火牆上開放哪些端口以适應rsync?

  A:視情況而定。rsync可以直接通過873端口的tcp連接配接傳檔案,也可以通過22端口的ssh來進行檔案傳遞,但你也可以通過下列指令改變它的端口:

  rsync --port 8730 otherhost::

  或者

  rsync -e 'ssh -p 2002' otherhost:

  Q:我如何通過rsync隻複制目錄結構,忽略掉檔案呢?

  A:rsync -av --include '*/' --exclude '*' source-dir dest-dir

  Q:為什麼我總會出現"Read-only file system"的錯誤呢?

  A:看看是否忘了設"read only = no"了

  A:rsync使用時預設是用uid=nobody;gid=nobody來運作的,如果你的系統不存在nobody組的話,就會出現這樣的錯誤,可以試試gid = ogroup或者其它

  Q:綁定端口873失敗是怎麼回事?

  A:如果你不是以root權限運作這一守護程序的話,因為1024端口以下是特權端口,會出現這樣的錯誤。你可以用--port參數來改變。

  Q:為什麼我認證失敗?

  A:從你的指令行看來:你用的是

  > bash$ rsync -a 144.16.251.213::test test

  > Password:

  > @ERROR: auth failed on module test 

  > 

  > I dont understand this. Can somebody explain as to how to acomplish this.

  > All suggestions are welcome.

  Q: 出現以下這個訊息, 是怎麼一回事?

  @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)

  A: 這是因為密碼設錯了, 無法登入成功, 請再檢查一下 rsyncd.secrets 中的密碼設定, 二端是否一緻?

  password file must not be other-accessible 

  continuing without password file 

  Password:

  A: 這表示 rsyncd.secrets 的檔案權限屬性不對, 應設為 600。請下 chmod 600 rsyncd.secrets

  @ERROR: chroot failed

  rsync: connection unexpectedly closed (75 bytes read so far)

  A: 這通常是您的 rsyncd.conf 中的 path 路徑所設的那個目錄并不存在所緻.請先用 mkdir開設好備份目錄.

常見錯誤:

*************************************************************************************************

錯誤1:

在最後帶上--password-file=/cygdrive/f/mysql5.5.16/cwRsync/pwd.secrets時,提示:

password file must not be other-accessible

continuing without password file

Password:

網上答案是:WINDOW出現這種情況,是因為pwd.secrets的權限不對,或存放的位置不是NTFS檔案系統。但二者均檢驗過,仍無效。

嘗試了:

A、用/cygdrive/f...

B、路徑改成f:/和f:\,

C、把--password-file選項放前面或後面

D、把pwd.secrets的屬性安全隻保留WINDOWS帳戶或cwRsync,且隻讀。

E、把linux其它用戶端上的rsyncd.pwd拖下來給window也不行。

四種情況均無效。有待進一步嘗試。

在linux上出現這種錯誤則容易解決。原因是這份用戶端的密碼檔案必需設成調用者隻讀屬性“600”才行。

錯誤2: 

rsync: read error: Connection reset by peer (104)

rsync error: error in rsync protocol data stream (code 12) at io.c(794) [receive

r=3.0.2]

解決:很大可能是伺服器端沒有開啟 rsync 服務。開啟服務。

錯誤3:

@ERROR: chdir failed

rsync error: error starting client-server protocol (code 5) at main.c(1495) [receiver=3.0.2]

解決:伺服器端同步目錄沒有權限,cwrsync 預設使用者是Svcwrsync。為同步

目錄添加使用者Svcwrsync 權限。

錯誤4:

rsync: failed to connect to 210.28.93.4: No route to host (113)

是server端口的防火牆端口沒開。

錯誤5:

@ERROR: chroot failed

rsync error: error starting client-server protocol (code 5) at main.c(1503) [sender=3.0.6] 

是伺服器上忘記建立目錄了…

錯誤6:

rsync warning: some files vanished before they could be transferred (code 24) at main.c(1039) [sender=3.0.6]

本地檔案在同步過程中被删除了。

錯誤7:

rsync error: some files could not be transferred (code 23) at main.c(1385) [generator=2.6.9] 

這是因為在伺服器端的備份檔案名中有非法符号,可能造成Windows同步資料時無法識别檔案名。

錯誤8:

@ERROR: failed to open lock file

rsync error: error starting client-server protocol (code 5) at main.c(1495) [rec

eiver=3.0.2]

解決:配置檔案 rsync.conf 中添加 lock file = rsyncd.lock 即可解決。

錯誤9:

@ERROR: auth failed on module XXX

出現這種情況,先檢查你的使用者名、密碼、主機IP位址是否正确,

如果都正确,有一個可能是原因是:遠端rsync伺服器的帳戶密碼檔案的權限必須為600,例如,你在rsyncd.conf中設定了secrets file =

/etc/rsyncd/rsync_pwd

那麼你就必須確定rsync_pwd的通路權限為600:

chmod 600 /etc/rsyncd/rsync_pwd

然後你的問題可能就解決了。

錯誤一

rsync: failed to connect to 96.44.169.178 (*inet_ntop failed*): Connection timed

out (116)

      1 [main] rsync 3468 exception::handle: Exception: STATUS_ACCESS_VIOLATION

    740 [main] rsync 3468 open_stackdumpfile: Dumping stack trace to rsync.exe.s

tackdump

1,防火牆問題

2,端口不對

錯誤二

@ERROR: auth failed on module www

rsync error: error starting client-server protocol (code 5) at main.c(1516) [Rec

eiver=3.0.8]

密碼不對

錯誤三

@ERROR: invalid uid nobody

UID不對,預設是nobody

解決方法:

uid = 0

gid = 0

錯誤四

receiving incremental file list

rsync error: error in rsync protocol data stream (code 12) at io.c(769) [receive

r=3.0.8]

rsync: connection unexpectedly closed (60 bytes received so far) [generator]

rsync error: error in rsync protocol data stream (code 12) at io.c(610) [generat

or=3.0.8]

可能原因:

1,磁盤挂載是用異步的(async)

然後,檢查了/etc/fstab ,去掉async參數。

2,我在伺服器上檢視日志,看到有這麼一行:

rsync: unable to open configuration file "/etc/rsyncd.conf": No such file or directory

于是我:

ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf

3,同步檔案數較多的目錄出錯

有個子目錄中檔案較多,也就8000來個吧,總是同步一半便退出。在批進行中加上-v參數,看到錯誤資訊如下:

rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Connection reset by peer (104)

rsync error: error in rsync protocol data stream (code 12) at io.c(768) [sender=

3.0.6]

這個問題有點頭疼,在www.itefix.no網站論壇上也沒能查出個是以然。

不過最終還是在samba.org上找到解決方案:

在用戶端指令行中加上--no-iconv參數就可以了。

原以為是檔案太多,緩沖區不夠引起,但看這個解決方案,似乎是轉換編碼方面的bug了。

在rsync的文檔中描述如下:

http://rsync.samba.org/ftp/rsync/rsync.html

--iconv=CONVERT_SPEC

Rsync can convert filenames between character sets using this option. Using a CONVERT_SPEC of "." tells rsync to look up the default character-set via the locale setting. Alternately, you can fully specify what conversion to do by giving a local and a remote charset separated by a comma in the order --iconv=LOCAL,REMOTE, e.g. --iconv=utf8,iso88591. This order ensures that the option will stay the same whether you're pushing or pulling files. Finally, you can specify either --no-iconv or a CONVERT_SPEC of "-" to turn off any conversion. The default setting of this option is site-specific, and can also be affected via the RSYNC_ICONV environment variable.

五、問題排除及注意事項

問題排除:

1、問題1

rsync error: error in rsync protocol data stream (code 12) at io.c(614) [receiver=2.6.8]

解決:在伺服器上檢視日志,看到有這麼一行:

rsync: unable to open configuration file “/etc/rsyncd.conf”: No such file or directory

于是執行如下指令:

[root@bogon ~]# ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf

但是繼續報如下錯誤:

sending incremental file list

ERROR: module is read only

rsync error: syntax or usage error (code 1) at main.c(879) [Receiver=3.0.8]

rsync error: error in rsync protocol data stream (code 12) at io.c(760) [sender=3.0.8]

到備份伺服器上修改主配置檔案

[root@bogon ~]# vim /etc/rsyncd/rsyncd.conf

read only=yes

改為

read only=no

問題解決,實作單向同步

2、問題2

[root@www backup]# rsync -vzrtopg –progress –delete [email protected]::promise /home/bak/

rsync error: error starting client-server protocol (code 5) at main.c(1516) [Receiver=3.0.8]

解決:目錄設定錯誤

确定配置檔案裡的目錄正确

3、問題3

在Linux下使用rsync同步時,出現以下錯誤:

@ERROR: auth failed on module bakup

其中,bakup是rsync服務子產品名稱。

出現這種情況,先檢查了使用者名和密碼正确性,經檢查無誤,排除了這個可能性,另外可能的原因是:rsync伺服器的帳戶密碼檔案的權限沒有設定為600,修改/etc/rsyncd/rsyncd.secrets檔案:

[root@bogon ~]#

chmod 600 /etc/rsyncd/rsyncd.secrets

問題解決。

4、問題4

在備份路徑後面一定要加“/”,否則在雙向同步時會一直循環同步。如:

src=/var/www/  //後面一定要加“/”

5、問題5

同步mysql資料時需要注意:

本地源主機(H1)是一台web伺服器,把/var/lib/mysql備份到備份伺服器(H2),當web伺服器上的資料受損時需要從備份伺服器把資料同步到web伺服器

執行腳本檔案:/usr/local/sbin/rsync.sh

同步備份伺服器上的/var/lib/mysql到web伺服器後仍然無法通路網站,此時需要重新開機mysql

#/etc/init.d/mysqld restart

網上相關資料:

資料一:

 最近在配置rsync伺服器鏡像備份。中間遇到@ERROR: auth failed on module  這個問題,網上找了好多資料,也具體對照測試了。

    1、

    [root@bo bin]# /usr/local/rsync/bin/rsync -vazu -progress –delete [email protected]::www /tmp –password-file=/etc/backserver.pas

    rsync: Failed to exec ss: No such file or directory (2)

    rsync error: error in IPC code (code 14) at pipe.c(86) [receiver=2.6.9]

    rsync: writefd_unbuffered failed to write 12 bytes [receiver]: Broken pipe (32)

    rsync error: error in rsync protocol data stream (code 12) at io.c(1122) [receiver=2.6.9]

    [root@ht-store bin]#

    以上錯誤可能是上面使用的參數前面的符号不正确。換成下面的就沒有上面的錯誤了

    [root@bo /]# usr/local/rsync/bin/rsync -vzrtopgu –progress –delete –password-file=/etc/backserver.pas [email protected]:www /tmp

    2、

    [root@ht-store /]# usr/local/rsync/bin/rsync -vzrtopgu –progress –delete [email protected]:www /tmp/ –password-file=/etc/backserver.pas

    [email protected]′s password:

    Permission denied, please try again.

    Permission denied (publickey,gssapi-with-mic,password).

    rsync: connection unexpectedly closed (0 bytes received so far) [receiver]

    rsync error: unexplained error (code 255) at io.c(453) [receiver=2.6.9]

    [root@ht-store /]#

    更改成

    [root@ht-store /]# usr/local/rsync/bin/rsync -vzrtopgu –progress –delete –password-file=/etc/backserver.pas

 [email protected]::www /tmp

    @ERROR: auth failed on module www

    rsync error: error starting client-server protocol (code 5) at main.c(1383) [receiver=2.6.9]

    3、

    [root@ht-store /]# /usr/local/rsync/bin/rsync -vazu –progress –delete –password-file=/etc/backserver.pas

    [email protected]::www /tmp

    檢查一下使用者名是否錯誤backserver 應該是backup

    4、

    [root@ht-store /]# /usr/local/rsync/bin/rsync -vzar –progress –delete –password-file=/etc/backserver.pas [email protected]:www /tmp

    rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(244) [receiver=2.6.9]

    是雙引号“::”[email protected]::www  而不是單引号“:”[email protected]:www

    5、

    [root@ht-store /]# /usr/local/rsync/bin/rsync -vzrtopgu –progress –delete –password-file=/etc/backserver.pas [email protected]::www /tmp

    @ERROR: Unknown module ‘www’

    這是因為伺服器端hosts allow 沒有允許該主機通路

資料二:

  1. Q: 出現以下這個訊息, 是怎麼一回事?

    @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)

    A: 這是因為密碼設錯了, 無法登入成功, 請再檢查一下 rsyncd.pwd ,rsyncd.sec中的密碼設定, 二端是否一緻?有時伺服器

    端沒有起動服務也會出現這種情況

    2. Q: 出現以下這個訊息, 是怎麼一回事?

    password file must not be other-accessible

    continuing without password file

    Password:

    A: 這表示 rsyncd.pwd rsyncd.sec 的檔案權限屬性不對, 應設為 600

    請下 chmod 600 rsyncd.pwd rsyncd.sec

    3. Q: 出現以下這個訊息, 是怎麼一回事?

    @ERROR: chroot failed

    rsync: connection unexpectedly closed (75 bytes read so far)

    A: 這通常是您的 rsyncd.conf 中

    的 path 路徑所設的那個目錄並不存在所緻.

    請先用 mkdir 開設好備份目錄.

    4.Q:出現一下資訊是怎麼回事

    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]

    是以情況會是:

    1. 對方主機沒開機

    2. 對方有 firewall 阻擋

    3. 所通過的網路上有 firewall 阻擋

    shell>setup   #關閉防火牆,其實最重要的也就是把tcp udp 的873端口打開。

    5.Q:出現一下資訊是怎麼回事

    當

    /server/rsync/bin/rsync -vzrutogp –progress –password-file=/etc/rsyncclien

    t.pwd [email protected]:backup /var/www/backup

    出現

    [email protected]′s password

  最有可能的情況是,系統沒有認出來,你現在的通信是rsync,是以請仔細檢查一下上面加紅的那句話中ip位址後面是否為兩個:也就是說::為rsync通信,:為ssh通信

    6.Q:

    當/server/rsync/bin/rsync rsync://[email protected]/backup時,出現如下

    rsync: link_stat “/.” (in backup) failed: Permission denied (13)

    rsync error: some files could not be transferred (code 23) at main.c(1385) [receiver=2.6.9]

    解決方法:更改你的rsyncd.conf中的

    uid=nobody

    gid=nobody

    為

    uid=root

    gid=root

  解決方法2

    出現這樣問題的原因是我要同步的這個root目錄在掩位的最後一位

    不是r-x或以上的權限,也就是說root這個目錄一定要等于或大于drwxr-xr-x才能同步。

附錄一:源主機和備份伺服器的配置文檔

源主機配置檔案 

 見附件<rsync.sh>、<rsyncd.pass>

備份伺服器配置檔案

 見附件<rsyncd.conf>、<rsyncd.motd>、<rsyncd.secrets>

附錄二:Rsync的INSTALL文檔

 見附件<INSTALL_Rsync>

附錄三:Inotify的INSTLL文檔

 見附件<INSTALL_Inotify>

注意,有時候安裝時會出點末知原因,例如,不能程式本身沒有注冊服務,可以通過好動方式:

C:\ICW\bin>cygrunsrv.exe -I "Rsync" -p "/cygdrive/C/ICW/bin/rsync.exe" -a "--config=/cygdrive/C/ICW/rsyncd.conf --daemon --no-detach" -f "Rsync"

5、常用選項:

-vzrtopg --delete是常用選項。

【-u選項可以保障當從機有更新過同名檔案時,不會在同步時被主機更改。】

【--delete如果想保持用戶端和服務端真正同步,應使用此選項,這樣服務端删掉某檔案時,用戶端也會删掉】

【-e ssh如果想用ssh傳輸,則應加此選項】

-a, --archive 歸檔模式,表示以遞歸方式傳輸檔案,并保持所有檔案屬性,等于-rlptgoD

-v, --verbose 詳細模式輸出

-q, --quiet 精簡輸出模式

-c, --checksum 打開校驗開關,強制對檔案傳輸進行校驗

-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 位元組

--password-file=/password/path/file指定密碼檔案,這樣可以在腳本中使用而無需互動式地輸入驗證密碼了,需要注意的是這份密碼檔案權限屬性要設得隻有屬主可讀。chmod 600 /etc/rsyncd.pwd

-e, --rsh=COMMAND 指定使用rsh、ssh 方式進行資料同步

--rsync-path=PATH 指定遠端伺服器上的rsync 指令所在路徑資訊

-C, --cvs-exclude 使用和CVS 一樣的方法自動忽略檔案,用來排除那些不希望

傳輸的檔案

--existing 僅僅更新那些已經存在于DST 的檔案,而不備份那些新建立的檔案

--delete-excluded 同樣删除接收端那些被該選項指定排除的檔案

--delete是指如果伺服器端删除了這一檔案,那麼用戶端也相應把檔案删除,保持真正的一緻。【慎用】

--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 指定日志檔案格式

下面是我自己用的一段小代碼

cd "C:\Program Files\ICW\bin\"

c:

rsync.exe -ravz --progress [email protected]::CRM61 --port 18910 /cygdrive/D/CRM61/Library/ <D:\CRM61\a.txt

rsync.exe -ravz --progress [email protected]::CustomPages --port 18910 /cygdrive/D/Sage/CRM/MetenCRM/WWWRoot/CustomPages/ <D:\CRM61\a.txt

繼續閱讀