NFS服务

(文章内容比较繁琐,但都是很精炼的内容,有心人要仔细的去看,本内容部分来源于网络 盗版必究)

   

請先確定 nfs-utils 套件有裝起來(rpm -qa | grep nfs)﹐如果沒有﹐請用 rpm 安裝。假如需要在一開機的時候就啟動 nfs 服務的話﹐那就用 ntsysv 將 nfs 選起來吧。喜歡的話﹐把 nfslock 也一並開啟也無妨(請 man lockd)。

事實上﹐要設定 NFS 一點都不難﹐關鍵是 server 那端﹕/etc/exports 這個檔案。在真正動手設定之前﹐我建議您先看看它的 manual ﹕

man 5 exports

請小心設定這個檔﹐如果設定錯誤了﹐以後重新開機的時候您可就得非常不耐煩了。我是這樣設定﹕

/tmp *(rw,no_root_squash)/usr/src *.siyongc.domain(ro,insecure) 192.168.100.*(ro,insecure)/var/ftp/pub/incoming 192.168.100.24(rw,all_squash,anonuid=50,anongid=50)

第一行﹐我將 /tmp 這個目錄完全分享出去了﹐不管客戶端來自哪裡。在括號裡面的‘rw’就是 Read&Write 的意思﹐而‘no_root_squash’呢﹐則是允許讓使用者具備 root 的權限﹐在某些特殊情況下﹐例如使用 bootp 登錄的無磁碟工作站﹐是相當好用的。因為預設情況下 NFS 會將 root 的身份 squash 為權限最低的 anonymous (nobody) 身份﹐而其它身份則以 client 端機器上當時擁有的 User ID 和 Group ID (指號碼的值)來建立檔案。注意哦﹐在進權限判斷的時候﹐ 不是以 UserName 來作為身份依據哦﹐UID 和 GID 的號碼最後必須對應到 server 端的 /etc/passwd ﹐而非 client 那邊的。

第二行﹐我將 /usr/src 這個目錄分享給以 siyongc.domain 這個 domain 做結尾或是以 192.168.100 開頭的所有機器﹐而無需使用 secure port (insecure)﹐但只具備唯讀權限(ro)。這裡﹐您要留意 " * " 的使用﹐在一些舊版本的 NFS 您不能用在 IP 上。不過﹐我這裡的測試卻是可行的。

第三行﹐我將 /var/ftp/pub/incoming 這個目錄只分享給 192.168.0.22 這台機器﹐且具備了讀和寫的權限(rw)﹐但在 server 上寫入的檔案﹐必須換成 anonymous 身份進行。但是其後的設定又將所有 anonymous 換成設定的 UID 和 GID (這裡都是 ftp)﹐這樣的安排是要確定所有存取都按指定身份進行。這個 incoming 目錄預設是不存在的﹐日後在討論到 FTP 服務設定時候會提到﹐但您可以自行用 mkdir 建立﹐而且為 group 和 others 加上 +w 權限以及 sgid 和 sticky bit (3777)。

 

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

 

完成 exports 設定後﹐就是重新啟動 nfsd ﹕

service nfs stop 
service nfs start

哦﹐我不建議您用 restart 來進行﹐最好用 stop 和 start ﹐並且重複兩次﹐確定在第二次 stop 的時候﹐沒看到紅色的 [ FAILED ] 信息。因為我發現如果設定不正確﹐就算您執行 start ﹐也看到了四個 [ OK] ﹐但事實上未必真的成功跑起來﹐只能在 stop 的時候才能發現。另外一個原因是﹕如果設定錯誤﹐很可能導致 nfs 在啟動的時候要等非常久的時間﹐這是不勝其煩的﹐尤其在開機的時候。所以﹐當您每次修改完 nfs 的設定﹐一定要 stop 再 start 看看﹐沒問題才關機﹐否則下次開機可要培養耐性了。

 

