/etc/exports 语法严格:共享路径与客户端间无空格,括号紧贴客户端,选项逗号分隔无空格;须执行 exportfs -arv 刷新导出,否则配置不生效。

NFS 服务端配置不难,但出问题基本集中在 /etc/exports 写错、服务没重载、防火墙拦住 RPC 端口,或者客户端挂载时用了错误的路径格式。
怎么写对 /etc/exports 这一行?
/etc/exports 不是 shell 脚本,语法非常严格:路径和客户端地址之间**不能有空格**,括号必须紧贴客户端地址,选项之间用逗号分隔、**不能有空格**。
常见错误写法:
/srv/nfs/shared 192.168.1.0/24 (rw, sync)✅ 正确写法(无空格、括号紧贴):
/srv/nfs/shared 192.168.1.0/24(rw,sync,no_subtree_check)
关键点:
- 客户端可以是 IP(
192.168.1.100)、子网(192.168.1.0/24)、域名(client.example.com)或通配符(*,仅测试用) -
no_root_squash很危险,除非你明确需要客户端 root 在服务端也有 root 权限,否则默认用root_squash -
sync更安全,async有丢数据风险,生产环境别用 -
no_subtree_check建议加上,避免嵌套挂载时出现“Stale file handle”错误
改完 /etc/exports 为什么客户端还是挂载失败?
因为 NFS 不会自动读取新配置。必须手动触发导出刷新:
- 执行
sudo exportfs -arv(推荐):重新导出所有条目并显示详细过程 - 或重启服务:
sudo systemctl restart nfs-server(systemd 系统) - 但注意:
exportfs -r不等于 reload,它不会重启守护进程,只更新内核导出表,更轻量也更可靠
如果执行后 showmount -e localhost 没输出,说明导出没生效,大概率是 /etc/exports 语法错误或路径不存在。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
客户端 mount 报 “Connection refused” 或 “RPC: Program not registered” 怎么办?
这不是网络不通,而是 NFS 依赖的 RPC 服务没起来或被防火墙挡了。检查三件事:
- 确保服务端已启动
rpcbind:sudo systemctl is-active rpcbind(多数现代发行版仍需它,哪怕启用了nfs-server) - 防火墙要放行至少两个端口:
111(rpcbind)和2049(nfsd),UDP/TCP 都要开 - 如果用了
firewalld,别只加 service,直接按端口加更稳:sudo firewall-cmd --add-port=111/tcp --permanent,然后 reload
另外,客户端挂载命令里,服务器地址后不能带协议前缀(比如不要写 nfs://192.168.1.10:/path),正确是:
sudo mount -t nfs 192.168.1.10:/srv/nfs/shared /mnt/nfs
为什么挂上去了,但一写文件就卡住或报 “Stale file handle”?
这通常指向三个底层原因: - 服务端共享目录的本地权限不够:确保nobody:nogroup(或你指定的 anonuid/anongid)对目录有读写权,chmod 755 不够,得 chmod 775 或更宽松
- 客户端挂载时没加 nolock 且服务端没跑 rpc.statd:NFSv3 依赖 NLM(Network Lock Manager),若服务端禁用或客户端没连上,锁操作会 hang;加 nolock 参数可绕过:mount -t nfs -o nolock server:/path /mnt
- 目录被服务端 umount 或服务重启过,但客户端没 umount 就重挂:必须先 sudo umount -l /mnt/nfs(lazy umount),再重试
真正麻烦的不是配置步骤,而是每一步的隐含依赖——rpcbind 是否运行、exportfs 是否真生效、客户端内核是否支持对应 NFS 版本(比如某些旧系统不支持 NFSv4 默认行为)。建议首次调试时,服务端多跑一遍 rpcinfo -p,确认 nfs 和 mountd 出现在输出里。










