︿
Top

1、前言

NFS,Network File System,可以讓使用者透過網路來分享主機上的目錄和檔案,它的架構為 NFS Server 將目錄分享出來後,Client 端透過網路將 Server 端所分享出來的資源掛載 (Mount) 至本身檔案系統中,Client 端使用起來就像是本機的檔案系統一樣,簡單說就是 UNIX 間的網路芳鄰。


應用情境一、NFS 應用於 Ports Tree

Ports Tree 集中? 當有一堆機器需要更新 Ports Tree 時您可以只更新一台機器的 Ports Tree 即可,再利用 NFS 分享功能讓其它的 FreeBSD 當需要安裝套件時再 Mount 更新好的 Ports Tree 資料夾來使用 (Client 去把 Server 的 /usr/ports 掛載到自已的 /usr/ports),便能清鬆達到節省頻寬的目地。

應用情境二、NFS 應用於 Make World

Make World 分享? 當有一堆機器要升級時,您可只利用一台機器升級完成後再利用 NFS 分享功能讓其它需要升級的 FreeBSD 掛載您編譯好的系統程式及核心 (Client 去把 Server 的 /usr/src、/usr/obj 掛載到自已的 /usr/src、/usr/obj),便能清鬆達到節省頻寬及編譯時間的目地。

NFS 名詞了解

  • rpcbind:NFS Server 用來讓 Client 能正確 找到 NFS Server 所開放的 Port 以便溝通。(FreeBSD 4.x 使用 portmap)
  • nfsd:NFS Server 用來 接收 Client 所傳送過來的要求,再將請求丟給 Mountd 處理。
  • mountd:NFS Server 用來 處理 Client 連線請求。

了解 NFS Server 及 NFS Client 所需服務




文章目錄

1、前言
2、實作環境
3、NFS Server設定
          步驟1.設定要分享的目錄 (/etc/exports)
          步驟2.啟動 rpcbind 服務
          步驟3.啟動 nfsd 服務
          步驟4.啟動 mountd
          步驟5.設定開機自動啟動 (/etc/rc.conf)
4、NFS Clients 的設定
          步驟1.啟動 rpcbind
          步驟2.設定開機自動啟動 (/etc/rc.conf)
          步驟3.查詢 NFS Server 上提供的資源 (showmount)
          步驟4.掛載 NFS Server 所分享的目錄
5、參考
6、Me FAQ
          Q1.當我執行 make installworld 出現錯誤訊息無法繼續?
          Q2.NFS Server Not Responding?
          Q3.RPC: Port mapper failure showmount: can't do exports rpc?
          Q4.umount: unmount of /mnt failed: Device busy?
          Q5.RPC: Program not registered?



2、實作環境

  • FreeBSD 5.x、6.x



3、NFS Server設定

步驟 1. 設定要分享的目錄 (/etc/exports)

設定要分享給 NFS Client 的目錄及設定參數、指定權限,設定規則大致如下表所示,當每次修改完 /etc/exports 後記得執行 kill -HUP `cat /var/run/mountd.pid` 以通知 mountd 重新讀取設定檔,此時新設定才會生效。




步驟 2. 啟動 rpcbind 服務

不論是 NFS Server 還是 NFS Client 都必須啟動 rpcbind 才可以正常使用 NFS 功能,啟動的方式可使用執行命令方式也可使用整合了 NetBSD 的 rc.d 系統來完成系統初始化,啟動方式如下列二種選擇自已習慣的方式吧。
/usr/sbin/rpcbind          //啟動 rpcbind 服務-方式一
/etc/rc.d/rpcbind start    //啟動 rpcbind 服務-方式二 NetBSD rc.d 系統

而確認服務是否有啟動的方式也是很多種選擇自已習慣的方式吧。

確定 rpcbind 執行狀態
# /etc/rc.d/rpcbind status   //確認 rpcbind 是否執行
 rpcbind is running as pid 38186.


確定 rpcbind 執行序是否為執行中
ps ax |grep rpcbind        //確認 rpcbind 是否執行
 8144 ?? Ss 0:00.04 /usr/sbin/rpcbind


確定 rpcbind 是否有啟動並聆聽該服務的 Port
sockstat |grep rpcbind   //確認 rpcbind 是否執行
 root     rpcbind    38186 7  udp4   *:111                 *:*


增強 rpcbind 的安全性: 基於安全性考量我們可以利用 tcpwrapper 管制可連線的機器 (可參考 /etc/hosts.allow)。例如:只想讓本機 (127.0.0.1) 及區網 (192.168.78.0/255.255.255.0) 可連線 NFS Server 在 /etc/hosts.allow 加入下列幾行:
 rpcbind : 127.0.0.1 : allow
 rpcbind : 192.168.78.0/255.255.255.0 : allow
 rpcbind : ALL : deny




