nfs服务端启动前必须先启动rpcbind,否则会出现rpc相关报错;需按顺序执行systemctl start rpcbind、exportfs -r、systemctl start nfs-server,并用showmount -e localhost验证共享发布成功。

服务端启动前必须先跑通 rpcbind
很多报错如 clnt_create: RPC: Program not registered 或 RPC: Port mapper failure 都不是 NFS 本身没装好,而是 rpcbind 没启动、或启动顺序错了。NFSv4 虽然弱化了对 RPC 的依赖,但 CentOS/RHEL 7/8 默认仍走 NFSv3 兼容路径,rpcbind 是刚需。
实操要点:
-
systemctl start rpcbind必须在systemctl start nfs-server(或nfs)之前执行 - 检查状态:
systemctl status rpcbind和rpcinfo -p localhost应有输出,否则 NFS 启动必失败 - 如果改过
/etc/exports,别只 reload NFS:先exportfs -r,再确认showmount -e localhost能列出共享目录 - SELinux 开启时,需额外运行
setsebool -P nfs_export_all_rw 1,否则即使配置正确也挂载失败
/etc/exports 权限参数不能乱堆,no_root_squash 是高危开关
写成 /data 192.168.1.0/24(rw,sync,no_root_squash,all_squash) 这种自相矛盾的组合,exportfs 不报错但行为不可控——后者会覆盖前者,实际变成全匿名映射,root 权限反而被压制了。
常见误配与建议:
-
root_squash(默认):客户端 root 写入的文件 UID/GID 变成nfsnobody,安全但可能破坏脚本权限逻辑 -
no_root_squash:仅限可信内网、且明确需要 root 管理权的场景(如 Kubernetes node 上挂载 PV),暴露即等同于给客户端 root 直接操作服务端磁盘 -
anonuid/anongid必须对应服务端真实存在的 UID/GID,比如anonuid=1001就得确保id -u $(getent passwd 1001 | cut -d: -f1)能查到用户 - 多客户端不同权限?用多行写法,别塞一堆 IP 在同一行括号里:
/share 192.168.1.10(rw) 192.168.1.20(ro)
客户端挂载不成功,先看 showmount -e 能否通
mount -t nfs server:/path /mnt 报 Connection refused 或超时,90% 不是挂载命令写错,而是服务端根本没把共享“发布”出去。
排查链路:
- 服务端执行
showmount -e localhost—— 不通?说明rpcbind或exportfs有问题 - 客户端执行
showmount -e <server-ip></server-ip>—— 不通?检查防火墙:firewall-cmd --permanent --add-service=nfs(RHEL/CentOS)或开放2049/tcp+rpcbind动态端口(查rpcinfo -p输出里的 port 列) - 能
showmount但mount失败?大概率是服务端/etc/exports里写的 IP 段/主机名和客户端实际地址不匹配(比如写了192.168.1.0/24,客户端却是192.168.2.10) - 挂载后
ls /mnt卡住?可能是网络延迟或服务端负载高,加soft,timeo=10,retrans=3参数缓解
/etc/fstab 自动挂载要防启动卡死
直接往 /etc/fstab 里写 server:/path /mnt nfs defaults 0 0 很危险:若 NFS 服务未就绪或网络不通,系统启动会 hang 在挂载阶段,尤其云服务器或 DHCP 环境下更明显。
稳妥做法:
- 改用
_netdev选项:server:/path /mnt nfs defaults,_netdev 0 0,告诉 systemd 等网络就绪后再挂 - 加
bg(后台重试)和soft(软挂载):server:/path /mnt nfs rw,soft,bg,intr,timeo=10 0 0 - 避免用
defaults:它隐含hard行为,出问题就是无限等待;生产环境建议显式控制超时与重试 - 测试 fstab 条目是否生效:
mount -a手动触发,比重启更安全
rpcbind 和 exportfs -r 的配合,还有 showmount 这个被很多人跳过的验证步骤,漏掉任何一个,后面所有 mount 操作都是无意义的徒劳。










