文、小州老師(點擊認識小州老師)

前言:在前幾期電子報中有一篇是談過如何使用 rsync 命令搭配 ssh 服務來同步資料,這種方式是目前很常見與單純的使用方式,我常用該方式再配合 ssh public key 登入快速達成免密碼的傳輸環境。那這期簡單來談談傳統架設 rsync server 提供使用的方式吧。

 使用環境與軟體安裝:

這邊使用的環境是 CentOS 5,不過基本上應該與 Fedora Linux 差不多一樣,所以可以直接套用使用。首先使用 rpm 指令確認是否有安裝:

rpm -qa | grep rsync

若是沒有安裝的話,直接使用 rpm 或者是 yum 安裝即可。由於 yum 比較單純好用,如下命令即可安裝:

yum install rsync

不過若是 yum 沒有配置好,或者是有其他問題等,那就使用傳統 rpm 指令方式來安裝也可以,比方像是:

rpm -ihv rsync-xxxxxx.i386.rpm

 

當然,要先找到自己系統版本的 rsync 套件包就可以這樣進行。

安裝好後,我先使用 rpm -ql rsync 看一下套件清單組成:

[root@mydomain ~]# rpm -ql rsync | cat -n | head -n 20

1 /etc/xinetd.d/rsync

2 /usr/bin/rsync

3 /usr/share/doc/rsync-3.0.7

4 /usr/share/doc/rsync-3.0.7/COPYING

5 /usr/share/doc/rsync-3.0.7/INSTALL

6 /usr/share/doc/rsync-3.0.7/NEWS

7 /usr/share/doc/rsync-3.0.7/OLDNEWS

8 /usr/share/doc/rsync-3.0.7/README

9 /usr/share/doc/rsync-3.0.7/TODO

10 /usr/share/doc/rsync-3.0.7/csprotocol.txt

其中可以看出來該套件包有安裝後,就有 rsync 該命令可以使用。其中看到 xinetd.d 目錄內有設定檔案,所以可以了解該 rsync 服務可以配置透過

xinetd 服務程式啟動,所以繼續看一下 /etc/xinetd.d/rsync 檔案內容:

# default: off

# description: The rsync server is a good addition to an ftp server, as it # allows crc checksumming etc.

service rsync

{

socket_type = stream

wait = no

user = root

server = /usr/bin/rsync

server_args = --daemon

log_on_failure += USERID

disable = yes

}

 所以可以看出來 rsync 該命令可以是 client 端工具,也提供 server 端當 daemon 服務程式環境這樣使用。設定檔案內是寫 disable = yes 表示

預設沒有啟動,所以修改該檔案把 disable = yes 改成 disable = no ,重新啟動 xinetd 服務即可。或者是簡單使用 chkconfig 來管理也可以:

 

chkconfig rsync on

 chkconfig 對於 xinetd 的子服務可以提供 disable 欄位修改功能,所以上述指令令同等 disable = no 的放入修改,並且會自動讓 xinetd 的

rsync 服務立即可用。

 rsync 服務可用後,預設是使用系統的 port tcp/873 來提供連線存取,所以記得適當開啟 firewall 設定讓連線可以被存取。若是使用系統內建 firewall 設定,

可以執行 setup 後到 Firewall 項目內開放該 port,而一般 iptables 命令應對使用大致上就是如下方式:

 Iptables -A INPUT -p tcp --dport 873 -j ACCEPT

 

 設定檔案配置:

 上面已經把 rsync 服務啟用了,但是由於還沒有指定建立必要設定檔案提供資料分享存取,所以該服務還無法正常使用,所以需要建立一份 /etc/rsyncd.conf

檔案才可以使用。首先來寫一份簡單的分享區段。

[kendlee]

path = /home/users/kendlee

uid = kendlee

gid = kendlee

 其中 path 是指定分享目錄,這邊我用自己家目錄。 uid 與 gid 參數可以指定讀寫時候的權限,這邊指定與我的身分權限才有完整存取權,要不然 rsync 通常

