NIS網路資訊系統簡介(轉)

post0發表於2007-08-11
NIS網路資訊系統簡介(轉)[@more@]

當執行一個區域網時,系統管理員的目標通常是為使用者提供一個透明的網路環境。要做到這一步的一個重要步驟是在所有主機之間保持重要資料(比如使用者帳號資訊)的同步。我們在前面已經看到,對於主機名的解析,存在一個強大而複雜的服務,即DNS。對於其他任務沒有這種特殊的服務。此外,如果你只是管理一個沒有Internet連線的小LAN的話,那麼對於許多管理員來說安裝設定DNS是不值得的。

這就是為什麼Sun開發出了NIS,即網路資訊系統(Network Information System)。NIS提供了通用資料庫訪問設施,可以實現向你的網路上的所有主機分發資訊,比如象passwd和groups檔案所包含的資訊。這使得網路看起來象一個獨立系統,在所有的主機上有著相同的帳號。你可以以同樣的方式透過NIS向網路上的所有機器同步/etc/hosts中的主機名資訊。

NIS是基於RPC的,是由一個伺服器、一個客戶端庫以及幾個管理工具組成。起初,NIS被稱作黃頁(Yellow Pages),或YP,現在仍然使用這個名稱來非正式地指這項服務。另一方面,Yellow Pages是英國電信的商標,英國電信一直要求Sun更換這個名字。隨著事態的發展,某些名稱已與人們分不開了,所以YP一直以與NIS相關命令的字首形式繼續存在著,比如象ypserv、ypbind等等。

今天,幾乎所有的UN*X都包括NIS,而且甚至有它的免費實現版本。一個是來自BSD的Net-2發行版,源自於Sun捐贈的公眾域參考實現。該版的客戶庫程式碼已經存在於GNU的libc中很長時間了,而管理程式只是在最近才由Swen Thümmler [1] 移植到Linux上。在這個參考實現中漏掉了一個NIS伺服器程式。Tobias Reber已經編制出了另外一個NIS軟體包,其中包括所有的工具和一個伺服器;該軟體包稱作yps。[2]

目前,一個完全重寫的稱為NYS的NIS程式碼已由Peter Eriksson [3]編制出來,它支援普通的NIS和Sun的經過許多修正的NIS+。NYS不僅提供了一個NIS工具集和一個伺服器,而且還增加了一個全新的庫函式集,這個庫函式集可能最終會被加入到標準libc中。這包括替換目前使用host.conf的主機名解析的一個新設定方案。這些函式的特性將在下面討論。

這一章將集中討論NYS而非另外兩個軟體包,對於這兩個軟體包我將稱它們為“傳統的”NIS程式碼。如果你確實要想執行任何這些軟體包的話,本章中的說明也許已經足夠也許還不夠。要獲取另外的資訊,請取得一本有關NIS的標準(權威)書本,比如象Hal Stern的NFS和NIS(見[Stern92])。

目前,NYS仍處於開發階段,因此標準的Linux工具如網路程式或login程式還沒有注意到NYS的配置方案。只有到NYS合併進主流libc中時,如果你想使得所有這些執行程式使用NYS時,你才需要重新編譯它們。在任何這些應用程式的Makefiles中,在libc之前,指定-lnsl作為 linker的最後一個選項。這將有關函式從libnsl—NYS庫中連線過來,取代從標準C庫的連線。

10.1 理解NIS

NIS在所謂的包含鍵-值對的maps中儲存資料庫資訊。Maps被儲存於執行NIS伺服器的中央主機中,從該主機中,客戶可以透過各種RPC呼叫檢索資訊。最頻繁地,maps是存於DBM檔案中的。[4]

Maps本身是從主要文字檔案(比如/etc/hosts或/etc/passwd)中生成的。對於某些檔案,會生成幾個maps,每個搜尋鍵型別對應一個。例如,你可以為主機名和IP地址搜查hosts檔案。相應地,從中會生成兩個NIS maps,分別稱為hosts.byname和hosts.byaddr。表10.1列出了通用maps和它們生成的檔案。

Master File Map(s)

/etc/hosts

/etc/networks

/etc/passwd

