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 的狀況發生:
- 執行 mount_nfs 指令時加上參數 -s 如此一來當 NFS Client 掛載 (mount) 失敗幾次之後便不再嘗試去 mount。
- 執行 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) 內容如下- `cd /usr/src' (or to the directory containing your source tree).
- `make buildworld'
- `make buildkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC).
- `make installkernel KERNCONF=YOUR_KERNEL_HERE' (default is GENERIC).
- `reboot' (in single user mode: boot -s from the loader prompt).
- `mergemaster -p'
- `make installworld'
- `mergemaster'
- `reboot'
當所有的機器若是硬體都一樣時,我們一台一台更新然後升級是很麻煩且沒有效率的,所以當 NFS Server 升級完成後,NFS Client 可把 Server 的 /usr/src、/usr/obj mount 到自已目錄結構相同位置,在執行 6 ~ 9 步驟即可 (當機器的 Kernel 都是一樣的前提之下),等於說我們把 NFS Server 更新好的 Patch 及 Kernel 拿來用。
5、參考
- FreeBSD Handbook - Chapter 29 Network Servers - 29.3 Network File System (NFS)
- FreeBSD 使用手册 - 第29章 网络服务器 - 29.3 网络文件系统(NFS)
- twbsd.org - 第二十一章 NFS
- 雄的 FreeBSD 筆記
- man page nfsd
- man page rpcbind
- man page showmount
- man page mount_nfs
- man page fstab
- 雄的 FreeBSD 筆記-系統升級 make world
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 所分享出來的資源。