NFS (Network File System) 由 Sun 公司開發,是 UNIX/Linux 系統間共享文件的標準協議。它允許客戶端將遠程服務器的目錄掛載到本地文件系統树中,操作體驗與本地磁盤分區無異。本文系統講解 NFS 協議版本、RPC 依賴、服務端守護進程、掛載參數及安全最佳實踐。
| 版本 | RFC | 關鍵特性 |
|---|---|---|
| NFSv2 | RFC 1094 | 基礎功能,同步寫入,32位文件偏移,無鎖機制 |
| NFSv3 | RFC 1813 | 異步寫入、64位偏移、讀取目錄優化、ACL 支持 |
| NFSv4 | RFC 3010/7530 | 有狀態協議、複合操作、強制強一致性、集成鎖/委派、Kerberos 認證、防火牆友好(單端口 2049) |
NFSv3 客戶端發送 WRITE 請求時可指定 UNSTABLE 模式,服務器將數據寫入內存緩存即應答,後台批量刷盤。客戶端保留數據副本,直到收到 COMMIT 確認。相比 NFSv2 必須同步寫入穩定存儲,顯著提升吞吐量並減少延遲抖動。
NFS 本身不處理網絡傳輸,完全依賴 RPC (Remote Procedure Call) 實現進程間通信:
rpc.nfsd:核心文件服務進程,處理客戶端 READ/WRITE/LOOKUP 等 VFS 請求。rpc.mountd:掛載服務,驗證客戶端權限(讀取 /etc/exports),返回文件句柄。# Debian/Ubuntu
apt-get install nfs-kernel-server
# RHEL/CentOS
yum install nfs-utils rpcbind
/etc/exports# 格式:導出目錄 客戶端(選項列表)
/data/nfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/home *(ro,async,root_squash)
| 選項 | 含義 |
|---|---|
| rw / ro | 讀寫 / 唯讀 |
| sync / async | 同步寫入磁盤 / 異步(高性能但風險) |
| root_squash / no_root_squash | 將 root 映射為匿名用戶 / 保留 root 權限(危險) |
| all_squash | 所有用戶映射為匿名 |
| no_subtree_check | 禁用子樹校驗(提升性能,適用整盤導出) |
| insecure | 允許非保留端口(>1024)客戶端連接 |
systemctl enable --now rpcbind nfs-server
# 或傳統
service rpcbind start
service nfs start
# 重新導出
exportfs -rv
# 基礎掛載
mount -t nfs 192.168.1.100:/data/nfs /mnt/nfs
# 生產推薦參數
mount -t nfs -o rw,hard,intr,rsize=32768,wsize=32768,timeo=600,retrans=2,nfsvers=3 192.168.1.100:/data/nfs /mnt/nfs
/etc/fstab192.168.1.100:/data/nfs /mnt/nfs nfs rw,hard,intr,rsize=32768,wsize=32768,_netdev 0 0
| 參數 | 推薦值 | 說明 |
|---|---|---|
| hard / soft | hard | hard:無限重試(關鍵業務);soft:超時返回錯誤(非關鍵) |
| intr | 必加 | 允許信號中斷掛起的 hard 掛載 |
| rsize / wsize | 32768 (32K) | 讀/寫最大塊大小,匹配服務器 max_block_size |
| timeo | 600 (60秒) | 重試超時(十分之一秒單位),網絡不穩可調大 |
| retrans | 2-3 | 重試次數,超過則報錯(soft)或繼續(hard) |
| nfsvers | 3 或 4 | 指定協議版本,避免協商失敗 |
| _netdev | fstab 必加 | 標記網絡設備,啟動時等待網絡就緒 |
mountd=port 固定)。sec=krb5/krb5i/krb5p,防止數據竄改與重放。no_root_squash、insecure,嚴格限制客戶端 IP 段。nfsstat -s (服務端)、nfsstat -c (客戶端) 觀察 RPC 調用延遲、重傳率、錯誤碼。showmount -e server_ip:查看服務端導出列表。rpcinfo -p server_ip:驗證 RPC 服務註冊。tcpdump -i eth0 port 2049:抓包分析 NFS 交互。hard 選項、防火牆、服務端 rpc.mountd 是否運行。/etc/exports 客戶端匹配、root_squash、文件系統 ACL。Nagios 插件執行報錯:缺少 sysstat 套件導致 check_cpu.sh 失效的解決方案
Linux 學習資源大全:從入門到精通的經典電子書、白皮書與官方指南下載彙總
Linux 關閉 SELinux 完整教學:sestatus 查看狀態、修改 /etc/sysconfig/selinux 設定 disabled、重開機驗證、Permissive 模式替代方案
Linux 記憶體真實使用率深度解析:free 命令輸出詳解、Buffers/Cache 機制與監控最佳實踐
新手指南:在 Linux 下安裝 Perl 及 Perl 模組