/etc/group

/etc/services

/etc/rpc

/etc/protocols

/usr/lib/aliases Hosts.byname hosts.byaddr

Networks.byname networks.byaddr

Passwd.byname passwd.byuid

Group.byname group.bygid

Services.byname services.bynumber

Rpc.byname rpc.bynumber

Protocols.byname protocols.bynumber

Mail.aliases

表10.1 一些標準的NIS maps以及相應的檔案。

在某些NIS軟體包或其它軟體中,還有一些你可能會覺得有用的別的檔案和maps。這些檔案和maps可能含有沒在這本書中討論過的應用程式的資訊,比如可能用於某些BOOTP伺服器中的bootparams maps,或者在Linux中目前不含有任何函式的檔案(就象ethers.byname和ethers.byaddr maps)。

對於某些maps,人們通常使用綽號(nicknames),它們很短因而易於鍵入。要想獲得一個你的NIS工具能夠理解的綽號的完整列表,執行下面的命令:

$ ypcat –x

NIS map nickname translation table:

“passwd” -> “passwd.byname”

“group” -> “group.byname”

“networks” -> “networks.byaddr”

“hosts” -> “hosts.byname”

“protocols” -> “protocols.bynumber”

“services” -> “services.byname”

“aliases” -> “mail.aliases”

“ethers” -> “ethers.byname”

“rpc” -> “rpc.bynumber”

“netmasks” -> “netmasks.byaddr”

“publickey” -> “publickey.byname”

“netid” -> “netid.byname”

“passwd.adjunct” -> “passwd.adjunct.byname”

“group.adjunct” -> “group.adjunct.byname”

“timezone” -> “timezone.byname”

NIS伺服器傳統地稱為ypserv。對於一箇中等大小的網路來說,單個伺服器通常就足夠了;大型的網路可能需要在不同的網段以及不同的機器上執行幾個伺服器,以減輕伺服器機器和路由器的負荷。透過將這些伺服器之一作為主伺服器(master server),其它的伺服器作為次伺服器(slave servers),使得這些伺服器同步。Maps將只在主伺服器上建立。從主伺服器上將它們分發到所有次伺服器上。

你可能已經注意到,我們一直很含糊地論及“網路”;當然引用這樣一個網路的NIS存在著與眾不同的概念,也即透過NIS共享它們部分系統配置資料的所有主機的一個集合:NIS域。不幸的是,NIS域與我們在DNS中遇到的域絕對沒有一點共同之處。為了在本章中避免含糊不清的情況,我將總是指出我說的哪一型別的域。

NIS域只具有純粹的管理功能。對於使用者來說它們主要是不可見的,除了在域中所有機器之間口令的共享。因此,給NIS域取的名字僅與管理員有關。通常,可以使用任何名字,只要該名字與你的本地網路上的其它NIS域名不同就行。例如,虛擬釀酒廠的管理員可以選擇建立兩個NIS域,一個是給釀酒廠本身用的,另一個是個葡萄酒廠的,她分別將其命名為brewery和winery。另一個很普遍的方案是簡單地用DNS域名也作為NIS的域名。為了設定和顯示你的主機的NIS域名,你可以使用dommainname命令。當不加任何引數呼叫時,它列印出當前NIS域名;如要設定這個域名的話,你必須成為超級使用者並鍵入:

# domainname brewery

NIS域決定了一個應用程式將查詢哪個NIS伺服器。例如,在葡萄酒廠(Winery)的主機上的login程式(當然)將只向葡萄酒廠的NIS伺服器(或者是它們其中之一,如果存在多個伺服器的話)查詢使用者的口令資訊;而釀酒廠主機上的應用程式將只查詢釀酒廠的伺服器。

現在還有一個疑點要解決,也即一個客戶如何知道要連線到哪一臺伺服器上去。最簡單的途徑是有一個配置檔案,它給出了要在其上查詢伺服器的主機名。然而,這個辦法非常不靈活,因為它不允許客戶依據這些伺服器存在與否使用不同的伺服器(當然是指從同一個域)。因此,傳統的NIS實現依賴於一個稱作ypbind 的特殊後臺程式在它們的NIS域中來偵測一個適當的NIS伺服器。在能夠執行任何NIS查詢之前,任何應用程式首先要從ypbind找出要使用哪個伺服器。

