NFS 的组成与排错入口
NFS 是中小企业共享文件的主流方案:服务端在 /etc/exports 声明导出目录与允许的客户端范围,客户端用 mount -t nfs 服务器:/路径 挂载。排错主要看四处:服务端 exportfs -v 的导出与参数、客户端 showmount/findmnt 的实际挂载、rpcinfo 的端口注册(v3 相关的 rpcbind 与 mountd)、以及内核 dmesg 里的 nfs 报错。v4 与 v3 的端口与防火墙要求不同,先确认版本再查连通性。
基本信息
| 适用平台 | Linux(服务端 nfs-utils / nfs-kernel-server,客户端内核自带) |
|---|---|
| 客户端语法 | mount -t nfs 服务器:/导出路径 /挂载点 -o 选项 |
| 常用选项 | vers、soft/hard、timeo、retrans、_netdev、noatime |
| 排错工具 | showmount -e、exportfs -v、rpcinfo -p、findmnt、nfsstat |
| 端口 | v4 只需 2049/tcp;v3 另需 rpcbind 与 mountd 等动态端口 |
典型使用场景
- 多台应用服务器共享上传目录或静态资源(只读分发用 ro 更稳)
- 集中存放备份与归档,便于统一容量管理
- 虚拟化与容器共享数据目录或镜像仓库
- 跨部门文档共享,用 squash 选项收敛权限
- 排查挂载后卡死、写入报 stale file handle、开机卡在挂载阶段
客户端挂载与检查
客户端挂载与检查
sudo showmount -e 10.0.0.8 # 先确认服务端到底导出了什么
sudo mount -t nfs 10.0.0.8:/data /mnt/nfs -o vers=4.2,soft,timeo=30,retrans=3
findmnt /mnt/nfs # 复核实际生效的版本与选项
# fstab 持久化;_netdev 让网络就绪后再挂载,避免开机卡住
10.0.0.8:/data /mnt/nfs nfs vers=4.2,soft,timeo=30,retrans=3,_netdev,noatime 0 0
sudo exportfs -v # 服务端:查看导出目录与客户端范围
sudo exportfs -ra # 服务端:改完 /etc/exports 后重新生效
sudo rpcinfo -p 10.0.0.8 | head # v3 环境确认 rpcbind/mountd 端口已注册
sudo dmesg | grep -i nfs | tail # 内核侧报错:超时、stale handle 等挂载参数取舍
| 选项 | 作用 | 取舍 |
|---|---|---|
| vers=4.2 | 指定协议版本 | v4 只需 2049/tcp,跨防火墙简单;老存储可能只支持 v3 |
| soft | 超时后返回错误 | 避免无限挂起,但可能把 IO 错误抛给应用 |
| hard | 无限重试直到成功 | 一致性更好,代价是进程可能长时间处于不可中断状态 |
| timeo / retrans | 超时与重试参数 | soft 场景必须给合理上限,否则重试过密 |
| noatime | 不更新访问时间 | 读多写少的共享目录可明显减少写流量 |
数据库文件、需要强一致的应用不要放在 NFS 上;确需共享就用 hard 并让应用自己做超时控制,用可接受的卡顿换数据一致性。
fstab 里不加 _netdev(或 x-systemd.automount),网络未就绪时会拖慢甚至卡住开机,远程维护的机器尤其危险;改 fstab 前先留好救援通道。