Tips﹕如果您確定 /etc/exports 檔設定無誤﹐要重新讀取其設定﹐只需輸入如下命令就可以了﹕

 

exportfs -rv

假如有錯誤的話﹐應該會得到提示的。

 

為求確定﹐您最好執行﹕

showmount -e localhost

如果這個命令不能正確顯示您所 export 的內容﹐那就重新檢查設定步驟吧。

一但 server 設定好之後﹐您只需在 client 端建立 mount point﹐然後用 mount 命令來掛載即可。不過﹐mount 之前最好用 showmount 來確定一下﹕

showmount -e rh71

 

Tips﹕假如在 server 那邊 showmount -e localhost 有結果﹐而在 client 這邊 showmount -e server 卻不成功﹐那可能是防火牆或是 xinetd 的問題(參考後面的說明)。當然﹐前提是要確定連線是通的啦﹐ping 一下就知道了。

 

當 showmount 能順利找到 server 的 exports 之後﹐那就可以放心 mount 了﹕

mkdir /mnt/nfs 
mount -t nfs -o bg,soft,intr rh71:/tmp /mnt/nfs

然後﹐就好像自己的硬碟一樣使用~~ ^_^ 要卸載它﹐用 umount 命令就可以。不過﹐如果沒有那些 -o 參數﹐然後在卸載之前您將 server 的 nfs 關閉了﹐或是網路連線出了問題﹐這時候再進行 umount 的話﹐很可能將您的機器‘定格’在那裡哦﹗﹗小心小心~~~ 所以﹐最好在 mount 的時候加上 soft 參數﹐並且在關閉 nfs 伺服器端之前﹐一定要先將所有的 client 所掛載的 mount point 進行 umount 才好進行。

 

Tips﹕如果 client 機器在啟動的時候能連上網路﹐您還可以直接將掛載寫進 /etc/fstab 檔中呢﹗

 

如果您遇到問題﹐通常最常見的錯誤信息是﹕

mount: xxxxx:/yyyyyyyy, reason given by server: Permission denied

造成這樣的原因多數是 /etc/exports 檔案沒設定好的緣故﹐也就是在分享目錄後面的“( )”裡面的權限設定﹐建議從簡單的設定測試起﹐例如 "/tmp *(ro)"。或是從 /var/log/messages 這個檔案找找原因﹐檢查一下被拒絕的原因。

還有﹐您最好確定 client 和 server 的機器名稱已經在 /etc/hosts 被“正確”的設定起來﹐或者能夠通過 DNS 查詢得到(包括正反兩解)。

在我的實踐中﹐‘link_relative’有時候會造成‘Unknown keyword’﹐這樣會引至 nfsd 無法正常啟動﹐測試的時候請留意。

如果您碰到 rpc 相關的錯誤信息﹐例如﹕

mount: RPC: Unable to receive; errno = Connection refused

可能出現的問題很多﹐首先確定 portmap 服務是否有跑起來﹐可以用 rpcinfo 來檢查﹕

rpcinfo -p rh71
如果沒發現用 portmapper 的服務﹐您可以試試將之重新啟動﹕

service portmap restart

不過﹐執行之後﹐請重新啟動 nfs ﹐以及其它所有和 portmap 相關的服務(因為它們會因為 portmap 重啟而失效(最好用 rpcinfo 來確認)。

還有另外的情形﹐可能是 portmap (tcp & udp port 111) 的連線被防火牆擋掉了。或是 xinetd 那邊沒開放 portmap 服務﹐例如在 /etc/hosts.deny 中設定了 "ALL: ALL"﹐那您可以修改 /etc/hosts.allow ﹕

portmap: 192.168.100., .siyongc.domain

還有﹐就是可能 nfs 還沒起來﹐請確定服務能正確跑起來﹐可以用 stop 和 start 或是 rpcinfo 來判斷。

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

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

如果還有問題﹐先熟讀一下 exports 的 man page (man 5 exports)﹐