无法读取 Ubuntu 提供的 NFS 子目录

无法读取 Ubuntu 提供的 NFS 子目录

事实

之前在 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

还有几点:

  1. 我已经检查了 ACL(未设置)和文件权限,它们看起来是正确的。
  2. 即使由于其他原因冷关闭客户端和服务器后,我仍然会收到“陈旧文件句柄”错误。
  3. 如果我启用 rpcdebug 来查找 NFS proc,我会看到关于

    没有到客户端 Linux NFSv4.2 的回调路径

但对于 MacOS 或 Ubuntu 客户端等,该错误不会出现。

  1. 我尝试过绝对简约的 /etc/exports,但都不起作用。例如,

    /某物*(同步,无子树检查)

不起作用。

摘要:这个问题仍然难以解决,在我看来这不是一个简单的权限问题——除非我错过了某个地方的设置,甚至是整个程序或配置文件。

答案1

经过反复尝试,我发现了失败的原因。查看/archive,我注意到我有一个同名的子目录,也就是说,有一个/archive/arhive

当我删除时,/archive/archive我的问题大部分都停止了。根据我看到的内容和权限,的导出/archive实际上是在导出/archive/archive

更进一步:我注意到,当我导出/archive客户端时,它会挂载为 NFS 版本 4。当我挂载子目录时,即/archive/dir1/dir2/dir3,该子目录(相同的驱动器,因此相同的文件系统)会挂载为版本 3!我仍在追查此事,但与此同时,我已经开始行动了。

如果这个“同名子目录导致挂载错误”需要错误报告,我可以随意重现它并写一个。

相关内容