nfs服务启动必须先启动rpcbind再启动nfs-server,否则showmount -e localhost会报“clnt_create: rpc: unable to receive”;/etc/exports语法需严格规范,空格与括号位置错误将导致exportfs -arv静默失败;防火墙须放行111和2049端口及动态rpc端口。

nfs-kernel-server 和 nfs-utils 是服务端核心包,没装好就根本起不来;rpcbind 必须先于 nfs 启动,否则 showmount -e localhost 会报错“clnt_create: RPC: Unable to receive”——这是最常卡住的第一步。
必须按顺序启动 rpcbind 和 nfs 服务
Linux 的 NFS 依赖 RPC 机制通信,rpcbind 负责端口映射(尤其 111 端口),nfs 启动时需向它注册自己的动态端口。若顺序反了或 rpcbind 没起来,exportfs -arv 会静默失败,systemctl status nfs 可能显示 active but not listening。
- 先确保
rpcbind已运行:systemctl start rpcbind && systemctl enable rpcbind - 再启动
nfs:systemctl start nfs-server(RHEL/CentOS 7+)或nfs-kernel-server(Debian/Ubuntu) - 验证是否注册成功:
rpcinfo -p localhost | grep nfs应至少输出 3 行(nfs、mountd、nlockmgr) - 别跳过这步:用
showmount -e localhost测试本地导出是否生效,不是只看服务状态
/etc/exports 的写法细节决定挂载成败
空格、括号、IP 格式不规范会导致 exportfs -arv 报 “syntax error” 或静默忽略某条规则。常见坑包括:客户端 IP 后多加空格、权限括号紧贴 IP 无空格、使用 CIDR 时写成 192.168.1.0/24 却忘了加括号包裹。
- 正确格式:
/srv/nfs/shared 192.168.1.0/24(rw,sync,no_subtree_check)(IP 与括号间不能有空格) -
*虽方便但极不安全,生产环境务必限定 IP 或子网 - 多个客户端写在同一行时用空格分隔,不要换行或用逗号:
/data 192.168.1.10(rw) 192.168.1.11(ro) - 修改后必须重载:
exportfs -arv(推荐)或systemctl reload nfs-server;restart不必要且可能中断已有连接
客户端 mount 失败多半是端口或选项问题
挂载时卡住、超时或报 Connection refused / RPC: Program not registered,大概率是防火墙拦了非标准端口,或客户端用了不兼容的 NFS 版本。
- 服务端防火墙要放通:
111(rpcbind)、2049(nfsd),以及mountd、nlockmgr等动态端口(建议用rpcbind固定端口 + 防火墙白名单,或直接关防火墙测试) - 客户端挂载加
-o nolock可绕过nlockmgr端口问题(仅限测试,影响文件锁) - 显式指定版本更稳:
mount -t nfs -o nfsvers=3,ro 192.168.1.1:/srv/nfs/shared /mnt(NFSv4 默认启用,但某些旧客户端或容器环境对 v4 支持不完整) - 挂载前先确认服务端共享可见:
showmount -e 192.168.1.1,若失败,问题一定在服务端配置或网络连通性
/etc/exports 里看似简单的空格和括号,rpcbind 启动顺序,还有客户端挂载时没意识到的 NFS 版本隐式切换——这些地方不细看日志、不逐层验证,很容易花几小时兜圈子。











