rsync實現文件備份同步(好比服務器鏡像)

[rsync實現網站的備份,文件的同步,不一樣系統的文件的同步,若是是windows的話,須要windows版本cwrsync]html

1、什麼是rsynclinux

  rsync,remote synchronize顧名思意就知道它是一款實現遠程同步功能的軟件,它在同步文件的同時,能夠保持原來文件的權限、時間、軟硬連接等附加信息。 rsync是用 「rsync 算法」提供了一個客戶機和遠程文件服務器的文件同步的快速方法,並且能夠經過ssh方式來傳輸文件,這樣其保密性也很是好,另外它仍是免費的軟件。web

  rsync 包括以下的一些特性:算法

  能更新整個目錄和樹和文件系統;
  有選擇性的保持符號鏈鏈、硬連接、文件屬於、權限、設備以及時間等;
  對於安裝來講,無任何特殊權限要求;
  對於多個文件來講,內部流水線減小文件等待的延時;
  能用rsh、ssh 或直接端口作爲傳輸入端口;
  支持匿名rsync 同步文件,是理想的鏡像工具;shell

2、架設rsync服務器ubuntu

  架設rsync 服務器比較簡單,寫一個配置文件rsyncd.conf 。文件的書寫也是有規則的,咱們能夠參照rsync.samba.org 上的文檔來作。固然咱們首先要安裝好rsync這個軟件才行;windows

A、rsync的安裝;安全

  獲取rsyncbash

  rysnc的官方網站:http://rsync.samba.org/能夠從上面獲得最新的版本。目前最新版是3.05。固然,由於rsync是一款如此有用的軟件,因此不少Linux的發行版本都將它收錄在內了。服務器

  軟件包安裝

  # 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),該文件默認不存在,請建立它。

  具體步驟以下:

  #touch /etc/rsyncd.conf  #建立rsyncd.conf,這是rsync服務器的配置文件。
  #touch /etc/rsyncd.secrets  #建立rsyncd.secrets ,這是用戶密碼文件。
  #chmod 600 /etc/rsyncd/rsyncd.secrets  #將rsyncd.secrets這個密碼文件的文件屬性設爲root擁有, 且權限要設爲600, 不然沒法備份成功!
  #touch /etc/rsyncd.motd

  下一就是咱們修改rsyncd.conf和rsyncd.secrets和rsyncd.motd文件的時候了。

  設定/etc/rsyncd.conf

  rsyncd.conf是rsync服務器主要配置文件。咱們先來個簡單的示例,後面在詳細說明各項做用。

  好比咱們要備份服務器上的/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

  設定密碼文件

  密碼文件格式很簡單,rsyncd.secrets的內容格式爲:

  用戶名:密碼

  咱們在例子中rsyncd.secrets的內容以下相似的;在文檔中說,有些系統不支持長密碼,本身嘗試着設置一下吧。

  easylife:keer
  root:mike

  chown root.root rsyncd.secrets  #修改屬主
  chmod 600 rsyncd.secrets     #修改權限

  注:一、將rsyncd.secrets這個密碼文件的文件屬性設爲root擁有, 且權限要設爲600, 不然沒法備份成功!            出於安全目的,文件的屬性必需是隻有屬主可讀。
    二、這裏的密碼值得注意,爲了安全你不能把系統用戶的密碼寫在這裏。好比你的系統用戶easylife密碼是000000,爲了安全你可讓rsync中的easylife爲keer。這和samba的用戶認證的密碼原理是差很少的。

  設定rsyncd.motd 文件;

   它是定義rysnc服務器信息的,也就是用戶登陸信息。好比讓用戶知道這個服務器是誰提供的等;相似ftp服務器登陸時,咱們所看到的 linuxsir.org ftp ……。 固然這在全局定義變量時,並非必須的,你能夠用#號注掉,或刪除;我在這裏寫了一個 rsyncd.motd的內容爲:

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
           2002------2009
  ++++++++++++++++++++++++++++++++++++++++++++++

3、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 = yes 

  注:read only 是隻讀選擇,也就是說,不讓客戶端上傳文件到服務器上。還有一個 write only選項,本身嘗試是作什麼用的吧;

  #limit access to private LANs
  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 = /etc/rsyncd/rsyncd.motd

  注:motd file 是定義服務器信息的,要本身寫 rsyncd.motd 文件內容。當用戶登陸時會看到這個信息。好比我寫的是:

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
           2002------2009
  ++++++++++++++++++++++++++++++++++++++++++++++

  log file = /var/log/rsync.log

  注:rsync 服務器的日誌;

  transfer logging = yes

  注:這是傳輸文件的日誌

  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300

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]  
  path = /opt 
  list=no
  comment = optdir   
  auth users = beinan  
  secrets file = /etc/rsyncd/rsyncd.secrets
  ignore errors

