Rsync - 資料同步及異地備份

1、前言

Rsync本為用來取代 rcp 的一個工具,目前由 rsync.samba.org 維護,Rsync 使用 Rsync 演算法 使得本地端和遠端二部主機之間的檔案快速達到資料同步,由於它主要是傳送 資料異動 部份,而非每次都整份資料重從到尾再傳送一次所以資料同步速度相當地快,且 Rsync 可搭配 rsh、 ssh 甚至使用 Daemon 模式來加強傳輸資料時的安全性。


當一台主機跑 Rsync Daemon 模式,即為 Rsync Server (此例即當成我們的 Backup Server),Rsync Server 會開啟一個 873 的服務通道 (Port),等待Rsync Client 連接,待 Rsync Client 連接時 Rsync Server 會檢查密碼是否正確若通過密碼查核,若通過便開始進行檔案傳輸,第一次進行資料傳輸時會把整份檔案傳輸一次,下一次就只傳送資料之間異動的部份。



文章目錄

1、前言
2、實作環境
3、安裝及設定
4、Rsync Server 設定
          步驟1.安裝 rsync
          步驟2.建立備份目錄區
          步驟3.修改 rysnc 設定檔 (rsyncd.conf)
          步驟4.建立 rsync 密碼檔 (rsyncd.secrets)
          步驟5.修改 rc.conf
          步驟6.啟動 rsync 服務
5、Rsync Client 設定
          步驟1.安裝 rsync
          步驟2.建立 rsync 密碼檔 (rsyncd.secrets)
          步驟3.測試能否順利同步資料
          步驟4.加入排程
6、利用 Rsync 進行異地備份
          步驟1.產生 SSH v2 DSA 公(私)密鑰
          步驟2.將 SSH v2 DSA 公鑰複製至遠端主機
          步驟3.測試能否順利登入遠端主機
          步驟4.加入排程
7、參考
8、Me FAQ
          Q1.無法同步且出現錯誤訊息 rsync: recv_generator: mkdir "/web" (in web) failed: Permission denied (13)?



2、實作環境

  • FreeBSD 5.x、6.x
  • rsync-2.6.x



3、安裝及設定

以下將分為 Rsync Server 設定、Rsync Client設定、利用 Rsync 進行異地備份...等三個部份說明。



4、Rsync Server 設定

步驟1.安裝 rsync

切換到 ports tree 路徑安裝 rsync 套件。
cd /usr/ports/net/rsync        //切換到安裝路徑
make install clean              //安裝並清除暫存檔案




步驟2.建立備份目錄區

由於此次我們將 Rsync Server 安裝於備份伺服器上且要備份的項目為 Web 伺服器上的 Web 資料部份,因此依個人習慣建立屆時要從 Web 伺服器同步 Web 資料回備份伺服器端的資料夾(owner 及 group 需配合之後 rsyncd.conf 設定)。
mkdir /home/backup/web        //依個人習慣建立備份目錄 



步驟3.修改 rysnc 設定檔 (rsyncd.conf)

修改 rsyncd.conf 設定檔來符合我們的工作環境。
vi /usr/local/etc/rsyncd.conf         //修改 rsync 設定檔 
修改 rsync 設定檔內容如下,若要同時有二個以上 rsync client 要同步資料(備份)到 rsync server 上則依如下 module 設定,自行增加即可,其中 uid 及 gid 以 nobody 帳號來啟動 rsync server,所以 /home/backup/web 的 owner 要設為 nobody。
###backup config###                                 //註解
 [web]                                              //module name
      comment = backup dmz web                      //說明
      path = /home/backup/web                       //存放備份資料的目錄
      auth users = weithenn                         //認證帳號
      uid = nobody                                  //以 uid nobody 啟動 rsync server
      gid = nogroup                                 //以 gid nogroup 啟動 rsync server
      secrets file = /usr/local/etc/rsyncd.secrets  //密碼檔存放路徑
      read only = no                                //是否設定為唯讀          
      dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz  //不對這些附檔名壓縮




步驟4.建立 rsync 密碼檔 (rsyncd.secrets)

建立 rsync 密碼檔 (rsyncd.secrets) 也就是屆時 Rsync Server 用來認證 Rsync Client 的帳號密碼檔案,內容如下:
vi /usr/local/etc/rsyncd.secrets          
 weithenn:123456789       //id:password (自行設定帳號、密碼)

