2012年2月29日

nis slave 架設

當架設好 NIS Master 時,最好要有一台 NIS Slave,此話怎說? 若你的系統服務是靠 NIS 帳號執行時,一旦 NIS 伺服器故障會導致服務無法啟動或執行,所以 NIS Slave 在整個系統上也是很重要的一環。

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
@echo "Updating $@..."
@$(AWK) '{ if ($$1 != "" && $$1 !~ "#" && $$1 != "+") \
print $$0 }' $(NETGROUP) | $(DBLOAD) -i $(NETGROUP) \
-o $(YPMAPDIR)/$@ - $@
-@$(NOPUSH) || $(YPPUSH) -d $(DOMAIN) $@
特別注意到 $(NOPUSH) ,在 Makefile 裡面有一行 NOPUSH 的變數,用來決定是否要用 yppush 傳送資料,當然我們需要 yppush 所以請把他改為
NOPUSH=false
那另一個 $(DOMAIN) 如何來的呢? 一樣看 Makefile,裡面有個變數是利用 basename 及 pwd 指令取得網域,老實說我覺得這設計不是很好,我花了不少時間才找到這個資訊
DOMAIN = `basename \`pwd\``
所以執行 make 時,shell所在的工作目錄就很重要了,不然 yppush 同步會失敗,錯誤訊息大概會跟下面那堆訊息很接近

shell># ls /var/yp
nistest binding Makefile nicknames ypservers
shell># cd /var/yp
shell># make hosts
Updating hosts.byname...
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)
所以正確的方式應如下(nistest 是我的 NIS 網域)
shell># cd /var/yp/nistest
shell># rm -f hosts.*
shell># make -f ../Makefile hosts
Updating hosts.byname...
Updating hosts.byaddr...
再來 yppush 要如何知道我有哪些 NIS Slave 伺服器需要更新,答案就在 /var/yp/ypservers ,每當要執行 yppush 時,yppush 會到 /var/yp/domain/ypservers 找尋 NIS slave,然後將資料 push 給他們,/var/yp/ypservers 的格式長這樣,一行一筆資料。

shell># cat /var/yp/ypservers
ypserver1
ypserver2
192.168.1.1
一旦你更新了 ypservers 要記得 make ,不然不會生效
shell># make ypservers
make: `ypservers' is up to date.
你可以透過 ypcat 來確認是否已經更新
shell># ypcat ypservers
ypserver1
ypserver2
192.168.1.1
OK! 到這邊開始進行 NIS Slave 的設定

/* 以下資訊在 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.
Transferring protocols.byname...
Trying ypxfrd ... success

Transferring auto.home...
Trying ypxfrd ... success

Transferring ypservers...
Trying ypxfrd ... success

... 略

4. 啟動 ypserv 後確認資料是否已經同步
shell># service ypserv start
shell># ypcat -h localhost services
nsc-posa 2605/udp
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
.... 略
5. 定時跟 Master 同步資料
在 /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/yp

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
6. 設定 crond 去觸發執行
shell># cat /etc/crontab
@hourly root /usr/lib/yp/ypxfr_1perhour > /dev/null 2>&1
7. 最後記得到各台 NIS client 設定 yp.conf 把 NIS Slave 加進去


/* 參考文獻 */
man(8) yppush
man(8) ypinit
/var/yp/Makefile
http://www.linux-nis.org/

沒有留言:

張貼留言