+++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++
1 什麼是rsync;
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 的確是一個不可不用傳輸工具。公司有一臺文件服務器,配置是CPUIntel Celeon 333Mhz,內存128M,硬盤IDE80Gx3=240G,裏面僅是第一個硬盤的12G的分區安裝系統,用了256M做爲交換分區,其它的空間我都用來存數據,通過LVM捲來管理磁盤空間,我分了一個180G的空間給數據存放,當時數據存儲容量已經達到了160多G。當時的情況是服務器空間有限,沒做本地備份。更不可能新增硬盤上去,因爲這臺機器沒做RAID,硬盤壞掉一個,數據會全毀掉,安全性沒有一點保障。在這種情況下,爲了保證數據的安全性,我被迫做了一臺帶有Raid5支持的文件服務器。在選擇如何把數據文件完整的傳輸到新服務器上,我想到了很多的工具,最後想到了rsync。我花了十分鐘架設並調試了rsync,然後就開工文件傳輸,因爲文件服務器上的文件太多,老的文件服務器配置又低,大約花了兩三天吧才得以把所有文件傳輸完畢。
3 架設rsync服務器過程;
3.1 rsync的安裝;
[root@linuxsir:beinan]$ sudo apt-get install rsync 注:在debian、ubuntu 等在線安裝方法;
[root@linuxsir:beinan]# slackpkg install rsync 注:Slackware 軟件包在線安裝;
[root@linuxsir:beinan]# yum installrsync 注:Fedora、Redhat 等系統安裝方法;
其它Linux發行版,請用相應的軟件包管理方法來安裝;如果是源碼包,也就是用下面的辦法;
[root@linuxsir:/home/beinan]# tarxvf sync-xxxx.tar.gz 或sync-xxx.tar.bz2
[root@linuxsir:/home/beinan]# cd sync-xxx
[root@linuxsir:/home/beinan/sync-xxx]# ./configure--prefix=/usr ;make ;make install 注:在用源碼包編譯安裝之前,您得安裝gcc等編譯開具才行;
3.2 rsync服務器的配置文件rsyncd.conf ;
[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 Licensev2
# 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 nly = 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, persync
#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 全局定義;
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 nly = yes
注:read only 是隻讀選擇,也就是說,不讓客戶端上傳文件到服務器上。還有一個 writeonly選項,自己嘗試是做什麼用的吧;
#limit access to private LANs
hosts allow=192.168.1.0/255.255.255.010.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 模塊定義;
下面前面配置文件模塊的例子:
[linuxsirhome]
注:模塊,它爲我們提供了一個鏈接的名字,鏈接到哪呢,在本模塊中,鏈接到了/home目錄;要用[name] 形式;
path = /home 注:指定文件目錄所在位置,這是必須指定的;
auth users = linuxsir 注:認證用戶是linuxsir ,是必須在服務器上存在的用戶;
list=yes 注:list 意思是把rsync服務器上提供同步數據的目錄在服務器上模塊是否顯示列出來。默認是yes 。如果你不想列出來,就no;如果是no是比較安全的,至少別人不知道你的服務器上提供了哪些目錄。你自己知道就行了;
ignore errors 注:忽略IO錯誤,詳細的請查文檔;
secrets file = /etc/rsyncd/rsyncd.secrets 注:密碼存在哪個文件;
comment = linuxsir home data 注:註釋可以自己定義,寫什麼都行,寫點相關的內容就行;
exclude = beinan/ samba/
注:exclude 是排除的意思,也就是說,要把/home目錄下的beinan和samba 排除在外;beinan/和samba/目錄之間有空格分開 ;
[beinan]
path = /opt 注:指定文件目錄所在位置;
list=no
comment = optdir
auth users = beinan 注:是必段在服務器上存在的用戶;
secrets file = /etc/rsyncd/rsyncd.secrets
ignore errors
5 啓動rsync 服務器及防火牆的設置;
5.1 啓動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服務器和防火牆;
[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 [email protected]::
+++++++++++++++++++++++++++++++++
+++ 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 [email protected]::linuxsirhome
試試這個?
6.2 rsync 客戶端同步數據;
[beinan@beinnaIBM:~]$ rsync [email protected]::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 [email protected]::linuxsirhome linuxsirhome
這回我們引入一個 --delete 選項,表示客戶端上的數據要與服務器端完全一致,如果linuxsirhome目錄中有服務器上不存在的文件,則刪除。最終目的是讓linuxsirhome目錄上的數據完全與服務器上保持一致;用的時候要小心點,最好不要把已經有重要數所據的目錄,當做本地更新目錄,否則會把你的數據全部刪除;
[beinan@beinnaIBM:~]$ rsync -avzP --delete --password-file=rsync.password [email protected]::linuxsirhome linuxsirhome
這次我們加了一個選項 --password-file=rsync.password,這是當我們以linuxsir用戶登錄rsync服務器同步數據時,密碼將讀取 rsync.password這個文件。這個文件內容只是linuxsir用戶的密碼。我們要如下做;
[beinan@beinnaIBM:~]$ touchrsync.password
[beinan@beinnaIBM:~]$ chmod 600 rsync.passwod
[beinan@beinnaIBM:~]$ echo "222222">rsync.password
[beinan@beinnaIBM:~]$ rsync -avzP --delete --password-file=rsync.password [email protected]::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 [email protected]::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 [email protected]::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 everyday 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:~]# killallcrond 注:殺死crond 服務器的進程;
[beinan@beinnaIBM:~]# ps aux |grep crond 注:查看一下是否被殺死;
[beinan@beinnaIBM:~]#/usr/sbin/crond 注:啓動 crond 服務器;
[beinan@beinnaIBM:~]# ps aux |grepcrond 注:查看一下是否啓動了?
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
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-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中得到密碼
--bwlimit=KBPS 限制I/O帶寬,KBytes per second
-h, --help 顯示幫助信息