步驟 3. 啟動 nfsd 服務

啟動 nfsd 後系統會檢查 /etc/exports 是否存在,檔案存在就會自動執行 mountd 而 mountd 會去讀取裡面的設定值,參數說明:
  • -u:UDP
  • -t:TCP
  • -n 4:開啟 4 個 nfsd 的 Daemons
/usr/sbin/nfsd -u -t -n 4    //啟動 nfsd 服務

確定 rpcbind 執行序是否為執行中 (如下可看到確實開啟 4 個 Deamons)
ps ax |grep nfsd             //確認 nfsd 是否執行
 8249 ?? Is 0:00.05 nfsd: master (nfsd)
 8250 ?? I 0:00.01 nfsd: server (nfsd)
 8251 ?? I 0:00.00 nfsd: server (nfsd)
 8252 ?? I 0:00.00 nfsd: server (nfsd)


值得注意的地方為若你的機器有二片網卡 (例如:一片對外 61.60.59.58、一片對內 192.168.78.10),此時若是沒有告訴 nfsd 服務是在哪個介面上,則 nfsd 服務將無法正確啟動 (ps ax 看得到 sockstat 則看不到) 此時就需要指定參數及 IP 位址,若是只是對內服務而以則加上 -h 192.168.78.10,在重新啟動 nfsd 服務即可此時使用 sockstat 即可看到 nfsd 正確開始服務及指定的介面,當然記得要寫入/etc/rc.conf 內不然重新開機便要在指定一次。
sockstat |grep nfsd
 root     nfsd       38851 3  tcp4   192.168.79.10:2049   *:*




步驟 4. 啟動 mountd

mountd 是 NFS Servers 必備的 Daemon,它主要用來處理 Client 端送來的 Mount 請求。
# /usr/sbin/mountd -r                  //啟動 mountd 服務

確定 mountd 執行序是否為執行中
ps ax |grep mountd                   //確認 mountd 是否執行
 8232 ?? Is 0:00.03 mountd -r


若有修改 /etc/exports 檔案則需執行下列指令使 mountd 重新讀取設定檔內容
kill -HUP `cat /var/run/mountd.pid`  //讓 mountd 重新讀取



步驟 5. 設定開機自動啟動 (/etc/rc.conf)

其中 nfs_reserved_port_only="YES" 參數,表示讓 nfsd 執行時只使用 reserved port (小於 1024 的 ports) 。
vi /etc/rc.conf               //編輯 rc.conf 加入如下內容
 ### Network daemon (NFS): All need rpcbind_enable="YES" ###
 rpcbind_enable="YES"          //Run the portmapper service
 nfs_server_enable="YES"
 nfs_reserved_port_only="YES"       
 nfsd_enable="YES"
 nfs_server_flags="-u -t -n 4"
 mountd_enable="YES"
 mountd_flasg="-r"


最後我們來確定一下是否所有該啟動的服務都正確的啟動了
rpcinfo -p 127.0.0.1         //檢查本機啟動的 NFS 執行序有哪些
   program vers proto   port  service
    100000    4   tcp    111  rpcbind
    100000    3   tcp    111  rpcbind
    100000    2   tcp    111  rpcbind
    100000    4   udp    111  rpcbind
    100000    3   udp    111  rpcbind
    100000    2   udp    111  rpcbind
    100000    4 local    111  rpcbind
    100000    3 local    111  rpcbind
    100000    2 local    111  rpcbind
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100005    1   udp   1010  mountd
    100005    3   udp   1010  mountd
    100005    1   tcp    753  mountd
    100005    3   tcp    753  mountd 




4、NFS Clients 的設定

步驟 1. 啟動 rpcbind

不論是 NFS server 還是 NFS client 都必須啟動 rpcbind 才可以正常使用 NFS 功能。
/etc/rc.d/rpcbind start      //啟動 rpcbind 服務

確定 rpcbind 執行序是否為執行中
ps ax |grep rpcbind          //確認 rpcbind 是否執行
 8144 ?? Ss 0:00.04 /usr/sbin/rpcbind




步驟 2. 設定開機自動啟動 (/etc/rc.conf)

設定系統若重新開機便自動啟動 NFS Client 服務。
vi /etc/rc.conf         //加入如下二行
 rpcbind_enable="YES"
 nfs_client_enable="YES"




步驟 3. 查詢 NFS Server 上提供的資源 (showmount)