會使用 nobody 該身份,那可能會有權限不足的問題。改好後先到另外一台主機測試看看:

 

Linux:kendlee@~/tmp/test> rsync server1.mydomain.com::

kendlee

其中看分享的清單名稱,就是在使用 rsync 命令後面傳入對方主機名稱或是 IP,然後再多兩個冒號符號即可。

在畫面內可以看出有分享出 kendlee 區段了,後續其他分享區段也是使用相同語法就可以繼續新增下去。

 

實際下載傳輸測試:

 來測試資料傳輸是否可以下載與上傳,首先於 server 端 kendlee 家目錄建立 data 目錄,並產生幾個檔案,結果如下:

[kendlee@mydomain data]$ pwd

/home/users/kendlee/data

 

[kendlee@mydomain data]$ ls -lh

total 1.6M

-rw-r--r-- 1 kendlee kendlee 789K Sep 2 14:18 1.dat

-rw-r--r-- 1 kendlee kendlee 789K Sep 2 14:18 2.dat

 

完成後,client 端使用如下命令來傳輸資料:

Linux:kendlee@~/tmp/test> rsync -avz server1.mydomain.com::kendlee/data/ .

receiving incremental file list

./

1.dat

2.dat

 

sent 70 bytes received 521988 bytes 54953.47 bytes/sec

total size is 1614206 speedup is 3.09

所以檔案也傳輸完成了。

 

實際上載傳輸測試:

首先把所在目錄內檔案調整一下,成為這樣內容結果:

  

Linux:kendlee@~/tmp/test> ls -lh

total 3.1M

-rw-r--r-- 1 kendlee kendlee 789K Sep 2 14:18 1.dat

-rw-r--r-- 1 kendlee kendlee 1.6M Sep 2 14:27 2.dat

-rw-r--r-- 1 kendlee kendlee 789K Sep 2 14:27 3.dat

 

測試一下上傳的狀態

 

Linux:kendlee@~/tmp/test>rsync -avz ./ server1.mydomain.com::kendlee/data/

sending incremental file list

ERROR: module is read only

rsync error: syntax or usage error (code 1) at main.c(869) [Receiver=3.0.7]

rsync: read error: Connection reset by peer (104)

rsync error: error in rsync protocol data stream (code 12) at io.c(760) [sender=3.0.7]

 

可以看出來有問題,因為預設該分享只有讀取無法寫入,所以調整原本分享的區段成為如下:

[kendlee]

path = /home/users/kendlee

uid = kendlee

gid = kendlee

read only = false

 

改好後測試一下:

Linux:kendlee@~/tmp/test> rsync -avz ./ server1.mydomain.com::kendlee/data/

sending incremental file list

./

2.dat

3.dat

 

sent 261430 bytes received 5455 bytes 106754.00 bytes/sec

total size is 3228412 speedup is 12.10

看起來成功沒有問題了。

 

 加上 IP 來源存取限制: 

rsync 服務配置好後,若是 firewall 沒有特別限制組檔就可以被連線存取,所以有必要加上規則進行限制。rsync 內可以使用 hosts allow 與 hosts deny

等語法來限制,這個與 tcp wrapper 語法很類似 (但是有些觀念不一樣喔)。

 

調整一下設定檔案:

 [kendlee]

path = /home/users/kendlee

uid = kendlee

gid = kendlee

hosts allow = 192.168.1.0/24

 

然後用戶端測試一下是否可以上傳更新:

Linux:kendlee@~/tmp/test> rsync -avz ./ server1.mydomain.com::kendlee/data/

@ERROR: access denied to kendlee from linux.mydomain.com (192.168.3.1)

rsync error: error starting client-server protocol (code 5) at main.c(1506) [sender=3.0.7]

 可以看出去拒絕存取了

 

加上帳號密碼驗證存取限制:

其實可以的話使用帳號密碼來限制是否可以使用該分享應該是更方便的做法,尤其存取來源沒有固定時候。要使用該限制功能,調整配置如下:

[kendlee]

path = /home/users/kendlee

uid = kendlee

gid = kendlee

auth users = kendlee, peter

secrets file = /etc/rsyncd.secrets

其中 auth users 後面指定後續要存取所允許使用的帳號名稱,多個帳號可以使用逗點隔開。後面的 secrets file 是指定帳號與應對的密碼,格式如下:

username:password

比方希望 kendlee 與 peter 的密碼分別為 public 與 private,那就是寫入:

 kendlee:public

peter:private

最後記得該檔案要改一下權限,設定為 600 避免安全性問題,也可以避免 rsync 拒絕不安全檔案的使用。

 改好後測試一下:

 

Linux:kendlee@~/tmp/test> rsync -avz server1.mydomain.com::kendlee/data/. .

Password:

@ERROR: auth failed on module kendlee

rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]

 

因為沒有指定帳號密碼所以失敗了,所以再次指定登入的帳號才可以進行傳輸...

 

Linux:kendlee@~/tmp/test> rsync -avz kendlee@server1.mydomain.com::kendlee/data/. .

Password:

receiving incremental file list

 

sent 60 bytes received 142 bytes 80.80 bytes/sec

total size is 3228412 speedup is 15982.24

所以可以看出來傳輸完成。

------------

最後...

其實這篇只有很簡單談到 rsync server 配置使用,若是要對設定檔案了解更多,包含更多的參數配置,像是 log 檔案的記錄、是否要配置 chroot、連線傳輸的數量限制等等,都可以在 manpage 內找到,詳細請多 man rsyncd.conf 內會有更完整的資訊。

 

36期電子報精彩單元

  1. 夏日電繪大作戰 活動報導
  2. 學員中秋、端午、生日賀卡 創意無限
  3. 架設 rsync server 提供資料同步與轉移
  4. IESviewer~擬真的燈光效果的免費軟體
  5. 用Painter繪出如玉美人~鎖情篇
  6. 陳慕潔的聯成故事:Comic Studio亞洲漫畫大賽,肯定創作夢想!

, , , , ,

lccnetvip 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 傑克
  • 感謝分享rsync

    Dear 小州大,
    文中看到三種不同指令,其中有些列有 ./ server1 而有些列沒有, 但有些列的結尾有兩點(..) 或一點(.)
    請問它們之間有什麼差異?還是沒差?感謝回答
    rsync -avz server1.mydomain.com::kendlee/data/ .
    rsync -avz ./ server1.mydomain.com::kendlee/data/
    rsync -avz kendlee@server1.mydomain.com::kendlee/data/. .
  • 傑克,以下為小州老師的答覆。謝謝你的詢問。
    1. rsync -avz server1.mydomain.com::kendlee/data/ .

    ==> 同步一份 kendlee/data 該目錄到目前所在工作目錄。

    ==> data 後面那個 / 可以省略,那只是路徑符號使用

    2. rsync -avz ./ server1.mydomain.com::kendlee/data/

    ==> 同步一份 kendlee/data 該目錄到目前所在工作目錄

    ==>data 後面那個 / 可以省略,那只是路徑符號使用

    3. rsync -avz kendlee@server1.mydomain.com::kendlee/data/. .

    ==> 同步一份 kendlee/data 目錄 "該層內所有檔案" 到目前所在工作目錄

    ---------------------------------------------------------------------------------------------------------

    實務上你可以測試一下這兩者差別就知道不同點,建立並進入'一個暫時目錄後比較:

    1) cp -a /bin/. .
    2) cp -a /bin .

    第一個結果會把 /bin 內所有檔案複製一份到目前工作目錄,所以目前目錄內有一堆檔案
    第二個結果會複製 /bin 目錄一份到目前工作目錄,所以目前工作目錄會有一個目錄為 bin

    lccnetvip 於 2010/11/22 08:57 回覆