事实
之前在 Debian 上完美运行的 /etc/exports 文件在 Ubuntu 上无法正常工作。我可以导出顶级目录;客户端可以挂载它并查看下一级目录;但他们无法查看其他子目录,也无法挂载子目录。
讨论
首先,有一些有用的功能:
/archive 192.168.0.0/255.255.255.0(fsid=root,crossmnt,rw,sync,no_root_squash,no_subtree_check)
显然,fsid=root 是强制性的 —— 在 Debian 上并非如此 —— 并且crossmnt
只是为了测试。
我可以在客户端上挂载 /archive。我可以下降到 /archive/dir1。但是,当客户端尝试读取目录 /archive/dir1 时,该目录显示为空。
接下来我尝试两行版本的 /etc/exports:
/archive 192.168.0.0/255.255.255.0(fsid=root,crossmnt,rw,sync,no_root_squash,no_subtree_check)
/archive/dir1/dir2/dir3 192.168.0.0/255.255.255.0(rw,sync,no_root_squash,no_subtree_check)
第一行与前面相同,第二行将子目录导出为单独的实体。同样,从 Debian 导出时,此操作运行良好。
此时,任何挂载 /archive/dir1/dir2/dir3 的尝试都会失败。在 Debian 客户端上,客户端尝试使用 NFS 版本 4.2,但会抱怨文件句柄过时,因此会回退到版本 3,并无限循环使用版本 3。
在 Ubuntu 客户端上,尝试使用 NFS 版本 4 进行挂载时失败,并出现“文件句柄过时”的情况;回退到版本 3 并在协议 6 和 17 之间循环;最终失败。
请注意:* 所有客户端都位于同一个防火墙后面* 没有机器运行内部防火墙(例如,ufw 被禁用或关闭)
服务器上的 rpcinfo:
# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 51505 mountd
100005 1 tcp 33248 mountd
100005 2 udp 59490 mountd
100005 2 tcp 46113 mountd
100005 3 udp 59750 mountd
100005 3 tcp 38367 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049
100227 3 tcp 2049
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049
100227 3 udp 2049
100021 1 udp 55501 nlockmgr
100021 3 udp 55501 nlockmgr
100021 4 udp 55501 nlockmgr
100021 1 tcp 37597 nlockmgr
100021 3 tcp 37597 nlockmgr
100021 4 tcp 37597 nlockmgr
客户端上的 rpcinfo:
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049
100227 3 tcp 2049
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049
100227 3 udp 2049
100021 1 udp 56523 nlockmgr
100021 3 udp 56523 nlockmgr
100021 4 udp 56523 nlockmgr
100021 1 tcp 37425 nlockmgr
100021 3 tcp 37425 nlockmgr
100021 4 tcp 37425 nlockmgr
100024 1 udp 39290 status
100024 1 tcp 37851 status
100005 1 udp 52528 mountd
100005 1 tcp 43547 mountd
100005 2 udp 36593 mountd
100005 2 tcp 34609 mountd
100005 3 udp 42349 mountd
100005 3 tcp 45613 mountd
最后,
RPCMOUNTDOPTS="--manage-gids"
在 /etc/default/nfs-kernel-server 中
编辑
可能的症状是 /var/lib/nfs/rmtab 不是最新的。我期望当 nfs-kernel-server 停止时,rmtab 会更新;或者当我取消导出文件系统(exportfs -ua)时;或者当我在客户端卸载时。相反,rmtab 继续保留过时的信息。
行动
我想要一些关于如何调试这个问题的建议。
编辑2
还有几点:
- 我已经检查了 ACL(未设置)和文件权限,它们看起来是正确的。
- 即使由于其他原因冷关闭客户端和服务器后,我仍然会收到“陈旧文件句柄”错误。
如果我启用 rpcdebug 来查找 NFS proc,我会看到关于
没有到客户端 Linux NFSv4.2 的回调路径
但对于 MacOS 或 Ubuntu 客户端等,该错误不会出现。
我尝试过绝对简约的 /etc/exports,但都不起作用。例如,
/某物*(同步,无子树检查)
不起作用。
摘要:这个问题仍然难以解决,在我看来这不是一个简单的权限问题——除非我错过了某个地方的设置,甚至是整个程序或配置文件。
答案1
经过反复尝试,我发现了失败的原因。查看/archive
,我注意到我有一个同名的子目录,也就是说,有一个/archive/arhive
。
当我删除时,/archive/archive
我的问题大部分都停止了。根据我看到的内容和权限,的导出/archive
实际上是在导出/archive/archive
。
更进一步:我注意到,当我导出/archive
客户端时,它会挂载为 NFS 版本 4。当我挂载子目录时,即/archive/dir1/dir2/dir3
,该子目录(相同的驱动器,因此相同的文件系统)会挂载为版本 3!我仍在追查此事,但与此同时,我已经开始行动了。
如果这个“同名子目录导致挂载错误”需要错误报告,我可以随意重现它并写一个。