利用 showmount 指令可查詢 NFS Server 分享什麼資源,指令及語法為 showmount [-a | -d] [-e3] host
  • NFS Server 主機名稱: filecenter
  • NFS Client 主機名稱: user123

以下為測試如何顯示 NFS Server 分享資源:

步驟 3-1. 顯示目前 filecenter 上 client 正在使用 (mount) 的資源

showmount -a filecenter      
 All mount points on filecenter:  //-a List all mount points in the  form:host:dirpath.
 user123:/usr/home

步驟 3-2. 顯示目前 filecenter 上分享的掛載點

showmount -d filecenter        
 Directories on filecenter:     //-d List directory paths of mount points instead of hosts.
 /usr/home 

步驟 3-3. 顯示目前 filecenter 分享的資源 (/usr) 及允許的網段 (192.168.78.0)

showmount -e filecenter      
 Exports list on filecenter:      //-e Show the host's exports list.
 /usr 192.168.78.0

步驟 3-4. 顯示目前 filecenter 上 client 的電腦名稱

showmount -3 filecenter      
 Hosts on filecenter:     //-3 Use mount protocol Version 3, compatible with NFS Version 3.
 user123




步驟 4. 掛載 NFS Server 所分享的目錄

步驟 4-1. 手動掛載 NFS Server 所分享的目錄

執行如何指令將 NFS Server (filecenter) 所分享的資料夾 (/usr/home) 手動掛載到自已的 /mnt/home 之下。
mount filecenter:/usr/home  /mnt/home
問題時掛載後可能 NFS Server 關機或停止服務時,當 NFS Client 的機器去讀取所掛載的目錄時會造成 NFS Client 主機停止動作的情況出現 (只有當 NFS Server 又恢復服務或是 NFS Client 重開機才能解決),因此建議的解決方法為當您掛載 (mount) 完成存取資料後就卸載 (umount)。或是執行 mount_nfs 指令時加上參數來避免當 NFS Server 關機或停止服務時 NFS Client 主機 Lock 的狀況發生:
  1. 執行 mount_nfs 指令時加上參數 -s 如此一來當 NFS Client 掛載 (mount) 失敗幾次之後便不再嘗試去 mount。
  2. 執行 mount_nfs 指令時加上參數 -i 為允許使用 Ctrl+C 來中斷掛載 (mount)。

mount_nfs -s -i filecenter:/usr/home  /mnt/home     

開機自動掛載 NFS Server 資源
NFS Client 端若希望系統若重新開機時便自動掛載 (mount) NFS Server 所分享的資源,可將參數加入 /etc/fstab 中。

步驟 4-2. 利用 AMD(automounter daemon) 來存取 NFS Server 所分享的目錄

AMD (AutoMounter Daemon) 顧名思義為自動掛載服務,使用 amd 的好處為當 NFS Client 掛載 NFS Server 所分享的目錄時會馬上安裝該檔案系統,但經過一段時間間隔內 NFS Client 沒有對 NFS Server 有任何存取動作時,會自動卸載 (umount) 這個檔案系統。

修改 /etc/rc.conf 以便開機時自動載入 AMD (automounter daemon)
vi /etc/rc.conf
 amd_enable="YES"


啟動 AMD (automounter daemon)
/etc/rc.d/amd start

存取 NFS Server 所分享的目錄
cd /host/filecenter          //看到 NFS Server 所分享的目錄 (ex.home)

此時的檔案系統狀態
df -h /.amd_mnt/filecenter/host/home
 Filesystem           Size    Used   Avail Capacity  Mounted on
 filecenter:/home     60G     46K     55G     0%    /.amd_mnt/filecenter/host/home


如何共享 NFS Server 更新的 Patch 及 Kernel

