摘要: rsync 是一個快速增量檔案傳輸工具,它可以用於在同一主機備份內部的備分,我們還可以把它作為不同主機網路備份工具之用。本文主要講述的是如何自架rsync伺服器,以實現檔案傳輸、備份和鏡像。相對tar和wget來說,rsync 也有其自身的優點,比如速度快、安全、高效;
-
-
3.1 rsync的安裝;
3.2 rsync伺服器的設定檔
5.1 啟動rsync伺服器;
5.2 rsync伺服器和防火牆;
6.1 列出rsync 伺服器上的所提供的同步內容;
6.2 rsync 用戶端同步資料;
6.3 讓rsync 用戶端自動與伺服器同步資料;
1. 什麼是rsync;
2、rsync 伺服器的理由和用途;
3、架設rsync伺服器過程;
4 架設rsync伺服器的樣本說明
5 啟動rsync 伺服器及防火牆的設定;
6 通過rsync用戶端來同步資料;
7 問題處理;
8 未盡事宜;
9 關於本文;
10 更新日誌;
11 參考文檔;
12 相關文檔;
目錄
+++++++++++++++++++++++++++++++++++
本文
+++++++++++++++++++++++++++++++++++
1 什麼是rsync;
rsync is a file transfer program for Unix systems. rsync uses the "rsync algorithm" which provides a very fast method for bringing remote files into sync. It does this by sending just the differences in the files across the link, without requiring that both sets of files are present at one of the ends of the link beforehand.
rsync 是一個Unix系統下的檔案同步和傳輸工具。rsync是用 “rsync 演算法”提供了一個客戶機和遠程檔案伺服器的檔案同步的快速方法。
Some features of rsync include
rsync 包括如下的一些特性:
* can update whole directory trees and filesystems
能更新整個目錄和樹和檔案系統;
* optionally preserves symbolic links, hard links, file ownership, permissions, devices and times
有選擇性的保持符號鏈鏈、永久連結、檔案屬於、許可權、裝置以及時間等;
* requires no special privileges to install
對於安裝來說,無任何特殊許可權要求;
* internal pipelining reduces latency for multiple files
對於多個檔案來說,內部流水線減少檔案等待的延時;
* can use rsh, ssh or direct sockets as the transport
能用rsh、ssh 或直接連接埠做為傳輸入連接埠;
* supports anonymous rsync which is ideal for mirroring
支援匿名rsync 同步檔案,是理想的鏡像工具;
2 rsync 伺服器的理由;
rsync 伺服器架設比較簡單,可能我們安裝好rsync後,並沒有發現設定檔,以及rsync伺服器啟動程式,因為每個管理員可能對rsync 用途不一樣,所以一般的發行版只是安裝好軟體就完事了,讓管理員來根據自己的用途和方向來自己架設rsync伺服器;因為這個rsync應用比較廣,能在同一台主機進行備份工作,還能在不同主機之間進行工作。在不同主機之間的進行備份,是必須架設rsync 伺服器的。
以我的觀點上看,如果在同一台主機進行檔案的備分,用複製工具cp就好了。沒必要用rsync 這麼相對複雜的工具,cp也簡單易用,當然這僅僅是個人觀點;
對於重量級伺服器來說,應該有網路備份伺服器來說,只有本地備份還是不夠的,最好還是有網路備份主機,這樣資料的安全才有保證。畢竟資料放在伺服器本地上還是不太安全,比如磁碟壞掉、被駭客攻入伺服器刪除資料。其實伺服器本身價值並不大,重要的是資料的價值。
另外對於大量檔案從一台伺服器上遷移到另一台伺服器上,rsync 的確是一個不可不用傳輸工具。公司有一台檔案伺服器,配置是CPU Intel Celeon 333Mhz,記憶體128M,硬碟IDE 80Gx3=240G,裡面僅是第一個硬碟的12G的分區安裝系統,用了256M做為交換分區,其它的空間我都用來存資料,通過LVM捲來管理磁碟空間,我分了一個 180G的空間給資料存放,當時資料存放區容量已經達到了160多G。當時的情況是伺服器空間有限,沒做本地備份。更不可能新增硬碟上去,因為這台機器沒做RAID,硬碟壞掉一個,資料會全毀掉,安全性沒有一點保障。在這種情況下,為了保證資料的安全性,我被迫做了一台帶有Raid5支援的檔案伺服器。在選擇如何把資料檔案完整的傳輸到新伺服器上,我想到了很多的工具,最後想到了rsync 。我花了十分鐘架設並調試了rsync ,然後就開工檔案傳輸,因為檔案伺服器上的檔案太多,老的檔案伺服器配置又低,大約花了兩三天吧才得以把所有檔案傳輸完畢。
3 架設rsync伺服器過程;
架設rsync 伺服器比較簡單,寫一個設定檔rsyncd.conf 。檔案的書寫也是有規則的,我們可以參照rsync.samba.org 上的文檔來做;當然我們首先要安裝好rsync 這個軟體才行;
3.1 rsync的安裝;
3.2 rsync伺服器的設定檔rsyncd.conf ;
我們可以參照 rsyncd.conf.html。具體步驟如下;
[root@linuxsir:~]#mkdir /etc/rsyncd 註:在/etc目錄下建立一個rsyncd的目錄,我們用來存放rsyncd.conf 和rsyncd.secrets檔案;
[root@linuxsir:~]#touch /etc/rsyncd/rsyncd.conf 註:建立rsyncd.conf ,這是rsync伺服器的設定檔;
[root@linuxsir:~]#touch /etc/rsyncd/rsyncd.secrets 註:建立rsyncd.secrets ,這是使用者密碼檔案;
[root@linuxsir:~]#chmod 600 /etc/rsyncd/rsyncd.secrets 註:為了密碼的安全性,我們把許可權設為600;
[root@linuxsir:~]#ls -lh /etc/rsyncd/rsyncd.secrets
-rw------- 1 root root 14 2007-07-15 10:21 /etc/rsyncd/rsyncd.secrets
[root@linuxsir:~]#touch /etc/rsyncd/rsyncd.motd
下一就是我們修改 rsyncd.conf 和rsyncd.secrets 和rsyncd.motd 檔案的時候了;
rsyncd.conf 是rsync伺服器主要設定檔,我們來個簡單的樣本;比如我們要備份伺服器上的 /home 和/opt ,在/home中,我想把beinan和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/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
[linuxsirhome]
path = /home
list=yes
ignore errors
auth users = linuxsir
secrets file = /etc/rsyncd/rsyncd.secrets
comment = linuxsir home
exclude = beinan/ samba/
[beinan]
path = /opt
list=no
ignore errors
comment = optdir
auth users = beinan
secrets file = /etc/rsyncd/rsyncd.secrets
註: 關於 auth users 是必須在伺服器上存在的真實的系統使用者,如果你想用多個使用者,那就以,號隔開;比如 auth users = beinan , linuxsir
密碼檔案:/etc/rsyncd/rsyncd.secrets的內容格式;
使用者名稱:密碼
而我們在例子中rsyncd.secrets的內容如下類似的;在文檔中說,有些系統不支援長密碼,自己嘗試著設定一下吧。另外 rsyncd.secrets檔案許可權對其它使用者組是不可讀的。如果你設定錯了,可能rsync不工作。
linuxsir:222222
beinan:333333
註: 這裡的密碼值得注意,為了安全,你不能把系統使用者的密碼寫在這裡。比如你的系統使用者 linuxsir 密碼是 abcdefg ,為了安全,你可以讓rsync 中的linuxsir 為 222222 。這和samba的使用者認證的密碼原理是差不多的;
rsyncd.motd 檔案;
它是定義rysnc 伺服器資訊的,也就是使用者登入資訊。比如讓使用者知道這個伺服器是誰提供的等;類似ftp伺服器登入時,我們所看到的 linuxsir.org ftp ……。 當然這在全域定義變數時,並不是必須的,你可以用#號注掉,或刪除;我在這裡寫了一個 rsyncd.motd的內容為:
+++++++++++++++++++++++++++
+ linuxsir.org rsync 2002-2007 +
+++++++++++++++++++++++++++
4 架設rsync伺服器的樣本說明;
4.1 全域定義;
在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 檔案內容。當使用者登入時會看到這個資訊。比如我寫的是:
+++++++++++++++++++++++++++
+ linuxsir.org rsync 2002-2007 +
+++++++++++++++++++++++++++
log file = /var/log/rsync.log
註:rsync 伺服器的日誌;
transfer logging = yes
註:這是傳輸檔案的日誌;
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
4.2 模組定義;
5 啟動rsync 伺服器及防火牆的設定;
5.1 啟動rsync伺服器;
啟動rsync 伺服器相當簡單,--daemon 是讓rsync 以伺服器模式運行;
[root@linuxsir:~]#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
註: 如果你找不到rsync 命令,你應該知道rsync 是安裝在哪了。比如rsync 可執行命令可能安裝在了 /usr/local/bin目錄;也就是如下的命令;
[root@linuxsir:~]#/usr/local/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
當然您也可以寫一個指令碼來開機自動啟動rysnc 伺服器,你自己查查文檔試試,這個簡單。因為我用slackware 也有一個類似的指令碼。我感覺不如直接手工運行方面,或者把這個命令寫入rc.local檔案中,這樣也一樣能自動運行;
5.2 rsync伺服器和防火牆;
Linux 防火牆是用iptables,所以我們至少在伺服器端要讓你所定義的rsync 伺服器連接埠通過,用戶端上也應該讓通過。
[root@linuxsir:~]#iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 873 -j ACCEPT
[root@linuxsir:~]#iptables -L 查看一下防火牆是不是開啟了 873連接埠;
6 通過rsync用戶端來同步資料;
6.1 列出rsync 伺服器上的所提供的同步內容;
首先:我們看看rsync伺服器上提供了哪些可用的資料來源;
[beinan@beinnaIBM:~]$ rsync --list-only linuxsir@linuxsir.org::+++++++++++++++++++++++++++++++++
+++ linuxsir.org rsync server ++
+++++++++++++++++++++++++++++++++
linuxsirhome linuxsir home data
註: 前面是rsync 所提供的資料來源,也就是我們在rsyncd.conf 中所寫的[linuxsirhome]模組。而“linuxsir home data”是由[linuxsirhome]模組中的 comment = linuxsir home data 提供的;為什麼沒有把beinan 資料來源列出來呢?因為我們在[beinan]中已經把list=no了。
[beinan@beinnaIBM:~]$ rsync --list-only linuxsir@linuxsir.org::linuxsirhome
試試這個?
6.2 rsync 用戶端同步資料;
[beinan@beinnaIBM:~]$ rsync -avzP linuxsir@linuxsir.org::linuxsirhome linuxsirhome
Password: 這裡要輸入linuxsir的密碼,是伺服器端提供的,在前面的例子中,我們用的是 222222,輸入的密碼並不顯示出來;輸好後就斷行符號;
註: 這個命令的意思就是說,用linuxsir 使用者登入到伺服器上,把linuxsirhome資料,同步到本地目錄linuxsirhome上。當然本地的目錄是可以你自己定義的,比如 linuxsir也是可以的;當你在用戶端上,當前操作的目錄下沒有linuxsirhome這個目錄時,系統會自動為你建立一個;當存在linuxsirhome這個目錄中,你要注意它的寫入權限。
說明:
-a 參數,相當於-rlptgoD,-r 是遞迴 -l 是連結檔案,意思是拷貝連結檔案;-p 表示保持檔案原有許可權;-t 保持檔案原有時間;-g 保持檔案原有使用者組;-o 保持檔案原有屬主;-D 相當於塊裝置檔案;
-z 傳輸時壓縮;
-P 傳輸進度;
-v 傳輸時的進度等資訊,和-P有點關係,自己試試。可以看文檔;
[beinan@beinnaIBM:~]$ rsync -avzP --delete linuxsir@linuxsir.org::linuxsirhome linuxsirhome
這回我們引入一個 --delete 選項,表示用戶端上的資料要與伺服器端完全一致,如果 linuxsirhome目錄中有伺服器上不存在的檔案,則刪除。最終目的是讓linuxsirhome目錄上的資料完全與伺服器上保持一致;用的時候要小心點,最好不要把已經有重要數所據的目錄,當做本地更新目錄,否則會把你的資料全部刪除;
[beinan@beinnaIBM:~]$ rsync -avzP --delete --password-file=rsync.password linuxsir@linuxsir.org::linuxsirhome linuxsirhome
這次我們加了一個選項 --password-file=rsync.password ,這是當我們以linuxsir使用者登入rsync伺服器同步資料時,密碼將讀取 rsync.password 這個檔案。這個檔案內容只是linuxsir使用者的密碼。我們要如下做;
[beinan@beinnaIBM:~]$ touch rsync.password
[beinan@beinnaIBM:~]$ chmod 600 rsync.passwod
[beinan@beinnaIBM:~]$ echo "222222"> rsync.password
[beinan@beinnaIBM:~]$ rsync -avzP --delete --password-file=rsync.password linuxsir@linuxsir.org::linuxsirhome linuxsirhome
註: 這樣就不要求輸入密碼了;其實這是比較重要的,因為伺服器通過crond 計劃任務還是有必要的;
6.3 讓rsync 用戶端自動與伺服器同步資料;
伺服器是重量級應用,所以資料的網路備份還是極為重要的。我們可以在生產型伺服器上配置好rsync 伺服器。我們可以把一台裝有rysnc機器當做是備份伺服器。讓這台備份伺服器,每天在早上4點開始同步伺服器上的資料;並且每個備份都是完整備份。有時硬碟壞掉,或者伺服器資料被刪除,完整備份還是相當重要的。這種備份相當於每天為伺服器的資料做一個鏡像,當生產型伺服器發生事故時,我們可以輕鬆恢複資料,能把資料損失降到最低;是不是這麼回事??
第一步:建立同步指令碼和密碼檔案
[beinan@beinnaIBM:~] mkdir /etc/cron.daily.rsync
[beinan@beinnaIBM:~] cd /etc/cron.daily.rsync
[beinan@beinnaIBM:~] touch linuxsir.sh beinan.sh
[beinan@beinnaIBM:~] chmod 755 /etc/cron.daily.rsync/*.sh
[beinan@beinnaIBM:~] mkdir /etc/rsyncd/
[beinan@beinnaIBM:~] touch /etc/rsyncd/rsynclinuxsir.password
[beinan@beinnaIBM:~] touch /etc/rsyncd/rsyncbeinan.password
[beinan@beinnaIBM:~] chmod 600 /etc/rsyncd/rsyncbeinan.*
註: 我們在 /etc/cron.daily/ 中建立了兩個檔案beinan.sh和linuxsir.sh ,並且是許可權是 755的。建立了兩個密碼檔案,linuxsir使用者用的是 rsynclinuxsir.password ,而beinan使用者用的是 rsyncbeinan.password ,許可權是600;
我們編輯linuxsir.sh,內容是如下的:
#!/bin/sh
#linuxsir.org home backup
/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsynclinuxsir.password linuxsir@192.168.1.171::linuxsirhome /home/linuxsirhome/$(date +'%m-%d-%y')
我們編輯 beinan.sh ,內容是:
#!/bin/sh
#linuxsir.org beinan home backup
/usr/bin/rsync -avzP --password-file=/etc/rsyncd/rsyncbeinan.password linuxsir@192.168.1.171::beinan /home/beinanhome/$(date +'%m-%d-%y')
註:你可以把linuxsir.sh 和beinan.sh 的內容合并到一個檔案中,比如都寫到 linuxsir.sh 中;
接著我們修改 /etc/rsyncd/rsynclinuxsir.password 和 rsyncbeinan.password的內容;
[beinan@beinnaIBM:~] echo "222222" > /etc/rsyncd/rsynclinuxsir.password
[beinan@beinnaIBM:~] echo "333333"> /etc/rsyncd/rsyncbeinan.password
然後我們再/home目錄下建立linuxsirhome 和beinanhome兩個目錄,意思是伺服器端的linuxsirhome資料同步到備份伺服器上的/home/linuxsirhome下,beinan資料同步到 /home/beinanhome/目錄下。並按年月日歸檔建立目錄;每天備份都存檔;
[beinan@beinnaIBM:~] mkdir /home/linuxsirhome
[beinan@beinnaIBM:~] mkdir /home/beinanhome
第二步:修改crond伺服器的設定檔
[beinan@beinnaIBM:~] crontab -e
加入下面的內容:
# Run daily cron jobs at 4:10 every day backup linuxsir data:
10 4 * * * /usr/bin/run-parts /etc/cron.daily.rsync 1> /dev/null
註:
第一行是注釋,是說明內容,這樣能自己記住。
第二行表示在每天早上4點10分的時候,運行 /etc/cron.daily.rsync 下的可執行指令碼任務;
第三步:重啟crond伺服器;
配置好後,要重啟crond 伺服器;
[beinan@beinnaIBM:~]# killall crond 註:殺死crond 伺服器的進程;
[beinan@beinnaIBM:~]# ps aux |grep crond 註:查看一下是否被殺死;
[beinan@beinnaIBM:~]# /usr/sbin/crond 註:啟動 crond 伺服器;
[beinan@beinnaIBM:~]# 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
7 問題處理;
當同步出現錯誤時,可能是你的密碼檔案許可權的問題,或者格式不對,也可能是你複製、粘貼造成的。
另外許可權的問題也應該關注一下,這是最容易出問題的地方;如果您對許可權不太瞭解,應該在LinuxSir.Org 上尋找使用者和使用者組,以及許可權方面的知識;
8 未盡事宜;
9 關於本文;
本文是為瞭解決公司內部檔案上伺服器資料移轉到新的伺服器應用時而寫的,並不是特地為寫rysnc 而寫rsync 。我用不到的東西,或者我不會的東西,我想寫也寫不出來;其實我什麼不會,只是想應用時,才臨時抱佛腳,解決好問題後就忘掉。等用到的時候再查我寫過的東西……
本文適合對象,面向所有初學者, 最好是一點Linux也不懂的。如果您是進階應用程式者,http://rsync.samba.org 完全能滿足我們的需要;
“北南不息,寫DOC不止;”,只是沒有太多的時間罷了……
10 更新日誌;
2007/07/17 v0.1b 全文完成,進入抓蟲階段;
11 參考文檔;
rsyncd.conf
http://rsync.samba.org
《HOWTO_Local_Rsync_Mirror》
《Linux 檔案和目錄的屬性》