4、啓動rsync服務器及防火牆的設置

  啓動rsync服務器至關簡單,有如下幾種方法

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

  #/usr/bin/rsync --daemon  --config=/etc/rsyncd/rsyncd.conf  #--config用於指定rsyncd.conf的位置,若是在/etc下能夠不寫

  B、xinetd方式

  修改services加入以下內容
  # nano -w /etc/services

  rsync  873/tcp  # rsync 
  rsync  873/udp  # rsync

  這一步通常能夠不作,一般都有這兩行(個人RHEL4和GENTOO默認都有)。修改的目的是讓系統知道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, 使上述設定生效.

  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 將防火牆關掉。固然在生產環境這是很危險的,作實驗才能夠這麼作喲!

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中的參數

  -r 是遞歸 
  -l 是連接文件,意思是拷貝連接文件;-p 表示保持文件原有權限;-t 保持文件原有時間;-g 保持文件原有用戶組;-o 保持文件原有屬主;-D 至關於塊設備文件;
  -z 傳輸時壓縮;
  -P 傳輸進度;
  -v 傳輸時的進度等信息,和-P有點關係,本身試試。能夠看文檔;
  -e ssh的參數創建起加密的鏈接。
  -u只進行更新,防止本地新文件被重寫,注意二者機器的時鐘的同時
  --progress是指顯示出詳細的進度狀況
  --delete是指若是服務器端刪除了這一文件,那麼客戶端也相應把文件刪除,保持真正的一致
  --password-file=/password/path/file來指定密碼文件,這樣就能夠在腳本中使用而無需交互式地輸入驗證密碼了,這裏須要注意的是這份密碼文件權限屬性要設得只有屬主可讀。

B、一些實例

  B一、列出rsync 服務器上的所提供的同步內容;

  首先:咱們看看rsync服務器上提供了哪些可用的數據源

  # rsync  --list-only  root@192.168.145.5::
  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
             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了。

  $ rsync  --list-only  root@192.168.145.5::::rhel4home 

  ++++++++++++++++++++++++++++++++++++++++++++++
  Welcome to use the mike.org.cn rsync services!
             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

  後面的root@ip中,root是指定密碼文件中的用戶名,以後的::rhel4home這是rhel4home模塊名

  B二、rsync客戶端同步數據;

  #rsync -avzP root@192.168.145.5::rhel4home rhel4home
  Password: 這裏要輸入root的密碼,是服務器端rsyncd.secrets提供的。在前面的例子中咱們用的是mike,輸入的密碼並不回顯,輸好就回車。

   注: 這個命令的意思就是說,用root用戶登陸到服務器上,把rhel4home數據,同步到本地當前目錄rhel4home上。固然本地的目錄是能夠你本身 定義的。若是當你在客戶端上當前操做的目錄下沒有rhel4home這個目錄時,系統會自動爲你建立一個;當存在rhel4home這個目錄中,你要注意 它的寫權限。

  #rsync -avzP  --delete linuxsir@linuxsir.org::rhel4home   rhel4home

   這回咱們引入一個--delete 選項,表示客戶端上的數據要與服務器端徹底一致,若是 linuxsirhome目錄中有服務器上不存在的文件,則刪除。最終目的是讓linuxsirhome目錄上的數據徹底與服務器上保持一致;用的時候要 當心點,最好不要把已經有重要數所據的目錄,當作本地更新目錄,不然會把你的數據所有刪除;

  設定 rsync client

  設定密碼文件

  #rsync -avzP  --delete  --password-file=rsyncd.secrets   root@192.168.145.5::rhel4home rhel4home

  此次咱們加了一個選項 --password-file=rsyncd.secrets,這是當咱們以root用戶登陸rsync服務器同步數據時,密碼將讀取rsyncd.secrets這個文件。這個文件內容只是root用戶的密碼。咱們要以下作;

  # touch rsyncd.secrets
  # chmod 600 rsyncd.secrets
  # echo "mike"> rsyncd.secrets

  # rsync -avzP  --delete  --password-file=rsyncd.secrets   root@192.168.145.5::rhel4home rhel4home

  注:這裏須要注意的是這份密碼文件權限屬性要設得只有屬主可讀。

    這樣就不須要密碼了;其實這是比較重要的,由於服務器經過crond 計劃任務仍是有必要的;

  B三、讓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 
  /usr/bin/rsync   -avzP  --password-file=/etc/rsyncd/rsyncrhel4root.password   root@192.168.145.5::rhel4home   /home/rhel4homebak/$(date +'%m-%d-%y')

  咱們編輯 rhel4opt.sh ,內容是:

  #!/bin/sh
  #backup 192.168.145.5:/opt 
  /usr/bin/rsync   -avzP  --password-file=/etc/rsyncd/rsyncrhel4easylife.secrets    easylife@192.168.145.5::rhel4opt   /home/rhel4hoptbak/$(date +'%m-%d-%y')

  注:你能夠把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

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"了

  Q:爲何我會出現'@ERROR: invalid gid'的錯誤呢?

  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.

  應該是沒有以你的用戶名登錄致使的問題,試試rsync -a max@144.16.251.213::test test

  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 中的密碼設定, 二端是否一致?

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

  password file must not be other-accessible 
  continuing without password file 
  Password:

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

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

  @ERROR: chroot failed
  rsync: connection unexpectedly closed (75 bytes read so far)
  rsync error: error in rsync protocol data stream (code 12) at io.c(150)

  A: 這一般是您的 rsyncd.conf 中的 path 路徑所設的那個目錄並不存在所致.請先用 mkdir開設好備份目錄.

