NFS 的核心概念#
NFS(Network FileSystem)是一種網路檔案共享系統,允許用戶端將遠端伺服器的目錄掛載到本機,使其看起來如同本地磁碟。這是 Unix/Linux 環境中最基本的檔案共享方案。
NFS 與 RPC 的關係#
NFS 功能複雜,各項功能使用隨機埠口(小於 1024),用戶端無法事先知道。因此 NFS 仰賴 RPC(Remote Procedure Call)服務:
- RPC 固定使用 port 111
- 負責登錄各 NFS 功能對應的埠口,並回報給用戶端
- 啟動順序:先啟 RPC,再啟 NFS
如果 RPC 服務沒有啟動,NFS 將無法運作。這是最常見的 NFS 故障原因之一。
關鍵 Daemon#
- rpc.nfsd:管理用戶端登入與帳號 UID 判別
- rpc.mountd:管理檔案系統權限認證,讀取
/etc/exports設定 - rpc.lockd / rpc.statd:檔案鎖定與一致性檢查(非必須但建議啟用)
使用者權限機制#
NFS 以 UID/GID 而非帳號名稱判別身份。這帶來一個重要的觀念:
- 伺服器依 UID 查詢對應帳號,若 UID 在伺服器上不存在,則壓縮為匿名使用者(
nfsnobody) - root 預設被壓縮為匿名使用者(
root_squash),避免用戶端的 root 擁有伺服器端的完整權限 - 寫入需同時滿足三條件:正確的 UID 身份、伺服器許可權限、檔案本身的
w權限
如果用戶端和伺服器的 UID 對應不同帳號,會導致權限混亂。在多機環境中,建議搭配 NIS 統一帳號管理。
/etc/exports 設定核心#
設定分享目錄、允許的主機與權限參數。重要參數包括:
- rw / ro:可讀寫 / 唯讀
- sync / async:同步 / 非同步寫入(sync 較安全,async 較快)
- root_squash / no_root_squash:是否壓縮 root 身份
- all_squash:壓縮所有使用者為匿名
- anonuid / anongid:指定匿名使用者的 UID/GID
用戶端掛載的安全措施#
用戶端可透過掛載參數自我保護:
- nosuid / noexec / nodev:禁用 SUID、執行檔、裝置檔案,防止遠端分享的惡意程式影響本機
- bg / soft:背景掛載與軟逾時,適合不穩定的網路環境
自動掛載(autofs)#
autofs 服務讓檔案系統只在需要時掛載,閒置後自動卸載,減少持續佔用資源,也避免伺服器端異常導致用戶端卡住。
防火牆考量#
NFS 使用多個隨機埠口,需透過設定檔固定各服務的埠口號碼,才能在防火牆上開放正確的規則。
伺服器關機前,若用戶端仍有 NFS 連線,關機過程會長時間卡住(RPC 持續等待回應)。建議先通知用戶端卸載,或先強制停止 NFS 服務。