NIS Slave 有兩種方式同步資料,一種是透過 ypxfrd 方式,由 NIS Slave 定時(透過 crond)跟 Master 取得資料同步,另一種是 NIS Master 更新資料時,利用 yppush 把異動的資料送給 NIS Slave。說到 yppush 就一定要看一下 /var/yp/Makefile ,每當我們透過 Makefile 重新編譯資料時,Makefile 會呼叫 yppush 送到 NIS Slave,請看下方紅色字體的部份
netgroup: $(NETGROUP) $(YPDIR)/Makefile特別注意到 $(NOPUSH) ,在 Makefile 裡面有一行 NOPUSH 的變數,用來決定是否要用 yppush 傳送資料,當然我們需要 yppush 所以請把他改為
@echo "Updating $@..."
@$(AWK) '{ if ($$1 != "" && $$1 !~ "#" && $$1 != "+") \
print $$0 }' $(NETGROUP) | $(DBLOAD) -i $(NETGROUP) \
-o $(YPMAPDIR)/$@ - $@
-@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@
NOPUSH=false那另一個 $(DOMAIN) 如何來的呢? 一樣看 Makefile,裡面有個變數是利用 basename 及 pwd 指令取得網域,老實說我覺得這設計不是很好,我花了不少時間才找到這個資訊
DOMAIN = `basename \`pwd\``所以執行 make 時,shell所在的工作目錄就很重要了,不然 yppush 同步會失敗,錯誤訊息大概會跟下面那堆訊息很接近
shell># ls /var/yp
nistest binding Makefile nicknames ypserversshell># cd /var/yp
shell># make hosts
Updating hosts.byname...所以正確的方式應如下(nistest 是我的 NIS 網域)
YPBINDPROC_DOMAIN: Domain not bound
Could not read ypservers map: 3 Can't bind to server which serves this domain
YPPUSH: Cannot open /var/yp/yp/hosts.byname
make: [hosts.byname] Error 1 (ignored)
Updating hosts.byaddr...
YPBINDPROC_DOMAIN: Domain not bound
Could not read ypservers map: 3 Can't bind to server which serves this domain
YPPUSH: Cannot open /var/yp/yp/hosts.byaddr
make: [hosts.byaddr] Error 1 (ignored)
shell># cd /var/yp/nistest
shell># rm -f hosts.*
shell># make -f ../Makefile hosts
Updating hosts.byname...再來 yppush 要如何知道我有哪些 NIS Slave 伺服器需要更新,答案就在 /var/yp/ypservers ,每當要執行 yppush 時,yppush 會到 /var/yp/domain/ypservers 找尋 NIS slave,然後將資料 push 給他們,/var/yp/ypservers 的格式長這樣,一行一筆資料。
Updating hosts.byaddr...
shell># cat /var/yp/ypservers
ypserver1一旦你更新了 ypservers 要記得 make ,不然不會生效
ypserver2
192.168.1.1
shell># make ypservers
make: `ypservers' is up to date.你可以透過 ypcat 來確認是否已經更新
shell># ypcat ypservers
ypserver1OK! 到這邊開始進行 NIS Slave 的設定
ypserver2
192.168.1.1
/* 以下資訊在 NIS Master 執行 */
1. 啟動 ypxfrd 好讓 NIS Slave 可以透過此服務同步資料
shell># service ypxfrd start
shell># chkconfig ypxfrd on
/* 以下資訊在 NIS slave 執行 */
1. 安裝 yp 套件
shell># yum install ypserv ypbind yp-tools
2. 架設 NIS slave 前,先利用 ypbind 跟 NIS Master 完成整合,可以參考 NIS 安裝筆記
3. 執行 ypinit,若失敗的話大概是你沒在 NIS Master 啟動 ypxfrd 服務,或者 ypbind 整合 NIS 有問題
shell># /usr/lib/yp/ypinit -s nisserver1
We will need a few minutes to copy the data from db2.4. 啟動 ypserv 後確認資料是否已經同步
Transferring protocols.byname...
Trying ypxfrd ... success
Transferring auto.home...
Trying ypxfrd ... success
Transferring ypservers...
Trying ypxfrd ... success
... 略
shell># service ypserv start
shell># ypcat -h localhost services
nsc-posa 2605/udp5. 定時跟 Master 同步資料
proactivesrvr 2722/tcp
ats 2201/udp
ds-srvr 4401/tcp
msp-os 4686/tcp
gdbremote 2159/udp
ibridge-mgmt 2276/tcp
adi-gxp-srvprt 6769/tcp
imip-channels 11320/udp
vocaltec-wconf 22555/tcp
.... 略
在 /usr/lib/yp 下有三隻 script ,分別是 ypxfr_1perday, ypxfr_2perday, ypxfr_1perday,其實這三隻 script 內容都一樣,是用 shell 寫的迴圈呼叫 ypxfr 進行更新,要注意到他的 MAP_TO_GET 的列表並不完全,記得依自己的需求更新一下,下面紅字是我修改的部份
shell># cat /usr/lib/yp/ypxfr_1perhour
YPBINDIR=/usr/lib/yp6. 設定 crond 去觸發執行
MAPS_TO_GET="group.byname group.bygid protocols.byname protocols.bynumber networks.byname networks.byaddr rpc.byname rpc.bynumber services.byname ypservers"
for map in $MAPS_TO_GET
do
$YPBINDIR/ypxfr $map
done
shell># cat /etc/crontab
@hourly root /usr/lib/yp/ypxfr_1perhour > /dev/null 2>&17. 最後記得到各台 NIS client 設定 yp.conf 把 NIS Slave 加進去
/* 參考文獻 */
man(8) yppush
man(8) ypinit
/var/yp/Makefile
http://www.linux-nis.org/
沒有留言:
張貼留言