ypbind透過向本地IP網路廣播來探測伺服器;第一個響應的伺服器假設基本上是最快的一個並將用於隨後的NIS查詢。在某個間隔時間過去以後,或者如果伺服器不工作了,ypbind將再次探測執行著的伺服器。

現在,關於動態繫結的爭論點是你很少需要它,並且它會帶來安全方面的問題:ypbind盲目地相信任何應答者,而這個應答者可能會是一個謙遜的NIS伺服器也可能是一個懷有惡意的入侵者。不用說如果你在NIS上管理你的口令資料庫的話,這將變成特別麻煩的事。為了防範這個問題,NYS預設地不使用 ypbind,而是從一個配置檔案中取得伺服器的主機名。

10.2 NIS與NIS+

NIS和NIS+除了在名字上和有共同的目標以外,很少有相同之處。NIS+是用一個完全不同的方法構成的。它使用一個類似於DNS的分級名字空間,而不是一個平面的名字空間和鬆散脫節的NIS域。它使用一個由行和列組成的所謂的表(tables)而不是maps,在NIS+資料庫中表的每一行表示一個物件,而列表示NIS+所知所關心的物件的那些屬性。一個給定的NIS+域的每個表由那些它們的父域組成。另外,表中的一個條目可以包含到另一個表的連結。這些特性使得用許多方法構造資訊成為可能。

傳統的NIS的RPC版本號是2,而NIS+的是版本3。

NIS+至今似乎還沒有被廣泛地使用,而且我實際上對它也知道不多。(唔,幾乎一竅不通)。由於這個原因,這裡我們將不涉及它了。如果你對它感興趣並想多學一點的話,請參閱Sun的NIS+管理手冊([NISPlus])。

10.3 客戶邊的NIS

如果你熟悉編制或移植網路應用程式的話,你將會注意到上面所列出的許多NIS maps與C庫中的庫函式相對應。例如,要獲得passwd資訊,你通常使用getpwnam(3)和getpwuid(3)函式,它們分別返回與給定的使用者名稱或數值使用者id相對應的帳號資訊。在通常的環境下,這些函式將在標準檔案(比如/etc/passwd)中執行請求的查詢。

然而,這些函式的基於NIS(NIS-aware)的實現將更改這種行為,並且會啟用一個RPC呼叫讓NIS伺服器查詢使用者名稱或id。對於應用程式來說這個操作是完全透明的。這個函式可以將NIS map“附加”或“替換”掉原始的檔案。當然,這並沒有對檔案進行實際的修改,它只是讓應用程式看上去好象該檔案已經被替換或附加上去了。

對於傳統的NIS實現來講,對於那些maps替換掉以及那些被新增到原始資訊中,曾有某些慣例。有些maps(比如passwd maps)需要對passwd檔案進行雜湊地修改,當做錯時,就會開啟安全方面的缺口。為了避免這個缺陷,NYS常規的配置方案,該方案確定了一個特定的客戶函式集是否使用原始檔案、NIS、NIS+,並且以什麼次序使用。這將在本章後續小節中加以討論。

10.4 執行一個NIS伺服器

在這麼多理論方面的喋喋不休之後,現在開始動手做實際的配置工作。在本節中,我們將討論NIS伺服器的配置。如果在你的網路上已經有一個NIS伺服器在執行,你就不必設定你自己的伺服器了;在這種情況下,你可以安全地跳過本節。

注意,如果你只是準備對伺服器做試驗,請確信你沒有設定一個已經在你網路上使用的NIS域名。因為這會使整個網路服務癱瘓並使得許多人不高興和惱怒。

對於Linux目前有兩個現存的免費NIS伺服器,一個包含在Tobias Reber的yps軟體包中,另一個在Peter Eriksson的ypserv軟體包中。至於你執行哪一個是無關緊要的,也不管你使用NYS還是目前在libc中的標準NIS客戶程式碼。在寫作本書時,yps中的NIS次伺服器處理的程式碼似乎更完善一些。所以如果你要涉及到次要伺服器的話,yps可能是一個更好的選擇。

