NFS 和 NIS


使用 Telnet 與其限制

當您的 Linux 主機安裝好之後﹐有一個服務您不需做任何設定就可以使用的了﹐它就是 telnet 啦。使用 telnet ﹐有點像“網路基礎”中的“Telecommunication”那裡所說的 remote control ﹐也就是﹐您可以利用其他機器鍵盤和熒幕遠端使用 Linux 主機。如果您使用 Windows 98 連接 Linux 的話﹕
按 ‘開始’--> ‘執行’--> 然後輸入﹕ telnet 192.168.0.17 (如果 dns 或 hosts 檔案設定好了﹐可以輸入機器名稱)
您就會看到一個登錄畫面了﹐不過﹐先別急著輸入您的大名和密碼﹐做做下面的動作﹕

  1. 連線 --> 中斷
  2. 連線 --> 遠端系統 --> Term Type:
  3. 選擇 DEC-VT100
  4. 按‘連線’
然後再進行登錄不遲。為什麼這樣做﹖我也不知道啦﹐本來我用以前的 Redhat 好好的﹐但後來換了 Redhat 6.0 之後﹐只要進入 vi 等文書編輯器﹐方向鍵就不聽使喚了﹐只有做了上面動作才可以。後來發現﹐要在 /etc/bashrc 檔案裡面加下面這一行就解決了﹕
export TERM=vt100

使用 Telnet 之後﹐您就無需再要在熒幕和鍵盤之間跑來跑去了。不過﹐通過 Telnet 連接﹐所使用的檔案系統都是遠端系統﹐如果您要將資料回存在本地電腦上面就不那麼方便了。您有否想過將遠端的資料 mount 進本地的檔案系統中呢﹖那麼﹐NFS(Network File System) 就可以幫到你了。

另外﹐使用 telnet 的時候﹐您有否發覺到一個麻煩﹕現在的 telnet 已經禁止使用 root 進行登錄了﹐您如果要使用到 root 的權限﹐您得使用其他帳號登錄﹐然後用 su 切換到 root 的身份去。這樣﹐在使用 telnet 之前﹐您就必須為每一個使用者在每一台Linux機器上建立獨立的帳號。您是否希望好像 NT 那樣有一個中央的 DOMAIN 登錄資料庫呢﹖有此念頭完全正確﹐而好消息是﹐您也可以在 Linux 上面使用 NIS (Network Information Service) 來做到﹗

我們只需指定某一台 Linux 機器做 NIS 伺服器﹐而其他則可以做為 NIS 客戶使用。如果您的網路較大﹐也可以考慮安裝 Slave NIS 伺服器來分擔 Master NIS 的工作。這裡我只說說 NIS Server 和 Client 的設定﹐Slave NIS 則留給您自己去研究了。

設定NFS

要設定 NFS﹐關鍵是在 server 那端﹕/etc/exports 這個檔案。在下建議您先輸入﹕
man exports

看一下如何設定這個檔案。如果這個檔案設定錯誤了﹐以後重新開機的時候您可等得非常不耐煩了。下面是我這裡的設定﹕
/tmp (rw,no_root_squash)
/home/public/sw *.siyongc.domain(ro,insecure)
/home/public/upload 192.168.0.22(rw,all_squash,anonuid=2043,anongid=2044)

這裡﹐您可以看到我將 /tmp 這個目錄完全分享出去了﹕在括號裡面的‘rw’就是 Read&Write 的意思﹐而‘no_root_squash’呢﹐則是允許讓使用者具備 root 的權限﹐在某些特殊情況下﹐例如使用 bootp 登錄的無磁碟工作站﹐是相當好用的。因為預設情況下 NFS 會將 root 的身份 squash 為權限較低的 anonymous (nobody) 身份﹐而其它身份則以 client 端機器上當時擁有的 User ID 和 Group ID 來建立檔案。

第二行﹐我將 /home/public/sw 這個目錄分享給以 siyongc.domain 這個 domain 做結尾的所有機器﹐而無需使用 secure port (insecure)﹐但只具備唯讀權限(ro)。

第三行﹐我將 /home/public/upload 這個目錄只分享給 192.168.0.22 這台機器﹐且具備了讀和寫的權限(rw)﹐但在 server 上寫入的檔案﹐必須換成 anonymous 身份進行。但是其後的設定又將所有 anonymous 換成設定的 UID 和 GID﹐這樣的安排是要確定所有寫入都按指定身份進行。

如果您不知道或不想直接修改 /etc/exports 檔案﹐您可以使用 netconf 然後選擇‘Exported file system (NFS)’來進行設定。

然後﹐就是重新啟動 nfsd ﹕
/etc/rc.d/init.d/nfs restart

測試 NFS

一但 server 設定好了﹐您只需在 client 端輸入﹕
mount -t nfs redhat52:/tmp /mnt

就可以將伺服器端的分享目錄 mount 進自己的機器了。