由於此密碼檔有記錄機密資料,基於安全性原則我們將此檔案權限設定為 600。
chmod 600 /usr/local/etc/rsyncd.secrets     



步驟5.修改 rc.conf

修改 rc.conf 以利屆時若伺服器重新開機時能自動啟動 rsync 服務 (Rsync Server Service)。
vi /etc/rc.conf       //修改 rc.conf 內容
 rsyncd_enable="YES"   //增加此行




步驟6.啟動 rsync 服務

修改 rsync.sh 內容使 Rsync 啟動 IPv4 模式,因為預設為啟動 IPv6 模式。
vi /usr/local/etc/rc.d/rsyncd.sh
 command_args="--daemon"         //預設值 (run IPv6)
 command_args="-4 --daemon"      //修改後 (run IPv4)

啟動 rsync 服務。
/usr/local/etc/rc.d/rsyncd.sh start 
檢查 rsync 是否跑 tcp4 及聆聽 873 port。
sockstat |grep rsync                  
 root     rsync     97328     4     tcp4     *:873     *:*




5、Rsync Client 設定

步驟1.安裝 rsync

切換到 ports tree 路徑安裝 rsync 套件。
cd /usr/ports/net/rsync      //切換到安裝路徑
make install clean            //安裝並清除暫存檔案




步驟2.建立 rsync 密碼檔 (rsyncd.secrets)

建立 rsync 密碼檔 (rsyncd.secrets) 也就是屆時要與 Rsync Server 認證的帳號密碼檔案,內容如下 (只需密碼,不需帳號)。
vi rsyncd.secrets        
 123456789              //password (自行設定密碼,需跟剛才 Rsync Server 一致)

由於此密碼檔有記錄機密資料,基於安全性原則我們將此檔案權限設定為 600。
chmod 600 rsyncd.secrets     



步驟3.測試能否順利同步資料

執行的指令語法大致如下 (或 man rsync) 以下將執行指令分為三部份來講解。
Usage: rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

了解指令的用意後,環境說明如下:
  • Rsync Server IP Address 為 192.168.88.1。
  • Rsync Server 存放同步資料的目錄 /home/backup/web/www。
  • Rsync Client 欲同步至 Rsync Server 的目錄 /usr/local/www。
  • Rsync Server 與 Rsync Client 的傳輸驗證帳號及密碼檔案於各自的 rsyncd.secrets。
  • Rsync Server 的 rsyncd.secrets 內容需要有帳號及密碼。
  • Rsync Client 的 rsyncd.secrets 僅需要密碼即可。

於 Rsync Client 上執行下列指令來測試能否順利將 Rsync Client 端上的 Web 資料同步回 Rsync Server 上。
/usr/local/bin/rsync -avzP --delete --password-file=/home/weithenn/rsyncd.secrets /usr/local/www/ weithenn@192.168.88.1::web



步驟4.加入排程

若剛才的同步指令順利成功同步資料後,我們可自行撰寫一個名為 rsyncweb.sh 的 script 其內容為執行剛才同步的指令。
vi rsyncweb.sh      //建立同步 Web 資料的 script 內容如下
 #!/bin/sh
 /usr/local/bin/rsync -avzP --delete  --password-file=/usr/home/weithenn/rsyncd.secrets /usr/local/www/ weithenn@192.168.88.1::web

編輯排程,設定排程每天晚上 12 點執行 rsyncweb.sh 的 script 內容 (也就是每天自動同步 Web 資料回來)。
crontab -e  
 0 0 * * * /home/weithenn/rsyncweb.sh




6、利用 Rsync 進行異地備份

上述例子用於內部網路中互相同步備份是個不錯的解決方案,但若是要使用異地同步備份呢?因為直接傳送資料容易遭到有心人士的截取,因此我們使用 SSH 傳輸來達成異地同步備份且傳輸時進行加密;但使用 SSH 登入到遠端主機時會需要輸入密碼,會使自動化同步備份流程受到干擾,因此我們可使用 SSH v2 DSA 公(私)密鑰來達成 SSH 登入遠端主機而不用輸入密碼以便自動化同步備份流程能順利執行。

使用 ssh-keygen -d 指令(或 ssh-keygen -t dsa) 來建立 SSH v2 DSA 公(私)密鑰。公(私)密鑰預設皆存放於 ~/.ssh/內而請將 DSA 公共密鑰存放於所要連線遠端機器的 ~/.ssh/authorized_keys 中即可。

