使用NIS和NFS管理UNIX網(wǎng)絡(luò)
我想大多數(shù)的UNIX網(wǎng)絡(luò)管理員或多或少的都有過類似于這樣的麻煩:一個用戶要在多臺不同的UNIX系統(tǒng)上工作,要在不同的UNIX上登錄,保存他們的文檔等,而管理員就要在每一臺UNIX系統(tǒng)上為他建立帳號,設(shè)置密碼,設(shè)置組信息,建立目錄,以便他能在所有的機(jī)器上正常工作。同時還要建立一臺FTP服務(wù)器,每次用戶必須將它的文件保存在這臺FTP服務(wù)器上,然后當(dāng)他登錄到另外一臺UNIX系統(tǒng)上的時候再從FTP服務(wù)器上取回他所需要的文件。這樣不但麻煩,而且管理起來非常不便,因?yàn)橐坏┠程炷硞€員工離職了,管理就要到每一臺UNIX系統(tǒng)上去刪除他的帳號和文件,來保證他不能在那些機(jī)器上登錄。而且對于一些系統(tǒng)信息的管理也非常不便,比如每臺機(jī)器上的hosts文件,你必須要在每臺機(jī)器上建立一份相同hosts文件,以保證所有的機(jī)器的機(jī)器名和IP地址的對應(yīng)都是正確的??梢坏程煊心呐_機(jī)器需要更改IP地址,這時管理員又只有為每一臺UNIX機(jī)器更改它的hosts文件。
從上面的這些問題我們可以看到其實(shí)我們所更改的這些東西大部分都是完全相同的,相同的帳號,相同的目錄和相同的hosts文件,如果機(jī)器少還沒有什么,一旦你管理的機(jī)器超過200臺,那么可能你這一整天的時間都會花在做這些重復(fù)的事上面。
也許你要問,那么那些大網(wǎng)絡(luò)的UNIX管理員們是使用什么方法來解決這些問題的呢?當(dāng)然他們不可能是為每一臺機(jī)器更改這些設(shè)置,他們使用的就是今天我們要介紹的NIS和NFS服務(wù)。
下面我們就向你介紹在FreeBSD中建立NIS和NFS服務(wù)的思路及方法。
(注:下面為我們的實(shí)驗(yàn)環(huán)境)
cat.mydomain.nis OpenBSD3.3 NIS和NFS客戶端
dog.mydomain.nis FreeBSD4.8 NIS主服務(wù)器和NFS服務(wù)器 (保存網(wǎng)絡(luò)中所有用戶的帳號信息,組信息和用戶文件)
bee.mydomain.nis FreeBSD4.5 NIS輔服務(wù)器
1、使用NIS共享系統(tǒng)信息
NIS是Sun Microsystem開發(fā)的用于在UNIX系統(tǒng)間共享用戶數(shù)據(jù)、組數(shù)據(jù)、主機(jī)數(shù)據(jù)、協(xié)議等數(shù)據(jù)的服務(wù)系統(tǒng),它最早被命名為Yello Page,后來由于商標(biāo)沖突被Sun重新命名為NIS,但很是有很多地方以YP來稱乎它。由于NIS的出現(xiàn)對UNIX網(wǎng)絡(luò)管理起到很大的推進(jìn),所以現(xiàn)在幾乎所有的UNIX系統(tǒng)都對它提供了支持。當(dāng)然FreeBSD系統(tǒng)也不例外,F(xiàn)reeBSD當(dāng)前提供的主要是NIS v2,同時也提供了對NIS v1的兼容支持。
我們可以看到,如果一個用戶要在多臺UNIX系統(tǒng)上工作,他們大都使用相同的用戶名、屬于相同的組、使用相同的密碼。那么我們可以將這些信息存放在一臺機(jī)器上來統(tǒng)一進(jìn)行管理,其它機(jī)器都從這臺機(jī)器上來獲得這些信息,一但要更改某個用戶的信息,管理員就只需要在存放這些信息的機(jī)器上進(jìn)行更改,其它機(jī)器就自動的收到更改后的信息,而不再需要管理員一一的進(jìn)行設(shè)置了,這就是NIS工作的基本方式。
NIS使用域來管理那些需要共享的信息,這些信息就夠成了NIS數(shù)據(jù)庫,所有擁有相同域名的機(jī)器就可以共同使用所在域名的數(shù)據(jù)庫。這些數(shù)據(jù)庫被存放在一臺機(jī)器上,這臺機(jī)器就是NIS的主服務(wù)器,其它機(jī)器就都通過它來查詢NIS數(shù)據(jù)庫,但有時為了穩(wěn)定性的考慮,也可以建立一臺或多臺NIS輔服務(wù)器,它們保持與NIS主服務(wù)器的數(shù)據(jù)同步,當(dāng)主服務(wù)器出現(xiàn)故障時承擔(dān)主服務(wù)器的任務(wù)。
下面就讓我們來看看,如何在FreeBSD中建立NIS主服務(wù)器。
首先,因?yàn)镹IS是基于域來管理的,所以就要為服務(wù)器設(shè)定域名,你可以通過domainname來查看你現(xiàn)在的域名(注意:這里的域名與DNS的域名沒有任何關(guān)系,它只起來將一個網(wǎng)絡(luò)劃分為幾個部分的作用,因而它可以為任何值,當(dāng)然你也可以將它設(shè)置成你的DNS域名):
dog# domainname
mydomain.nis如果上面顯示為空,則表明你還沒有設(shè)置你的域名,你同樣可以通過domainname來設(shè)置和更改你的域名:
dog# domainname mydomain.nis域名設(shè)置好以后,就開始進(jìn)入后面的工作。
默認(rèn)情況下,F(xiàn)reeBSD將每個域的NIS數(shù)據(jù)庫存放在/var/yp/yourdomainname下面,你需要將你要共享的信息如master.passwd復(fù)制到/var/yp下面,這里需要提醒的是,因?yàn)镕reeBSD默認(rèn)使用MD5來加密用戶口令,因而,如果你是在一個有多種UNIX系統(tǒng)的網(wǎng)絡(luò)中,而且某些UNIX不支持MD5加密的話,你就需要更改你的密碼加密方式為這些UNIX都支持的加密方法(如DES),否則用戶將無法在那些機(jī)器上登錄。
更改FreeBSD默認(rèn)加密方式的方法如下:
dog# vi /etc/login.conf然后編輯用戶所在的類(通過如果沒有指定的話就是default類),在其后加入:passwd_format=des:\(其中des代表DES加密,md5代表MD5加密,blf代表Blowfish加密),例如:
default:\
:passwd_format=des:\
:datasize=infinity:\
...保存退出后,需要使用使用cap_mkdb來生成BD(Berkeley Database)格式的數(shù)據(jù)庫文件:
dog# cap_mkdb /etc/login.conf這樣便會在/etc目錄下更新(或生成)login.conf.db文件。
現(xiàn)在我們只是更改了密碼的默認(rèn)加密方式,而真正的密碼還沒有改變,因而需要使用passwd命令來更改每一個需要共享出來的用戶的口令,然后將master.passwd復(fù)制到/var/yp目錄下,為了安全應(yīng)該更改一下master.passwd文件的權(quán)限:
dog# cp /etc/master.passwd /var/yp/master.passwd
dog# chmod 0600 /var/yp/master.passwd同樣考慮到安全的因素,最好刪除那些你不需要和不應(yīng)該共享的用戶(比如:root用戶和系統(tǒng)默認(rèn)用戶bin,daemon等)
現(xiàn)在我們就可以初始化我們的NIS主服務(wù)器了,初始化使用ypinit(8)命令:
dog# cd /var/yp
dog# ypinit -m mydomain.nis這里-m表示生成主服務(wù)器,而mydomain.nis是你的域名。
在初始化過程中,你會被提及一些問題:
Do you want this procedure to quit on non-fatal errors? [y/n: n] 直接選擇n然后就是設(shè)置NIS服務(wù)器的名字,包括主服務(wù)器和輔服務(wù)器,因?yàn)檫@里我們只有一臺主服務(wù)器,因而直接按Ctrl-D退出,如果你打算再建幾臺輔服務(wù)器的的話就輸你的NIS輔服務(wù)器的名字。然后會顯示你的服務(wù)器信息:
The current list of NIS servers looks like this:
dog.mattcell.com
Is this correct? [y/n: y] 如果沒有錯誤的話,就選擇y
接下來就開始進(jìn)入初始化過程,這個過程中會產(chǎn)生一些出錯信息,不過不用理它,這是因?yàn)槟愕腘IS服務(wù)進(jìn)程(ypserv)還沒有啟動的原因造成的。完成后會提示:
dog.mattcell.com has been setup as an YP master server without any errors.這表示你的NIS主服務(wù)器已經(jīng)初化完成。
現(xiàn)在要需要啟動我們的NIS守護(hù)進(jìn)程:ypserv(8)了,因?yàn)閥pserv使用了RPC服務(wù),所以需要先運(yùn)行portmap(8)來使用它的RPC服務(wù),同時如果用戶需要在客戶機(jī)上更改密碼的話,我們就需要在NIS服務(wù)器上運(yùn)行rpc.yppasswdd(8)守護(hù)進(jìn)程:
dog# portmap
dog# ypserv
dog# rpc.yppasswdd為了讓這些命令在系統(tǒng)啟動的時候就自動啟動,這需要在/etc/rc.conf中加入以下設(shè)置:
portmap_enable="YES"
nisdomainname="mydomain.nis"
nis_server_enable="YES"
nis_yppasswdd_enable="YES"現(xiàn)在我們的NIS主服務(wù)器就已經(jīng)跑起來了,你可以通過以下命令來測試它的工作情況:
dog# ypbind 啟動NIS客戶端支持程序
dog# ypcat passwd 查詢NIS服務(wù)器上的/etc/passwd信息
dog# ypcat master.passwd 查詢NIS服務(wù)器上的/etc/master.passwd信息
dog# ypcat group 查詢NIS服務(wù)器上的/etc/group信息
dog# ypcat hosts 查詢NIS服務(wù)器上的/etc/hosts信息
dog# ypcat networks 查詢NIS服務(wù)器上的/etc/networks信息
dog# ypcat netgroup 查詢NIS服務(wù)器上的/etc/netgroup信息
dog# ypcat services 查詢NIS服務(wù)器上的/etc/services信息
dog# ypcat protocols 查詢NIS服務(wù)器上的/etc/protocols信息
dog# ypcat ypservers 查詢NIS服務(wù)器信息
dog# killall -9 ypbind 關(guān)閉NIS客戶端支持程序下面我們來看看如何從客戶端共享這些信息。
首先要保證客戶端的NIS域名與NIS服務(wù)器的域名要一致。因?yàn)樵诳蛻舳艘獙IS服務(wù)器上的信息進(jìn)行查詢,所以需要在客戶端啟動一個守護(hù)進(jìn)程ypbind(8)來提供對NIS的支持,同樣,ypbind也使用RPC服務(wù),所以需要在運(yùn)行它之前運(yùn)行portmap(8)進(jìn)程:
cat# domainname mydomain.nis
cat# portmap
cat# ypbind這里cat這臺機(jī)器就會向網(wǎng)絡(luò)上發(fā)出一個廣播,來尋找NIS主服務(wù)器。同樣,你也可以將這些信息加入rc.conf中讓它們自動運(yùn)行:
nisdomainname="mydomain.nis"
portmap_enable="YES"
nis_client_enable="YES"
nis_client_flags="-S mydomain.nis, dog.mydomain.nis, bee.mydomain.nis"這里nis_client_flags是設(shè)置NIS域名為mydomain.nis,以及設(shè)置NIS服務(wù)器列表:dog.mydomain.nis, bee.domain.nis,這樣對那些遠(yuǎn)程的用戶有幫助,因?yàn)檫@種情況下如果依靠ypbind使用廣播來查找服務(wù)器的話比較困難。
下面就需要設(shè)置系統(tǒng)使用NIS來接受用戶信息,這需要在/etc/master.passwd的最后加入:
+:::::::::這樣,如果一個用戶在該臺機(jī)器(cat.mydomain.nis)這臺機(jī)器上登錄,login將先查找本地是否有該用戶的帳號信息,如果有就使用本地信息,如果沒有的話就通過NIS來獲取。
同樣的方法,如果要共享group信息,就需要在/etc/group最后一行加入:
+:*::也可以共享NIS服務(wù)器上的hosts信息,這需要在/etc/host.conf中增加nis查詢選項(xiàng):
# $FreeBSD: src/etc/host.conf
# First try the /etc/hosts file
hosts
# Second use YP/NIS
nis
# Now try the DNS
bind這樣當(dāng)你試圖查詢一臺機(jī)器的IP地址的時候,系統(tǒng)將先在/etc/hosts中尋找相就的記錄,如果沒有找到就通過NIS來查詢NIS主服務(wù)器上的hosts文件,如果還沒有找到就使用DNS來查找。
(注意:/etc/host.conf在FreeBSD5.0之后已經(jīng)使用/etc/nsswitch.conf來代替了)
現(xiàn)在你就可以使用dog.mydomain.nis服務(wù)器上的帳號來登錄cat.mydomain.nis這臺機(jī)器了:
FreeBSD (i386)
Login: matthew
Passwd:注意,因?yàn)槲覀冊赾at.mydomain.nis上沒有為matthew這個用戶建立HOME目錄,所以這時會提示沒有找到HOME目錄,不必理會它,因?yàn)槲覀儗⒃诤竺娼鉀Q這個問題。
如果在客戶端想更改你在NIS服務(wù)器上的口令,你可以使用yppasswd(1)來更改(需要服務(wù)器上運(yùn)行rpc.yppasswdd守護(hù)進(jìn)程):
matthew@cat$ yppasswd
Changing NIS passwd for matthew on dog.mydomain.nis.
Old Password:
New Password:
Retype new passwd: NIS password has been changed on dog.mydomain.nis.
下面讓我們來看看如何改新NIS服務(wù)器上的NIS數(shù)據(jù)庫
如果我們更改了NIS服務(wù)器上的某些數(shù)據(jù)(如:增加了用戶,增加了組等。注意:更改了master.passwd后必須將/etc/master.passwd再次復(fù)制到/var/yp目錄下,將刪除不必要的用戶)后,NIS客戶端并不能立即使用更改的數(shù)據(jù),因?yàn)镹IS數(shù)據(jù)庫是存放在/var/yp/yourdomainname下面的,所以我們需要更新NIS數(shù)據(jù)庫:
dog# cd /var/yp
dog# make這時make就會根據(jù)Makefile自動更新NIS數(shù)據(jù)庫,注意,因?yàn)镹IS數(shù)據(jù)庫是實(shí)時查詢,所以我們不需要重新啟動ypserv守護(hù)進(jìn)程。
建立NIS輔服務(wù)器
如果你擔(dān)心你的NIS主服務(wù)器工作會為穩(wěn)定而造成用戶無法登錄,那么你可以再建立一臺或數(shù)臺NIS輔服務(wù)器,它的建立方法就比較簡單了。
首先還是進(jìn)行初始化,不過因?yàn)樗腘IS數(shù)據(jù)庫直接從主服務(wù)器上取得,所以就直接在你要作為輔服務(wù)器的機(jī)器上執(zhí)行:
bee# cd /var/yp
bee# ypinit -s dog.mydomain.ns mydomain.nis其中-s指定NIS主服務(wù)器的名字,后面的mydomain.nis表示要初始化的NIS域名(即輔服務(wù)器的NIS域名)。
然后再修改輔服務(wù)器上的/etc/rc.conf以便NIS服務(wù)能夠自動運(yùn)行,同時為了當(dāng)主服務(wù)器上的數(shù)據(jù)在發(fā)生變更的時候,輔服務(wù)器能夠自動保持同步,就需要啟動NIS同步進(jìn)程rpc.ypxfrd:
portmap_enable="YES"
nisdomainname="mydomain.nis"
nis_server_enable="YES"
nis_yppasswd_enable="YES"
nis_ypxfrd_enable="YES"
同時為了支持同步數(shù)據(jù)傳送,需要在主服務(wù)器上更改一點(diǎn)設(shè)置,因?yàn)橹鞣?wù)器默認(rèn)情況下的設(shè)置只考慮了一臺NIS服務(wù)器的情況。
我們需要將/var/yp/Makefile中的NOPUSH = "True"注釋掉:
# NOPUSH = "True"
如果你在之前初始化主服務(wù)器的時候沒有準(zhǔn)備安裝輔服務(wù)器,所以沒有輸入輔服務(wù)器的名字,而你現(xiàn)在又要使用輔服務(wù)器,那么你可以通過以下方法來增加你的輔服務(wù)器:
dog# cd /var/yp
dog# vi ypservers加入你的輔服務(wù)器名,這里我們的輔服務(wù)器名為bee.mydomain.nis:
dog.mydomain.nis dog.mydomain.nis
bee.mydomain.nis bee.mydomain.nis現(xiàn)在你的輔服務(wù)器在每次主服務(wù)器更新之后就會自動保證數(shù)據(jù)同步了。
NIS的高級設(shè)置
上面的例子中,我們是允許所有的NIS主服務(wù)器上的用戶在NIS客戶端(這時為cat)上登錄,那么我們可不可以只允許某些用戶登錄,或者不允許某些用戶呢?
答案是肯定的,當(dāng)我們要允許某個用戶登錄的時候,可以在master.passwd中加入如下內(nèi)容:
+matthew:::::::::這表示允許(+)NIS服務(wù)器上的matthew在這臺機(jī)器上登錄,如果+號后面沒有指定用戶名的話系統(tǒng)就默認(rèn)允許所有的用戶登錄,這就是我們上面的那種情況。
如果要禁止某個用戶登錄:
-badman:::::::::這就表示禁止(-)NIS服務(wù)器上的badman在這臺機(jī)器上登錄,注意,因?yàn)橄到y(tǒng)處理master.passwd的時候是從第一行開始匹配的,一但某行匹配了,就不是對后面的行進(jìn)行處理了,所以如果你要禁止某些用戶登錄而允許其它所有的用戶登錄就一定要將-user:::::::::寫在+:::::::::之前,否則該用戶還是可以登錄系統(tǒng):
-badman:::::::::
-hacker:::::::::
+:::::::::上面的設(shè)置就使得除NIS服務(wù)器上的badman和hacker不能在這些機(jī)器登錄外,其它的用戶都可以登錄。
還有一鐘情況就是,我只允許某些用戶登錄我的系統(tǒng),不允許其它用戶登錄,但又要保證用戶信息與NIS服務(wù)器上的服務(wù)信息一至,以便使用id等使用的時候能正確的顯示出用戶的用戶名和組名,這也可以使用以下方法來實(shí)現(xiàn),在客戶機(jī)的/etc/master.passwd后面加入:
+matthew:::::::::
+guest::::::::/home/ftp:
+:::::::::/sbin/nologin上面的設(shè)置使得matthew可以在這臺機(jī)器上登錄,guest也可以登錄,但其HOME目錄將被到/home/ftp下,而其它用戶的shell都被改成/sbin/nologin,所以其它用戶都不能登錄,但同時又使得這些用戶的信息可以與NIS服務(wù)器同步。
#p#
2、使用NFS共享目錄
NFS同樣是由Sun Microsystem開發(fā)一用于UNIX系統(tǒng)之間共享文件的網(wǎng)絡(luò)服務(wù)系統(tǒng),與NIS一樣,它也得到大多數(shù)的UNIX系統(tǒng)的支持。
在文章最開始的時候,我們提到用戶需要每次都從FTP下載文件的問題,現(xiàn)在我們就可以用NFS來解決這個問題了,我們可以將某臺機(jī)器的某個文件(文件夾)共享出來供其它機(jī)器使用。
在上面講NIS的時候我們注意到,當(dāng)我們使用NIS主服務(wù)器上的用戶登錄到其它UNIX機(jī)器的時候會被提示找不到用戶的HOME目錄,那么我們就利用NFS來將NIS主服務(wù)器上的/home目錄共享出來,然后在每個UNIX客戶端將其mount到本機(jī)的/home上,這樣就可以解決找不到用戶HOME目錄問題了,并且無論用戶在哪臺機(jī)器登錄,都可以直接進(jìn)入自己的工作環(huán)境,使用自己的文件。
下面就讓我們來實(shí)施具體的工作。
首先根man nfsd我們可以知道nfsd(8)只是處理NFS協(xié)議,真正的遠(yuǎn)程mount(共享)功能是由mountd(8)來完成的,而mountd是通過/etc/exports來設(shè)置共享目錄的。exports(5)里的每一行表示第一個共享設(shè)置,第一行中都有以下三個部分:
第一部分是設(shè)置要共享出去的目錄或目錄列表,當(dāng)要共享多個目錄的時候使用空格分隔每個目錄。
第二部分是共享參數(shù),比如設(shè)置只讀共享,對帳號的映射等。
第三部分是設(shè)置可以訪問該共享的主機(jī)或主機(jī)列表,多個主機(jī)使用空格分隔。
我們就以共享NIS服務(wù)器(dog.mydomain.nis)上的/home目錄為例,向大家說明exports的配制方法:
dog# cat /etc/exports
/home -maproot=daemon -network 192.168.7.0 -mask 255.255.255.0其中/home為我們要共享出來的目錄,-maproot=daemon是共享參數(shù),表示當(dāng)本地UNIX系統(tǒng)使用遠(yuǎn)程的/home目錄時,將本地的root帳號的uid映射為遠(yuǎn)程機(jī)器上的daemon,gid映射為空,也就是說當(dāng)我們以root身份訪問dog上的/home目錄時,我們的身份會被轉(zhuǎn)換成遠(yuǎn)程主機(jī)dog上的daemon的身份。后面的-netmask=192.168.7.0 -mask=255.255.255.0設(shè)置可能訪問該些共享資源的主機(jī)為192.168.7.0/255.255.255.0這個子網(wǎng)內(nèi)的所有機(jī)器。
還有很多共享參數(shù)可以設(shè)置,比較有用的有:-mapall=將所有的本地帳號映射為遠(yuǎn)程主機(jī)上的某個指定帳號,-ro以只讀共享該文件夾(默認(rèn)為可讀寫)其它參數(shù)你可以通過man exports得到,這里就一一列舉了。
現(xiàn)在我們的共享資源已經(jīng)通過/etc/exports設(shè)置好了,接下來就是啟動NFS守戶進(jìn)程nfsd和遠(yuǎn)程共享進(jìn)程mountd了,由于NFS同NIS一樣也使用RPC,所以要在啟動NFS之前行啟動portmap進(jìn)程:
dog# portmap 如果已經(jīng)啟動就不再需要這一步了
dog# nfsd -n 5
dog# mountd
其中nfsd -n 5中的-n參數(shù)是指定同時建立多少個服務(wù)副本,可能選擇4-6,這有助于提供NFS系統(tǒng)性能,但也不過太高,否則會占用大量資源?,F(xiàn)在NFS就已經(jīng)啟動成功了,你可以通過showmount(8)來查詢你的共享資源:
dog# showmount -e localhost
/home 192.168.7.0這表明我們的NFS服務(wù)器已經(jīng)正確啟動了,接下來就要在客戶端設(shè)置了。
在客戶端我們使用mount_nfs來將遠(yuǎn)程主機(jī)共享的目錄mount到本地上,因?yàn)樵诒纠形覀兪窍M麑⑦h(yuǎn)程主機(jī)(dog)上的/home目錄mount到客戶端(cat)的/home目錄以保證系統(tǒng)用戶的數(shù)據(jù)同步,所以我們進(jìn)行以下操作:
cat# mount_nfs dog:/home /home現(xiàn)在遠(yuǎn)程的共享目錄/home就已經(jīng)mount到本地的/home目錄中了,我們可以看到mount_nfs與其它mount命令不同,它不是使用設(shè)備名(如/dev/ad0s1)而是使用hostname:/sharedir的方式來表示mount源,其中hostname是遠(yuǎn)程主機(jī)的主機(jī)名或IP地址。
現(xiàn)在我們再次使用matthew這個帳號(該帳號在NIS服務(wù)器dog.mydomain.nis上存在),在cat.mydomain.nis登錄:
FreeBSD (i386)
Login: matthew
Passwd:
matthew $ pwd
/home/matthew現(xiàn)在我們可以看到,我們在dog這臺機(jī)器上的文件,現(xiàn)在在cat上全部可以看到了,當(dāng)然以前的那個找不到用戶HOME目錄的錯誤信息現(xiàn)在也沒有了。
可以看到,通過NIS和NFS可以使管理員管理UNIX網(wǎng)絡(luò)中的用戶帳號等信息非常方便,因?yàn)樗械男薷亩贾恍枰谝慌_機(jī)器上進(jìn)行,而其它機(jī)器自動的就會改變。同時對用戶來說,他們可以只使用一個帳號而在任何一臺主機(jī)上登錄,而且不用再使用麻煩的FTP在不同的主機(jī)間傳遞文件,用戶在每臺機(jī)器上的文件都會自動保持更新。
【編輯推薦】