通常最常見的錯誤信息是:
mount: redhat52:/tmp, reason given by server: Permission denied 

造成這樣的原因多數是因為 /etc/exports 檔案沒設定好﹐也就是在分享目錄後面的“( )”裡面的權限設定﹐建議從簡單的設定測試起。或是從 /var/log/messages 這個檔案找找原因﹐檢查一下被拒絕的原因﹐例如可能會發現客戶主機的名稱不怎麼對﹐那您就必須要確定 client 的機器名稱已經在 /etc/hosts 被“正確”的建立起來﹐或者能夠通過 DNS 查詢得到(包括正反兩解)。

在我的實踐中﹐‘link_relative’有時候會造成‘Unknown keyword’﹐這樣會引至 nfsd 無法正常啟動。所以當你修改過 NFS 設定﹐最好用下面的 script 來確定 nfsd 能夠正常啟動才好關機﹕
/etc/rc.d/init.d/nfs stop
/etc/rc.d/init.d/nfs start

確定沒有 failure 信息才好繼續。切記﹗

如果您碰到 rpc 相關的錯誤信息﹐可能是您的 portmap 問題了﹐您可以試試將之重新啟動:
/etc/rc.d/init.d/portmap restart

不過﹐執行之後﹐請重新啟動 nfsd ﹐以及其它所有和 portmap 相關的服務(因為它們會因為 portmap 重啟而失效。

另外﹐當您升級 server 的 kernal 之後﹐最好也將 client 的 kernal 一起同步。否則您會遇到 mount version 的警告﹐儘管﹐您還是可以成功的實現 nfs mount 。

有時候﹐您或許會突發興致給電腦改改名稱或轉換 domain﹐這樣也容易造成 NFS 在啟動的時候延遲﹐而且是延遲非常厲害的那種﹗ 造成這樣的問題可能有多方面的﹐如 hostsname 設定不正確﹐或 DNS 那裡有誤。不過﹐有一個地方您可以考慮的﹐就是把下面這個檔案內容清一下﹕
/var/lib/nfs/rmtab

如果還有問題﹐先熟讀一下 exports 的 man page (man exports)﹐更詳細的就請參考 NFS 的 HOWTO 文章。

設定NIS

首先﹐讓我們架設好中央的 NIS 伺服器吧。在設定之前﹐您必須確定網路工作正常。 (以下步驟是本人實踐之作﹐或許會有更好的方法的。如果您有更好的主意﹐歡迎告訴網中人。)

  1. 修改 /etc/inetd.conf﹐確定下兩行的註解(‘#’)給拿掉﹕
    time    stream  tcp     nowait  root    internal
    time    dgram   udp     wait    root    internal
    

  2. 重新啟動 inetd﹕
    /etc/rc.d/init.d/inet restart

  3. 修改 /var/yp/securenets﹐確定有這樣的敘述(請針對您的網路設定做適當修改)﹕
    # Always allow access for localhost
    255.0.0.0       127.0.0.0
    # This line gives access to everybody. PLEASE ADJUST!
    255.255.255.0   192.168.0.0
    

  4. 修改 /etc/ypserv.conf﹐或許會有這樣的敘述﹐(但不是很確定是否必須如此)﹕
    dns: no
    *             : passwd.byname    : port       : yes
    

  5. 然後輸入﹕
    rpcinfo -u localhost ypserv

    確定 YP server 是工作的﹐您應該會看到這樣的信息﹕
    program 100004 version 1 ready and waiting
    program 100004 version 2 ready and waiting
    

    如果您沒看到﹐那就執行﹕
    /etc/rc.d/init.d/ypserv start

    同時確定 setup --> System services -->
    [ * ] yppasswdd 和 [ * ] ypserv 。

    然後再重複 rpcinfo 確定服務正確的跑起來了。

  6. 建立這兩個檔案(如果它們不存在的話)﹕
    touch /etc/gshadow /etc/netgroup

  7. 設定 NIS 的domain name﹕
    /bin/nisdomainname chen

    最好起一個有別於目前 domain 的名字﹐這主要是出於安全考量。如果以後測試成功的話﹐您可以將這行加進 /etc/rc.d/rc.local 裡面﹔同時﹐在 /etc/sysconfig/network 檔案裡面修改這行﹕
    NISDOMAIN=chen
    

  8. 然後初始設定 NIS 服務﹕
    /usr/lib/yp/ypinit -m

    記住要用 Ctrl + D 來結束﹐不是用 Ctrl + C 哦﹐切記切記﹗

    留意一下有否錯誤﹐有則根據信息做適當修改﹐無則繼續。例如﹐如果它回應說 "No rule to mak target xxxxxx, needed by yyyyyyyy."﹐通常是在 /etc 下面找不到檔案而已﹐用 touch /etc/xxxxxxx 就可以解決之。

  9. 重新啟動 ypserver 和 yppasswdd﹕
    /etc/rc.d/init.d/ypserv restart
    /etc/rc.d/init.d/yppasswdd restart

然後是設定 NIS Client 。這裡是在 redhat62.siyongc.domain (192.168.0.22) 這台機器上面設定﹕
  1. 執行 netconf ﹐然後選擇 ‘Network Information System (NIS) 再按 Enter﹐進入後﹐設定好 NIS domain(如﹕chen﹐要和 server 那端一致)﹐和NIS server(如﹕redhat52.siyongc.domain﹐要確定該 server 在 /etc/hosts 裡面指定正確)。如果您的系統沒有 netconf 也不要緊﹐可以自己修改後面提到的檔案(如 /etc/yp.conf 和 /etc/sysconfig/network)。

  2. 接著執行﹕
    /bin/nisdomainname chen

  3. 然後修改 /etc/yp.conf﹐加進這行﹕
    domain chen 
    ypserver redhat52.siyongc.domain
    

  4. 然後執行 setup ﹐選擇‘System Services’﹐確定 [*]ypbind 被選擇了。

  5. 修改 /etc/passwd﹐在末尾加入﹕
    +﹕﹕﹕﹕﹕﹕
    

  6. 然後啟動 ypbind:
    ypbind
    (或者﹕/etc/rc.d/init.d/ypbind restart)

測試 NIS

在客戶端上面以 root 身份登錄之後﹐請輸入﹕
ypcat passwd

看看 server 端的帳號是否被列出來了。

您也可以執行﹕
getent passwd netman

這裡的‘netman’是在 NIS 伺服器上面的一個使用者帳號名稱﹐請改成您欲查詢的帳號。這個命令的作用是讓我們確定該帳號出現在 NIS 登錄之中。如果您看不到任何信息回應﹐那麼﹐好可能上面的步驟(包括伺服器和客戶端)還沒正確完成﹐您則需要找出原因所在。

如果您能得到信息回應﹐例如﹕
netman:x:1001:1001::/home/netman:/bin/bash

那是好消息﹗否則您得從頭進行 debug 方好繼續。

然後輸入﹕
yppasswd netman
Please enter root passwd:
Please enter new passwd:
Please retype password:
(#注意: 最後兩行是設定 netman 的 NIS password。最好和原來的密碼一致﹐因為原來的密碼也會被更改為 nis 的密碼。)

其實﹐上面這步不是必須的﹐如果您能夠從另外的機器用 NIS帳號登錄就可以略過此步驟。

接著請在本地主機上面建立起該使用者的家目錄﹕
mkdir /home/netman
chown netman:netman /home/netman

當然了﹐您也可以設定 Linux 在開機的時候通過 NFS 掛載到使用者原本的家目錄(tips﹕修改 /etc/fstab)。但如何做﹖您自己去嘗試吧﹐這裡暫時賣個關子。

如果該使用者需要使用到本機上面的郵件系統﹐也請為之建立信箱﹕
touch /var/spool/mail/netman
chown netman:mail /var/spool/mail/netman
chmod 660 /var/spool/mail/netman

這樣﹐您就可以使用 NIS 登錄了。

當您有新的使用者增加之後欲加入 NIS 中的話﹐您要先 cd /var/yp 然後執行 make 來更新 nis 資料。如果登錄失敗﹐重新啟動 yppasswdd 服務﹐然後用 yppasswd 來設定他/她的 NIS 密碼﹐但要注意一點﹕原使用者帳號必須已經設定過密碼﹐儘管此時可以取而代之為新的密碼。然而有趣的是﹐之後您再於原來主機上更改原帳號的密碼﹐卻不會影響 NIS 的哦。

如果還有問題﹐您要檢查一下 server 端的 ypserv 和 yppasswdd﹐以及 client 端的 ypbind 是否被啟動成功(tips﹕執行rpcinfo -p﹐尤其注意 yppasswdd)。其中﹐portmap 是一個很重要的服務(有些系統會顯示為 rpcbind)﹐在您執行 ypserv 和 yppasswdd 之前﹐要確定它已經被啟動了。如果您需要重啟 portmap ﹐要確定所有基於它的服務也要重新啟動。

同時留意一下 client 和 server 的 NIS domain name 是否一致。必要時﹐您或許要執行/usr/lib/yp/ypinit -m重新建立 ypserv 資料﹐但這樣您就需要重新執行 yppasswd 來設定使用者的 NIS 密碼了。

設定 NIS﹐在 server 端牽涉的檔案比較多﹐諸如 rpc、portmap、yp、nsswitch等等。您可以看一下關於 NIS 的HOWTO 文章﹐或相關的 manuals。

另有一篇和網友的討論文章﹐我也覺得蠻值得參考一下的。請點這裡閱讀。

 

 


© 2000 Netman 網中人
Last Updated: March 06, 2001