make world 分享,升級步驟請參考 (/usr/src/Makefile) 內容如下
  1. `cd /usr/src' (or to the directory containing your source tree).
  2. `make buildworld'
  3. `make buildkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC).
  4. `make installkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC).
  5. `reboot' (in single user mode: boot -s from the loader prompt).
  6. `mergemaster -p'
  7. `make installworld'
  8. `mergemaster'
  9. `reboot'

當所有的機器若是硬體都一樣時,我們一台一台更新然後升級是很麻煩且沒有效率的,所以當 NFS Server 升級完成後,NFS Client 可把 Server 的 /usr/src、/usr/obj mount 到自已目錄結構相同位置,在執行 6 ~ 9 步驟即可 (當機器的 Kernel 都是一樣的前提之下),等於說我們把 NFS Server 更新好的 Patch 及 Kernel 拿來用。



5、參考




6、Me FAQ

Q1. 當我執行 make installworld 出現錯誤訊息無法繼續?

Error Message:
當執行升級動作到第 7 步驟 make installworld 時出現如下錯誤訊息 (說系統需要 proxy user account 但目前系統內無此帳號),並且無法繼續之後的步驟。
 ERROR: Required proxy user is missing, see /usr/src/UPDATING.
 *** Error code 1
 Stop in /usr/src.
 *** Error code 1
 Stop in /usr/src.

Ans:
照訊息所說參考 /usr/src/UPDATING 內容,並尋找 proxy 關鍵字眼發現訊息如下
 20040308:
        The packet filter (pf) is now installed with the base system. Make
        sure to run mergemaster -p before installworld to create required
        user account ("proxy"). If you do not want to build pf with your
        system you can use the NO_PF knob in make.conf.
        Also note that pf requires "options PFIL_HOOKS" in the kernel. The
        pf system consists of the following three devices:
        device          pf           # required
        device          pflog        # optional
        device          pfsync       # optional

訊息是說 FreeBSD 5.3 以後將 PF Firewall 設定為內建所以需要有 Proxy User Account,但因為我沒要用到 PF 因此就到 /etc/make.conf 下加了 NO_PF=yes 後在繼續執行 make installworld 便可順利繼續安裝系統程式。



Q2. NFS Server Not Responding?

Error Message:
狀況是這樣 FreeBSD 為 NFS Client 但當資料開始寫入 NFS Server 約幾分鐘後 NFS Client 卻常常會出現 Not Responding 訊息,之後 NFS Server 便當機,而 NFS Client 也被 Lock 住必須重開機才能解決。

Ans:
找了 Handbook-24.3 Network File System 內 24.3.5 Problems Integrating with Other Systems 章節內提到這段話
If the FreeBSD system is the client, then mount the NFS filesystem with the option -r=1024
 如果 FreeBSD 系統為客戶端,則應加入 -r=1024 參數

就馬上來試試,果然加了參數後 NFS Client 在寫入資料時便不會出現 Not Responding 的狀況了。



Q3. RPC: Port mapper failure showmount: can't do exports rpc?

Error Message:
狀況就是 NFS Server 有二片網卡(對外、對內),若我 NFS Server 服務只想提供對內網段使用,但沒有指定網卡介面所以 nfsd 服務雖然啟動了但使用 sockstat 及 rpcinfo 卻看不到 nfsd 執行,且當我執行 showmount 時便出現如下二行錯誤訊息
showmount -e localhost
 RPC: Port mapper failure
 showmount: can't do exports rpc

查看系統訊息也吐出如下錯誤訊息
tail /var/log/messages
 Oct 15 10:17:44 nfssrv rpcbind: connect from 61.60.59.58 to getport/addr(mountd): request from unauthorized host

Ans:
修改 /etc/rc.conf 指定 nfsd 的介面並重新啟動 nfs 服務即可
vi /etc/rc.conf
 nfs_server_flags="-u -t -n 4 -h 192.168.78.10"   //加上 -h 參數及網卡介面 IP


修改完成後重新啟動 nfsd 服務
/etc/rc.d/nfsd restart                          //重新啟動 nfsd 服務 
另外值得注意的地方就是 tcpwrapper 設定,若 NFS Client 不在 /etc/hosts.allow 允許名單內,則當 NFS Client 執行 showmount 時也會出現這上述二行錯誤訊息.



Q4. umount: unmount of /mnt failed: Device busy?

Error Message:
使用 script 自動將檔案備份至 NFS Server 並且在 script 執行最後 umount ,但執行完 script 後回應我說
umount: unmount of /mnt failed: Device busy
Ans:
使用下列解決方法後是可行(僅治標),當然根本問題還是去把 script 改好吧(治本)。
cd /usr/ports/sysutils/fuser;make install clean    //安裝 fuser
fuser -k /mnt         //殺掉佔用 /mnt 的 Process
umount -f /mnt        //強制 umount /mnt




Q5. RPC: Program not registered?

Error Message:
當 NFS Client 執行 showmount -e 去探測 NFS Server 所分享的資源時出現如下錯誤訊
showmount -e filecenter        
 RPC: Program not registered
 showmount : cannot do exports rpc

Ans:
執行 rpcinfo filecenter 去了解 NFS Server 所執行的 NFS Service 時發現只有出現 rpcbind 服務而以,而 nfsd、mountd 服務則未出現因此將這二個服務重新啟動後 NFS Client 便可順利掛載 NFS Server 所分享出來的資源。
文章標籤: