rsync 服務器架設方法

rsync 服務器架設方法

作者: 北南南北
來自:Linuxsir.Org
摘要: rsync 是一個快速增量文件傳輸工具,它可以用於在同一主機備份內部的備分,我們還可以把它作爲不同主機網絡備份工具之用。本文主要講述的是如何自架rsync服 務器,以實現文件傳輸、備份和鏡像。相對tar和wget來說,rsync 也有其自身的優點,比如速度快、安全、高效;


目錄 1. 什麼是rsync;
2、rsync 服務器的理由和用途;
3、架設rsync服務器過程; 3.1 rsync的安裝;
3.2 rsync服務器的配置文件

4 架設rsync服務器的示例說明

4.1 全局定義
4.2 模塊定義

5 啓動rsync 服務器及防火牆的設置;

5.1 啓動rsync服務器;
5.2 rsync服務器和防火牆;

6 通過rsync客戶端來同步數據;

6.1 列出rsync 服務器上的所提供的同步內容;
6.2 rsync 客戶端同步數據;
6.3 讓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的安裝;

  • 軟件安裝過於簡單,現在Linux各大發行版都提供這個軟件包,當然您也可以自己編譯安裝,在目前的情況下,我看沒太大的必要;
[root@linuxsir:beinan]$ sudo apt-get install rsync 注:在debian、ubuntu 等在線安裝方法;
[root@linuxsir:beinan]# slackpkg install rsync 注:Slackware 軟件包在線安裝;
[root@linuxsir:beinan]# yum install rsync 注:Fedora、Redhat 等系統安裝方法;

其它Linux發行版,請用相應的軟件包管理方法來安裝;如果是源碼包,也就是用下面的辦法;

[root@linuxsir:/home/beinan]# tar xvf 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 ;

  • 我們可以參照
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 模塊定義;

  • 模塊定義什麼呢?主要是定義服務器哪個目錄要被同步。每個模塊都要以[name]形式。這個名字就是在rsync 客戶端看到的名字,其實有點象Samba服務器提供的共享名。而服務器真正同步的數據是通過 path 來指定的。我們可以根據自己的需要,來指定多個模塊。每個模塊要指定認證用戶,密碼文件、但排除並不是必須的;

下面前面配置文件模塊的例子:

[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服務器;

  • 啓動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 [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 -avzP [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 --delete [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:~]$ touch rsync.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 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 未盡事宜;

  • 本文並不是大而全的rsync 說明文檔,僅僅是把網絡同步文件的內容說一說,也不一定能完全能說的清楚;對於任何一個工具來說,都足可以寫一本書,所以本文也不可能完全全面的介紹 rsync 。如果您想了解更多,請參考官方文檔或者man ,我也一樣查看這些內容來應用rsync 。

如果我們用普通用戶用rsync 進行與服務器同步數據時,同步下來的數據,可能屬主會改變。爲了保持文件的屬主和用戶組與服務器端完全一致,用root來運行rsync 就可以了……


9 關於本文;

  • 本文是爲了解決公司內部文件上服務器數據遷移到新的服務器應用時而寫的,並不是特地爲寫rysnc 而寫rsync 。我用不到的東西,或者我不會的東西,我想寫也寫不出來;其實我什麼不會,只是想應用時,才臨時抱佛腳,解決好問題後就忘掉。等用到的時候再查我寫過的東 西…… :(

本文適合對象,面向所有初學者, 最好是一點Linux也不懂的。如果您是高級應用者,http://rsync.samba.org 完全能滿足我們的需要;

“北南不息,寫DOC不止;”,只是沒有太多的時間罷了……

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章