rdist 為各大 Unix 平台上常見之一個工具程式,其用途為保持同一個檔案在多部不同 機器上的內容同步。可協助雙主機備援與遠端管理等工作。
本文將就在一個使用者眾多的區域或是廣域網路上如何以 FreeBSD 達成「分散管理,集 中控制」的目標作一探討。並以 rdist 這個工具的使用作為實例。
FreeBSD 為一功能強大且免費之 Unix 相容作業系統,可以將個人電腦有限的資源轉而 為整個區域網路提供各項服務,例如 WWW, DHCP, DNS, E-Mail, BBS, Gopher, Anonymous FTP, 以及 Samba 等等。更可以擔負 Internet Server 的重責大任 (如 Apache Org., Yahoo!, Walnut Creek CD-ROM, Internet Movie Database 等等知名公司所採用)。
以下將分別簡單說明 rdist 與 rsync
兩者的功能。
rdist
rdist,有 "remote distribution" 的意思。就是讓你能夠在多台機器上散播同一個 檔案。而它會在可能的情況下保留檔案的擁有者、群組以及更改時間。它也可以更新正在 執行中的指令。因此你可以用一台機器來管理多台機器的設定,可參考後面的範例。
rdist 的運作方式是透過 rcmd(3) 這個函數 (rsh 及 rlogin 等 "r" 字輩的指令都會 用到的函數) 來執行遠端機器上的指令,以達到安裝或是更新遠端檔案的目的。而使用者 可以寫一個設定檔,將所要執行的動作預先寫好,再將 rdist 指令置於 cron table 中, 以達到定時自動更新的功能。
事實上,在 FreeBSD 2.2.5 版本中,如果你將 rdist 的設定檔寫在 /etc/Distfile 這個檔案裡面,那麼 FreeBSD 會在每天執行的系統工作中 (/etc/daily 這個 script), 自動幫你執行 rdist ,並且將 Distfile 作備份。
rsync 與 rdist 相似的地方在於兩者都是使用 rcmd 的函數來跑。主要的不同點在於 rsync 並不用 Distfile 或任何設定檔,它直接以命令列的形式放在 cron table 裡面定 時執行,以備份你的檔案,保持遠端機器的檔案同步。
以下就將舉一個實際的例子說明如何達到「分散管理,集中控制」的目的。
不過在如此作的同時,也要相對地更動主機上 dhcpd 或 named 啟動參數。例如:
這樣就可以達到以一台機器控制其他機器的設定了。
以下就是我在使用的 rdist 設定檔 (/etc/Distfile) 的內容:
# HOSTS 變數定義所有要管理的機器名稱
HOSTS = ( Fa Fb Fc Fd Fe )
# FILES 變數定義一些共同要安裝或更新的檔案
FILES = ( /etc/csh.cshrc /etc/csh.login /etc/csh.logout /etc/hosts
/etc/hosts.equiv /usr/local/libexec/telnetd.script /etc/inetd.conf
/etc/issue.net /etc/namedb/root.cache )
# BIN 定義要安裝的可執行檔及程式
BIN = ( /usr/local/bin/chinese_uptime /usr/local/libexec/telnetd /bin/tcsh )
# FILE_host 定義每一台機器要個別更新的檔案。
FILE_Fa = ( /etc/dhcp_conf/dhcpd.conf.Fa /etc/namedb/named.Fa)
FILE_Fb = ( /etc/dhcp_conf/dhcpd.conf.Fb /etc/namedb/named.Fb)
FILE_Fc = ( /etc/dhcp_conf/dhcpd.conf.Fc /etc/namedb/named.Fc)
FILE_Fd = ( /etc/dhcp_conf/dhcpd.conf.Fd /etc/namedb/named.Fd)
FILE_Fe = ( /etc/dhcp_conf/dhcpd.conf.Fe /etc/namedb/named.Fe)
# 以下這一段就是把一些可以共用的檔案 (FILES 和 BIN 定義的) 安裝到 HOSTS 定義的
# 機器上。完成後並將結果用 e-mail 通知 miles 這個帳號(F0 上的)。
install:
${FILES} -> ${HOSTS}
notify miles@F0;
${BIN} -> ${HOSTS}
notify miles@F0;
# 以下這一段 conf ,則是將每台機器個別控管的檔案安裝到每台機器上,
# 並將結果通知 miles@F0 這個使用者。
conf:
${FILE_Fa} ->Fa
notify miles@F0;
${FILE_Fb} ->Fb
notify miles@F0;
${FILE_Fc} ->Fc
notify miles@F0;
${FILE_Fd} ->Fd
notify miles@F0;
${FILE_Fe} ->Fe
notify miles@F0;
目前常在 "r" 字輩的指令身上發現安全漏洞。對於 rdist 和 rsync 來說,目前的解 決方法大概就是使用 ssh (Secure SHell) 來取代 rsh 吧。rdist 本身也曾出現在 CERT 的安全 通報上面 (CA-96.14),因此使用起來自是需要格外的小心。其他關於此方面的問題, 也歡迎大家的指教。