完!

(轉自:http://www.cnblogs.com/itech/archive/2009/08/10/1542945.html

 

參數:

若是你是一位運維工程師,你極可能會面對幾十臺、幾百臺甚至上千臺服務器,除了批量操做外,環境同步、數據同步也是必不可少的技能。

 

說到「同步」,不得不提的利器就是rsync,今天就來講說我從這個工具中看到的同步的藝術。

 

[不帶任何選項]

 

咱們常常這樣使用rsync:

 

$ rsync main.c machineB:/home/userB

 

1 只要目的端的文件內容和源端不同,就會觸發數據同步,rsync會確保兩邊的文件內容同樣。
2 但rsync不會同步文件的「modify time」,凡有數據同步的文件,目的端的文件的「modify time」老是會被修改成最新時刻的時間。
3 rsync不會太關注目的端文件的rwx權限,若是目的端沒有此文件,那麼權限會保持與源端一致;若是目的端有此文件,則權限不會隨着源端變動。
4 只要rsync有對源文件的讀權限,且對目標路徑有寫權限,rsync就能確保目的端文件同步到和源端一致。
5 rsync只能以登錄目的端的帳號來建立文件,它沒有能力保持目的端文件的輸主和屬組和源端一致。(除非你使用root權限,纔有資格要求屬主一致、屬組一致)

 

[-t選項]

 

咱們常常這樣使用-t選項:

 

$ rsync -t main.c machineB:/home/userB

 

1 使用-t選項後,rsync總會想着一件事,那就是將源文件的「modify time」同步到目標機器。

 


2 帶有-t選項的rsync,會變得更聰明些,它會在同步前先對比兩邊文件的時間戳和文件大小,若是一致,則就認爲兩邊文件同樣,對此文件就再也不採起更新動做了。
3 由於rsync的聰明,也會反被聰明誤。若是目的端的文件的時間戳、大小和源端徹底一致,可是內容恰巧不一致時,rsync是發現不了的。這就是傳說中的「坑」!
4 對於rsync自做聰明的狀況,解決辦法就是使用-I選項。

 

[-I選項]

 

咱們常常這樣使用-I選項:

 

$ rsync -I main.c machineB:/home/userB

 

1 -I選項會讓rsync變得很乖很老實,它會挨個文件去發起數據同步。
2 -I選項能夠確保數據的一致性,代價即是速度上會變慢,由於咱們放棄了「quick check」策略。(quick check策略,就是先查看文件的時間戳和文件大小,依次先排除一批認爲相同的文件)
3 不管狀況如何,目的端的文件的modify time總會被更新到當前時刻。

 

【-v選項】

 

這個選項,簡單易懂,就是讓rsync輸出更多的信息,咱們能夠舉一個例子:

 

$ rsync -vI main.c machineB:/home/userB                                                   
main.c

sent 81 bytes  received 42 bytes  246.00 bytes/sec
total size is 11  speedup is 0.09

 

你增長越多的v,就能夠得到越多的日誌信息。

 

$ rsync -vvvvt abc.c machineB:/home/userB 
cmd= machine=machineB user= path=/home/userB
cmd[0]=ssh cmd[1]=machineB cmd[2]=rsync cmd[3]=--server cmd[4]=-vvvvte. cmd[5]=. cmd[6]=/home/userB 
opening connection using: ssh machineB rsync --server -vvvvte. . /home/userB 
note: iconv_open("ANSI_X3.4-1968", "ANSI_X3.4-1968") succeeded.
(Client) Protocol versions: remote=28, negotiated=28
(Server) Protocol versions: remote=30, negotiated=28
[sender] make_file(abc.c,*,2)
[sender] flist start=0, used=1, low=0, high=0
[sender] i=0  abc.c mode=0100664 len=11 flags=0
send_file_list done
file list sent
send_files starting
server_recv(2) starting pid=31885
recv_file_name(abc.c)
received 1 names
[receiver] i=0   abc.c mode=0100664 len=11
recv_file_list done
get_local_name count=1 /home/userB
recv_files(1) starting
generator starting pid=31885 count=1
delta transmission enabled
recv_generator(abc.c,0)
abc.c is uptodate
generate_files phase=1
send_files phase=1
recv_files phase=1
generate_files phase=2
send files finished
total: matches=0  hash_hits=0  false_alarms=0 data=0
generate_files finished
recv_files finished
client_run waiting on 14318

sent 36 bytes  received 16 bytes  104.00 bytes/sec
total size is 11  speedup is 0.21
_exit_cleanup(code=0, file=main.c, line=1031): entered
_exit_cleanup(code=0, file=main.c, line=1031): about to call exit(0)

 

[-z選項]

 

這是個壓縮選項,只要使用了這個選項,rsync就會把發向對端的數據先進行壓縮再傳輸。對於網絡環境較差的狀況下建議使用。

 

通常狀況下,-z的壓縮算法會和gzip的同樣。

 

[-r選項]

 

咱們在第一次使用rsync時,每每會遇到這樣的囧境:

 

$ rsync superman machineB:/home/userB
skipping directory superman

 

若是你不額外告訴rsync你須要它幫你同步文件夾的話,它是不會主動承擔的,這也正是rsync的懶惰之處。

 

因此,若是你真的想同步文件夾,那就要加上-r選項,即recursive(遞歸的、循環的),像這樣:

 

$  rsync -r superman machineB:/home/userB

 

咱們在上面的講解中說過,若是時間戳和文件大小徹底一致,只有文件內容不一樣,且你沒有使用-I選項的話,那麼,rsync是不會進行數據同步的。

 

那麼,提個問題:「由於在Linux的世界裏,文件夾也是文件,若是這類文件(文件夾)也只有內容不一樣,而時間戳和文件大小都相同,rsync會發現麼?」

 

實驗你們能夠本身動手作,結論在這裏告訴你們:

 

對於文件夾,rsync是會明察秋毫的,只要你加了-r選項,它就會恪盡職守的進入到文件夾裏去檢查,而不會只對文件夾自己作「quick check」的。

 

[-l選項]

 

若是咱們要同步一個軟連接文件,你猜rsync會提示什麼?

 

$ ll
total 128
-rw-rw-r--  1 userA userA 11 Dec 26 07:00 abc.c
lrwxrwxrwx  1 userA userA  5 Dec 26 11:35 softlink -> abc.c
$ rsync softlink machineB:/home/userB
skipping non-regular file "softlink"

 

嗯,你猜對了,rsync又無情地拒絕了咱們。它一旦發現某個文件是軟連接,就會無視它,除非咱們增長-l選項。

 

$ rsync -l softlink machineB:/home/userB

 

使用了-l選項後,rsync會徹底保持軟連接文件類型,原本來本的將軟連接文件複製到目的端,而不會「follow link」到指向的實體文件。

 

若是我恰恰就想讓rsync採起follow link的方式,那就用-L選項就能夠了。你能夠本身試試效果。

 

[-p選項]

 

這個選項的全名是「perserve permissions」,顧名思義,就是保持權限。

 

若是你不使用此選項的話,rsync是這樣來處理權限問題的:

 

1 若是目的端沒有此文件,那麼在同步後會將目的端文件的權限保持與源端一致;
2 若是目的端已存在此文件,那麼只會同步文件內容,權限保持原有不變。

 

若是你使用了-p選項,則不管如何,rsync都會讓目的端保持與源端的權限一致的。

 

[-g選項和-o選項]

 

這兩個選項是一對,用來保持文件的屬組(group)和屬主(owner),做用應該很清晰明瞭。不過要注意的一點是,改變屬主和屬組,每每只有管理員權限才能夠。

 

[-D選項]

 

-D選項,原文解釋是「preserve devices(root only)」,從字面意思看,就是保持設備文件的原始信息。因爲博主沒有實際體驗過它的好處,因此沒有太多發言權。

 

[-a選項]

 

1 -a選項是rsync裏比較霸道的一個選項,由於你使用-a選項,就至關於使用了-rlptgoD這一坨選項。以一敵七,惟-a選項也。(在看了前文以後,你應該能夠很輕鬆的理解這七個選項的做用了)
2 -a選項的學名應該叫作archive option,中文叫作歸檔選項。使用-a選項,就代表你但願採起遞歸方式來同步,且儘量的保持各個方面的一致性。
3 可是-a選項也有阿克琉斯之踵,那就是-a沒法同步「硬連接」狀況。若是有這方面需求,要加上-H選項。

 

[--delete選項、--delete-excluded選項和--delete-after選項]

 

三個選項都是和「刪除」有關的:

 

1 –delete:若是源端沒有此文件,那麼目的端也別想擁有,刪除之。(若是你使用這個選項,就必須搭配-r選項一塊兒)
2 –delete-excluded:專門指定一些要在目的端刪除的文件。
3 –delete-after:默認狀況下,rsync是先清理目的端的文件再開始數據同步;若是使用此選項,則rsync會先進行數據同步,都完成後再刪除那些須要清理的文件。

 

看到這麼多delete,你是否有點肝顫? 的確,在rsync的官方說明裏也有這麼一句話:

 

This option can be dangerous if used incorrectly!  
It is a very good idea to run first using the dry  run  option
(-n) to see what files would be deleted to make sure 
important files aren't listed.

 

從這句話裏,咱們學到了一個小技巧,那就是-n選項,它是一個嚇唬人的選項,它會用受影響的文件列表來警告你,但不會真的去刪除,這就讓咱們有了確認的機會和迴旋的餘地。咱們看看實際用法吧:

 

$ rsync -n --delete -r . machineB:/home/userB/
deleting superman/xxx
deleting main.c
deleting acclink

 

[--exclude選項和--exclude-from選項]

 

若是你不但願同步一些東西到目的端的話,可使用–exclude選項來隱藏,rsync仍是很重視你們隱私的,你能夠屢次使用–exclude選項來設置不少的「隱私」。

 

若是你要隱藏的隱私太多的話,在命令行選項中設置會比較麻煩,rsync仍是很體貼,它提供了–exclude-from選項,讓你能夠把隱私一一列在一個文件裏,而後讓rsync直接讀取這個文件就行了。

 

[--partial選項]

 

這就是傳說中的斷點續傳功能。默認狀況下,rsync會刪除那些傳輸中斷的文件,而後從新傳輸。但在一些特別狀況下,咱們不但願重傳,而是續傳。

 

咱們在使用中,常常會看到有人會使用-P選項,這個選項實際上是爲了偷懶而設計的。之前人們老是要手動寫–partial –progress,以爲太費勁了,倒不如用一個新的選項來代替,因而-P應運而生了。有些讀者會問–partial我知道做用了,可–progress是幹什麼用的呢?爲何不少人要使用它呢,它有那麼大的吸引力?(真有…)

 

[--progress選項]

 

使用這個選項,rsync會顯示出傳輸進度信息,有什麼用呢,rsync給了一個頗有意思的解釋:

 

This gives a bored user something to watch.

 

好了,寫了這麼多,你們看的已經很乏味了,去實際用用–progress解解悶,是個不錯的選擇 ^_^

 

PS:後續會講解有關rsync的–exclude的PATTERN語法。

 

謝謝!

(來源:http://roclinux.cn/?p=2643

附:      可是須要注意的是必須在服務器A和B上都安裝rsync,其中A服務器上是以服務器模式運行rsync,而B上則以客戶端方式運行rsync。這樣在web服務器A上運行rsync守護進程,在B上定時運行客戶程序來備份web服務器A上須要備份的內容。

相關文章
相關標籤/搜索