當在/usr/sbin中安裝好伺服器程式(ypserv)以後,你應該建立一個目錄,用於存放你的伺服器分發的map檔案。當為brewery域設定好一個NIS域時,maps將存於/var/yp/brewery中。伺服器透過檢測是否存在一個map目錄來確定它是否在為一個特定的NIS域服務。如果你對某些NIS域禁用了服務,請確信同時也刪除那個目錄。

Maps通常儲存於DBM檔案中以加速查詢。它們是用一個稱為makedbm(對於Tobias的伺服器)或dbmload(對於Peter的伺服器)的程式從主檔案中建立的。它們是不可互換的。將主檔案轉換成dbmload可分析的形式通常需要一些awk或sed技巧,這對於錄入有些乏味並且難於記憶。因此,Perter Eriksson的ypserv軟體包含有一個Makefile(稱為ypMakefile),它將為你做所有這些工作。你應該將它作為Makefile 安裝在你的map目錄中,並且編輯它,以反映你要分發的maps。在檔案的頭部,你會發現all目標,它列出了ypserv將要提供的服務。預設地,該行看上去象這樣:

all: ethers hosts networks protocols rpc services passwd group netid

例如,如果你不想生成ethers.byname和ethers.byaddr maps,只須簡單地從這條規則中去掉ethers先決條件。為了測試你的設定,開始只使用一二個maps,比如services.* maps,就已經足夠了。

在map的目錄裡,在編輯好Makefile以後,鍵入“make”。這將自動地生成並安裝maps。你必須確信每當你改變了主檔案之後,一定要更新maps,否則所做的改變對網路仍然是不可見的。

下一節解釋如何配置NIS客戶程式碼。如果你的安裝設定不工作的話,你應該查出有沒有任何請求到達你的伺服器。如果你對NYS伺服器指定-D命令列標誌,它將在控制檯上列印出有關所有進入的NIS查詢的除錯資訊,並且返回結果。這些將給你一個提示來確定問題到底出在哪裡。Tobias的伺服器沒有這個選項。

10.5 使用NYS設定一個NIS客戶

在本章的餘下部分,我們將討論NIS客戶的配置。

你的第一步應該是告知NYS對於NIS服務使用哪個伺服器,並在/etc/yp.conf配置檔案中設定好。對於在葡萄酒廠(Winery)網路上一臺主機上的簡單樣本檔案看上去象這樣:

# yp.conf – YP configuration for NYS library.

#

domainname winery

server vbardolino

第一條語句告訴所有NIS客戶,他們屬於winery NIS域。如果你省略這一行,NYS將使用你透過domainname命令指派給你係統的域名。server語句指定所使用的NIS伺服器。當然,與vbardolino相應的IP地址必須在hosts檔案中設定;另外,你也可以在server語句中使用IP地址本身。

在上面所示的表單中,server命令告訴NYS使用指定的伺服器而不管目前的NIS域是什麼。然而,如果你頻繁地在不同的NIS域中移動你的機器的話,你可能想要在yp.conf檔案中儲存幾個域的資訊。你可以透過在server語句中增加NIS域名獲得幾個NIS域的伺服器的資訊。例如,你可以為一個便攜機改變上面樣本檔案成這樣:

# yp.conf – YP configuration for NYS library

#

server vbardolino winery

server vstout brewery

這允許你在系統引導時透過domainname命令設定期望的NIS域來在兩個域的任何一個域中使用便攜機。

在建立了這個基本的配置檔案並確信它是可讀的以後,你應該執行的第一次測試來檢查你是否能連線到你的伺服器上。確信選擇你的伺服器分發的任何map,如 hosts.byname,並試著使用ypcat工具來檢索它。ypcat,就象所有其它的NIS管理工具一樣,應該存在於/usr/sbin中。

# ypcat hosts.byname

191.72.2.2 vbeaujolais vbeaujolais.linus.lxnet.org

191.72.2.3 vbardolino vbardolino.linus.lxnet.org

191.72.1.1 vlager vlager.linus.lxnet.org

