文、小州老師(點擊認識小州老師)
前言:在前幾期電子報中有一篇是談過如何使用 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期電子報精彩單元
留言列表