站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

Rsync-資料同步及異地備份

前言

[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 會檢查密碼是否正確若通過密碼查核,若通過便開始進行檔案傳輸,第一次進行資料傳輸時會把整份檔案傳輸一次,下一次就只傳送資料之間異動的部份。

實作環境

安裝及設定

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

Rsync Server 設定

步驟1.安裝 rsync

切換到 ports tree 路徑安裝 rsync 套件

 #cd /usr/ports/net/rsync               //切換到安裝路徑
 #make install clean                    //安裝並清除安裝過程中不必要的檔案

步驟2.建立備份目錄區

由於此次我們將 Rsync Server 安裝於備份伺服器上且要備份的項目為 Web 伺服器上的 Web 資料部份,因此依個人習慣建立屆時要從 Web 伺服器同步 Web 資料回備份伺服器端的資料夾。

 #mkdir /home/backup/web                //依個人習慣建立備份目錄 (owner 及 group 需配合之後 rsyncd.conf 設定)

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

修改 rsyncd.conf 設定檔來符合我們的工作環境

 #vi /usr/local/etc/rsyncd.conf         //修改 rsync 設定檔 

修改 rsync 設定檔內容如下 (若要同時有二個以上 rsync client 要同步資料(備份)到 rsync server 上則依如下 module 設定,自行增加即可)

 ###backup config###                    //註解
 [web]                                  //module name
           comment = backup dmz web     //說明
           path = /home/backup/web      //存放備份資料的目錄
           auth users = weithenn        //認證帳號 (也就是之後要設定於 rsyncd.secrets 內的帳號)
           uid = nobody                 //以 uid nobody 來啟動 rsync server (所以 /home/backup/web 的 owner 要設為 nobody)      
           gid = nogroup                //以 gid nogroup 來啟動 rsync server (所以 /home/backup/web 的 group 要設為 nogroup)      
           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     *:*

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 [OPTION]
-a, --archive archive mode, equivalent to -rlptgoD檔案模式
-v, --verbose increase verbosity觀看過程
-z, --compress compress file data壓縮資料
-P equivalent to --partial --progress顯示同步檔案的進度 %
--delete delete files that don't exist on the sending side當來源端刪除 A 文件則目的地端也會將 A 文件刪除保持二台機器資料的一致性
--password-file=FILE get password from FILE指定 rsyncd.secrets 的路徑
SRC [SRC]
/usr/local/www/將本機目錄 /usr/local/www 備份到 Rsync Server 的備份目錄 /home/backup/web/www 上
[USER@]HOST:DEST
weithenn@192.168.88.1::web以 weithenn 身份登入到 Rsync Server(192.168.88.1) 上後讀取 web module 設定

了解指令的用意後,環境說明如下

於 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

利用 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): 輸入保護 SSH v2 DSA 公(私)密鑰的密碼 (依個人喜好,可不用設定)
 Enter same passphrase again: 再次輸入保護 SSH v2 DSA 公(私)密鑰的密碼 (依個人喜好,可不用設定)
 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 能順利登入遠端主機且不需輸入密碼後,代表我們自動同步備份機制不會受阻後,先了解一下環境

我們可自行撰寫一個名為 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

參考

[網路管理技術文件]

[rsync官網]

[自由軟體應用諮詢中心]

[ FreeBSD 使用手冊-Chapter 10.10 Openssh]

Me FAQ

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

Error Meaage:

無法進行資料同步且出現如下錯誤訊息

 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                 //以 uid nobody 來啟動 rsync server (所以 /home/backup/web 的 owner 要設為 nobody)      
 gid = nogroup                //以 gid nogroup 來啟動 rsync server (所以 /home/backup/web 的 group 要設為 nogroup)
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com