191.72.2.1 vlager vlager.linus.lxnet.org

191.72.1.2 vstout vstout.linus.lxnet.org

191.72.1.3 vale vale.linus.lxnet.org

191.72.2.4 vchianti vchianti.linus.lxnet.org

你所得到的輸出應該與上面顯示的相象。如果你得到了一條錯誤資訊指出“Can’t bind to server which serves domain”或者某些類似的資訊,那麼或者是你設定的NIS域名在yp.conf中沒有匹配的伺服器,或者是由於某些原因伺服器找不到。在後一種情況下,請確信ping到那個主機產生正確的結果,並且它確實正在執行一個NIS伺服器。你可以使用rpcinfo來驗證後者,它將生成以下輸出:

# rpcinfo –u serverhost ypserv

program 100004 version 2 ready and waiting

10.6 選擇正確的maps

在確信能夠與NIS伺服器聯絡之後,你必須決定要用NIS maps替換或新增哪個配置檔案。一般地,你將會對主機和口令查詢函式使用NIS maps。前者對於沒有使用BIND時特別有用。後者允許所有使用者在NIS域的任何系統上登入進他們的帳號;這通常要求透過NFS在所有的主機之間共享一箇中央/home目錄。這將在10.7節中詳細討論。其它的maps,如同services.byname,並沒有如此有戲劇性的效能,但能為你省去某些編輯工作如果你安裝了任何網路應用程式而該應用程式使用了一個不在標準services檔案中的服務名。

通常,對於一個查詢函式何時使用本地檔案、何時詢問NIS伺服器,你會想有某些自由的選擇。NYS允許你配置函式訪問這些服務的順序。這是透過/etc/nsswitch.conf檔案來控制的,該檔名是指名稱服務交換(Name Service Switch),當然其並不限制於名稱服務。對於NYS支援的任何資料查詢函式,它都包含指定所用服務的一行。

服務的正確順序是與資料的型別有關的。並無必要讓services.byname的map一定要含有與本地services檔案中不同的條目;它可以包含更多的條目。所以,一個好的選擇可以是首先查詢本地檔案,並且只有當服務名稱沒有找到時才查詢NIS。另一方面,主機名資訊可能會非常頻繁地改變,所以 DNS或NIS伺服器應該總是有非常正確的資訊,而本地的hosts檔案只作為在DNS和NIS不可用時的一個備份而已。在這種情況下,你可能想最後查詢本地檔案。

下面的例子顯示出瞭如何以上面描述的方式配置gethostbyname(2)、gethostbyaddr(2)和getservbyname(2)函式。它們將依次試用列出的服務;如果一個查詢成功,結果就返回,否則試用下一個服務。

# small sample /etc/nsswitch.conf

#

hosts: nis dns files

services: files nis

可以在nsswitch.conf檔案中有一個條目的完整服務的列表如下面所示。實際被查詢的maps、檔案、伺服器和物件依賴於條目名。

nisplus或nis+

對這個域使用NIS+伺服器。伺服器的位置從/etc/nis.conf檔案中獲得。

nis 使用這個域的當前NIS伺服器。被查詢的伺服器的位置在yp.conf檔案中設定,見前節所示。對於hosts條目,要查詢hosts.byname和hosts.byaddr maps。

dns 使用DNS名字伺服器。這個服務型別只對hosts條目有用。要被檢索的名字伺服器仍然由標準resolv.conf檔案確定。

files 使用本地檔案,比如對於hosts條目使用/etc/hosts檔案。

dbm 從位於/var/dbm內的DBM檔案中查詢資訊。檔案所使用的名字與NIS map相對應。

目前,NYS支援下面這些nsswitch.conf條目:hosts、networks、passwd、group、shadow、gshadow、services、protocols、rpc和ethers。以後還會增加更多的條目。

圖10.1顯示了一個更完整的例子,它引入了nsswitch.conf的另一個特性:hosts條目中的[NOTFOUND=return]關鍵字通知 NYS,如果在NIS或DNS資料庫中沒有找到所要的項就返回。也即,只有在向NIS和DNS伺服器的呼叫由於某些其它原因失敗時,NYS才將繼續搜尋本地檔案。因此,本地檔案只在啟動引導期間使用並且當NIS伺服器關閉時起一個備份的作用。

