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