步驟1.產生 SSH v2 DSA 公(私)密鑰

產生 SSH v2 DSA 公(私)密鑰內容如下:
ssh-keygen -d          
 Generating public/private dsa key pair.
 Enter file in which to save the key (/home/weithenn/.ssh/id_dsa):  產生 SSH v2 DSA 公(私)密鑰路徑
 Enter passphrase (empty for no passphrase):   保護密鑰的密碼
 Enter same passphrase again:  再次輸入保護密鑰的密碼
 Your identification has been saved in /home/weithenn/.ssh/id_dsa.
 Your public key has been saved in /home/weithenn/.ssh/id_dsa.pub.
 The key fingerprint is:
 2a:98:c5:27:2b:f9:91:ee:84:bb:27:d2:2f:f0:b7:83 weithenn@bsd.test




步驟2.將 SSH v2 DSA 公鑰複製至遠端主機

將公鑰 (id_dsa.pub) 複製到遠端主機 (61.60.59.58) .ssh 目錄下:
scp id_dsa.pub 61.60.59.58:/home/weithenn/.ssh/authorized_keys
 Password:                                       //因為加解密機制還未完成,所以登入遠端主機需要輸入密碼
 id_dsa.pub 100% |******************| 617 00:00  //複製本地端公鑰至遠端




步驟3.測試能否順利登入遠端主機

成功複製本地端公鑰至遠端主機 (61.60.59.58) 之後,我們可再次使用 SSH 登入遠端主機看是否仍需要輸入密碼,若成功的話應該不需要輸入密碼便可直接登入遠端主機。沒完成 SSH v2 DSA 公(私)密鑰機制前,利用 SSH 登入遠端主機 (61.60.59.58) 需要輸入密碼才能進入遠端主機。
ssh 61.60.59.58    //ssh 登入遠端主機
 Password:           //需輸入密碼

完成 SSH v2 DSA 公(私)密鑰機制後,利用 SSH 登入遠端主機 (61.60.59.58) 不需要輸入密碼即可進入遠端主機。
ssh 61.60.59.58    //ssh 登入遠端主機



步驟4.加入排程

若剛才的 SSH 能順利登入遠端主機且不需輸入密碼後,代表我們自動同步備份機制不會受阻後,先了解一下環境。
Rsync Server IP Address (遠端主機) 為 61.60.59.58
Rsync Server (遠端主機) 存放同步資料的目錄 /home/backup/web/www
Rsync Client 欲同步至 Rsync Server 的目錄 /usr/local/www

我們可自行撰寫一個名為 rsyncweb.sh 的 script 其內容如下於 Rsync Client 上執行下列指令來測試能否順利將 Rsync Client 端上的 Web 資料同步回 Rsync Server 上,前提當然是二端已經設定好 Rsync Server 及 Rsync Client 的相關設定。
vi rsyncweb.sh     //建立同步 Web 資料的 script 內容如下
 #!/bin/sh
 /usr/local/bin/rsync -avzP --delete -e ssh /usr/local/www 61.60.59.58:/home/backup/web/www

編輯排程,設定排程每天晚上 12 點執行 rsyncweb.sh 的 script 內容 (也就是每天自動同步 Web 資料回來)。
crontab -e  
 0 0 * * * /home/weithenn/rsyncweb.sh




7、參考




8、Me FAQ

Q1.無法同步且出現錯誤訊息 rsync: recv_generator: mkdir "/web" (in web) failed: Permission denied (13)?

Error Message:
無法進行資料同步且出現如下錯誤訊息?
 building file list ...
 40 files to consider
 web/
 rsync: recv_generator: mkdir "/web" (in web) failed: Permission denied (13)
 *** Skipping everything below this failed directory ***
 sent 893 bytes  received 22 bytes  1830.00 bytes/sec
 total size is 521456904  speedup is 569898.26
 rsync error: some files could not be transferred (code 23) at main.c(977) [sender=2.6.9]


Ans:
原因在於我設定要同步的目錄 (/home/backup/web) 權限忘了設定,因為以 uid nobody 及 gid nogroup 啟動 rsync server,所以 /home/backup/web 的 owner 要設為 nobody。
 uid = nobody
 gid = nogroup