# /etc/nsswitch.conf

#

hosts: nis dns [NOTFOUND=return] files

networks: nis [NOTFOUND=return] files

services: files nis

protocols: files nis

rpc: files nis

圖10.1 nsswitch.conf樣本檔案。

10.7 使用passwd和group Maps

NIS的一個主要應用是在一個NIS域中的所有主機上同步使用者以及帳目資訊。關於這方面,你通常只儲存了一個小的本地/etc/passwd檔案,對於這個檔案,從NIS maps獲得的站點範圍的資訊被新增了進去。然而,只是簡單地在nsswitch.conf中為這個服務啟用NIS查詢還不很夠。

當引用NIS描述的口令資訊時,你必須首先確信在你本地passwd檔案中任何使用者的數值使用者id與NIS伺服器的使用者id匹配。同樣對於其它目的你也會需要這樣的,比如從你的網路中其它主機上載入NFS卷時。

如果/etc/passwd或/etc/group中的任何數值id與maps中的相偏離,你必須為屬於那個使用者的所有檔案調整檔案的所有權。首先你必須將passwd和group中的uid和gid改成一個新值;然後找出屬於剛改變的使用者的所有檔案,最後改變這些檔案的所有權。假設news曾有一個id 為9,而okir有一個id為103,它們將被改成其它值;那麼你可以發出以下的命令:

# find / -uid 9 –print >/tmp/uid.9

# find / -uid 103 –print >/tmp/uid.103

# cat /tmp/uid.9 | xargs chown news

# cat /tmp/uid.103 | xargs chown okir

必須針對新安裝的passwd檔案執行這些命令,並且在改變任何檔案的所有權之前收集所有檔案的名字,這點很重要。為了更新檔案的組所有權,你將使用一個類似的命令。

在做完這些工作之後,你係統上的數值uid和gid將與你的NIS域中所有其它主機上的相匹配。下一步將是在nsswitch.conf中增加配置行,它為使用者和組資訊啟用NIS查詢:

# /etc/nsswitch.conf – passwd and group treatment

passwd: nis files

group: nis files

這使得在一個使用者試圖登入時,login命令和所有其它類似命令首先查詢NIS maps,如果這個查詢失敗時,再返回使用本地檔案。一般來講,你將從你的本地檔案中刪除所有的使用者,而只留下root和象mail一樣的通用帳目。這是因為某些至關重要的系統任務可能需要將uid對映到使用者名稱上或者反之。例如,管理用的cron作業可能會執行su命令來臨時變成news,或者UUCP子系統可能要郵寄一個狀態報告。如果news和uucp在本地passwd檔案中沒有條目了,那麼在NIS不能使用期間這些作業將糟糕地失敗。

這裡有兩個大告戒:一方面,上面所描述的設定在這裡只適應於沒有使用影子(shadow)口令的登入狀況,象那些包括在util-linux軟體包中的。與NIS一起使用影子口令的複雜問題將在下面論及。另一方面,登入命令並不是僅有的訪問passwd檔案的命令—請看許多人幾乎一直使用的ls命令。每當進行一次長列表時,ls將顯示一個檔案的使用者和組的宿主的符號名;也即,對於它遇到的每個uid和gid,它就要查詢NIS伺服器一次。如果你的本地網路受到阻塞時將嚴重地拖延進行的工作,或者更糟糕的是,當NIS伺服器不在同一個物理網路上時,資料包還必須透過路由器傳輸。

事情還沒結束。想象以下如果一個使用者想要更改她的口令時會發生什麼情況。通常,她會執行passwd,它將讀入新的口令並更新本地passwd檔案。對於 NIS來說,這是不可能的,因為這個檔案已不再存在於本地了,但是每當使用者想要改變他們的口令時就讓他們登入進NIS也不是個選擇。因此,NIS提供了一個對passwd的混入替換稱為yppasswd,它用來在目前的NIS中做類似的工作。為了改變伺服器主機上的口令,它透過RPC聯絡那個主機上的 yppasswdd後臺程式,並向它提供更新過的口令資訊。通常,你透過象這樣做在常規程式上安裝yppasswd:

