我的理解是 NFSv4 客户端应立即连接到服务器上的 NFSv4 服务,完全跳过 rpcbind 端口映射器和 mountd 服务交互,但我看到我的 RHEL6 客户端始终首先联系 rpcbind 服务以获取 mountd 端口,获取 mountd 的导出列表,然后最终连接到 NFSv4 服务。使用 tcpdump 进行观察。
根据所有迹象(mount 命令的输出和 TCP 的检查),当挂载操作完成时,客户端和服务器都使用 NFSv4。
即便我尽我所能尝试在客户端上强制使用 NFSv4,这种情况仍然会发生。示例:
- 在 /etc/nfsmount.conf 中设置 Nfsvers=4
- 使用 vers=4 选项显式挂载
- 明确设置 NFS 端口。(通过 mount 命令和在 nfsmount.conf 中)
我完全错了还是有什么不对劲?这对我来说是个问题,因为 NFS 客户端坚持在挂载任何 NFSv4 导出之前能够通过 UDP 到达服务器上的 rpcbind,而我遇到了神秘的 UDP 数据包丢失(是的,我在这方面与网络人员合作),这导致挂载不时完全失败或需要很长时间才能完成。
我查看了 libtirpc 源代码,发现它总是使用 UDP 连接到 RPC 端口映射器,但我想完全将端口映射器和 mountd 服务排除在外。
我尝试使用“rpcinfo -d”在 NFS 服务器上取消注册 UDP 端口映射器服务,但这会导致针对该服务器的所有 NFS 安装失败(客户端再次坚持要求服务器让 rpcbind 监听 UDP 端口 111)。我还尝试弄乱 /etc/netconfig,但没有成功。
有谁遇到过这种情况或对 NFSv4 有足够的了解,可以告诉我我的期望不切实际吗?
答案1
我将其追溯到 autofs。它被设置为使用 /etc/auto.net 来获取使用 showmount 命令的导出列表。showmount 命令负责在 NFS 挂载之前访问 rpcbind 和 mountd,因此尝试更改挂载选项无效。
我修改了 /etc/auto.net,问题已经解决。
附注:正如我在各个地方看到的那样,使用 auto.master 中的“-hosts”选项也会导致 rpcbind 和 mountd 访问。我最终让 auto.net 挂载所有 NFSv4 服务器的根目录,据我所知,假设我的所有主机都是 NFSv4,这是可以的。