# cd /bin

# mv passwd passwd.old

# ln yppasswd passwd

與此同時你必須在伺服器上安裝rpc.yppasswdd並從rc.inet2中啟動它。這將對你的使用者有效地隱藏NIS所帶來的任何扭曲。

10.8 使用支援影子(shadow)的NIS

至今還沒有對使用影子登入程式組的站點的NIS支援。John F. Haugh,影子程式組的作者,最近往comp.sources.misc釋出了一個受GNU庫的GPL保護的影子庫函式的一個版本。它對NIS已經有了一些支援,但還不完整,並且這些函式還沒有加入到標準C庫中。另一方面來講,透過NIS之類公佈來自於/etc/shadow中的資訊是與shadow元件的目的相違背的。

儘管NYS口令查詢函式不使用shadow.byname map或任何這類map,NYS還是支援透明地使用一個本地/etc/shadow檔案的。當getpwnam的NYS實現被呼叫來查詢與給定的登入名相關的資訊時,nsswitch.conf中的passwd條目所指定的設施被檢索。nis服務將簡單地在NIS伺服器的passwd.byname map中查詢這個名字。而files服務將檢查/etc/shadow是否存在,並且如果存在的話,就試著開啟它。如果不存在的話,或者如果使用者沒有 root特權的話,它就返回到只在/etc/passwd中查詢使用者資訊的傳統的處理方法中。然而,如果shadow檔案存在,並且能被開啟的話,NYS 將從shadow中抽取使用者的口令。getpwuid 函式也是這樣實現的。在這種方式下,用NYS編譯的執行檔案將透明地處理本地影子元件的安裝。

10.9 使用傳統的NIS程式碼

如果你使用目前在標準C庫中的客戶程式碼的話,那麼配置一個NIS客戶就稍微有些不同。一方面,它使用一個ypbind後臺程式(daemon)來廣播查詢執行著的伺服器而不是從一個配置檔案中取得(伺服器)資訊的。因此,你必須確信在啟動期間開始執行ypbind。它必須在NIS域已被設定好並且RPC portmapper已啟動後才被呼叫。此時,上面所示的呼叫ypcat進行對伺服器測試才能工作。

最近,有許多有關NIS出錯報告(bug reports),出錯資訊說“clntudp_create: RPC: portmapper failure – RPC: unable to receive”。這是由於對ypbind與庫函式有關繫結資訊的通訊(溝通)方式的不相容的改動。取得最新有關NIS工具的最新源程式並重新編譯之可以解決這個問題。[5]

同樣,傳統的NIS確定是否要和如何將NIS資訊與本地檔案中的資訊合併的方法與NYS中所使用的方法是有偏差的。例如,為了使用NIS口令maps,你必須在/etc/passwd map中包含下列行:

+:*:O:O:::

這標記出口令查詢函式“插入”NIS maps的地方。往/etc/group中插入類似的一行(去掉最後兩個冒號)會對group.* maps做出同樣的事。為了使用NIS分發的hosts.* maps,只要改動host.conf檔案中的order一行。例如,如果你要使用NIS、DNS以及/etc/hosts檔案(以這個順序),你必須將這行改成

order yp bind hosts

目前,傳統的NIS實現不支援任何其它的maps。

註釋

[1] 可以用swen@uni-paderborn.de與他聯絡。NIS客戶程式以yp-linux.tar.gz的形式在matlab.unc.edu上的system/Network中有。

[2] 當前的版本(在寫作本書時)是yps-0.21並且可以從ftp.lysator.liu.se的/pub/NYS目錄中取得。

[3] 可以用pen@lysator.liu.se與他聯絡。

[4] DBM是一個簡單的資料庫管理庫,它使用雜湊技術(hashing technigues)來加速查詢操作。GNU計劃有它的一個免費實現,稱為gdbm,它已包括在大多數Linux發行版中。

[5] 可以從ftp.uni-paderborn.de的/pub/Linux/LOCAL目錄中取得yp-linux源程式

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-945198/,如需轉載,請註明出處,否則將追究法律責任。

相關文章