重新导出 NFS 文件系统

概述

可以将 NFS 文件系统通过 NFS 重新导出。然而,此功能有一些限制。在尝试使用它之前,我们建议您仔细研究,以确定它是否适用于您的目的。

下面讨论当前已知的限制。

必须使用“fsid=”,crossmnt 被破坏

我们要求对任何 NFS 文件系统的重新导出使用 “fsid=” 导出选项。您可以使用“uuidgen -r”生成唯一参数。

“crossmnt”导出不会传播 “fsid=”,因此不允许遍历到更深层的 nfs 文件系统;如果您希望导出在导出的文件系统下挂载的 nfs 文件系统,您需要显式导出它们,并为每个文件系统分配其唯一的 “fsid=” 选项。

重启恢复

当重新导出服务器重启时,NFS 协议的正常重启恢复机制不起作用。客户端将丢失重启前持有的任何锁,并且进一步的 IO 操作将导致错误。关闭并重新打开文件应该可以清除错误。

文件句柄限制

如果原始服务器对给定的对象使用 X 字节的文件句柄,则重新导出服务器的重新导出对象的文件句柄将为 X+22 字节,向上舍入到最接近的 4 字节倍数。

结果必须符合 RFC 规定的文件句柄大小限制

NFSv2

32 字节

NFSv3

64 字节

NFSv4

128 字节

因此,例如,如果原始服务器给您的文件句柄小于 10 字节,您将只能通过 NFSv2 重新导出文件系统——但这不太可能。

一般来说,在不询问服务器供应商的情况下,没有办法知道 NFS 服务器给出的最大文件句柄大小。

但是下表给出了一些示例。第一列是 Linux 服务器导出给定文件系统时文件句柄的典型长度,第二列是该 nfs 导出被另一个 Linux 主机重新导出后的长度

文件句柄长度

重新导出后

ext4

28 字节

52 字节

xfs

32 字节

56 字节

btrfs

40 字节

64 字节

因此,所有文件系统在重新导出后都将适合 NFSv3 或 NFSv4 的文件句柄,但没有一个可以通过 NFSv2 重新导出。

但是,Linux 服务器的文件句柄比这要复杂一些;例如

  • (非默认)“subtreecheck”导出选项通常需要在文件句柄中额外增加 4 到 8 个字节。

  • 如果您导出文件系统的子目录(而不是导出文件系统根目录),通常也会增加 4 到 8 个字节。

  • 如果您通过 NFSv2 导出,knfsd 通常会使用较短的文件系统标识符,从而节省 8 个字节。

  • 导出的根目录使用较短的文件句柄。

如您所见,128 字节的 NFSv4 文件句柄足够大,您不太可能在使用 NFSv4 重新导出从 Linux 服务器导出的任何文件系统时遇到问题。通常,如果原始服务器也支持 NFSv3,那么您可能没问题。通过 NFSv3 重新导出可能比较棘手,而通过 NFSv2 重新导出可能永远无法工作。

有关 Linux 文件句柄结构的更多详细信息,最佳参考是源代码和注释;特别参见

  • include/linux/exportfs.h:enum fid_type

  • include/uapi/linux/nfsd/nfsfh.h:struct nfs_fhbase_new

  • fs/nfsd/nfsfh.c:set_version_and_fsid_type

  • fs/nfs/export.c:nfs_encode_fh

忽略打开 DENY 位

自 NFSv4 以来,NFS 支持从 Windows 获取的 ALLOW 和 DENY 位,例如,允许您以禁止其他读取或写入打开的模式打开文件。 Linux 客户端不使用它们,并且服务器的支持一直不完整:它们仅针对其他 NFS 用户强制执行,而不是针对本地访问导出文件系统的进程。重新导出服务器也不会将它们传递给原始服务器,因此它们不会在不同重新导出服务器的客户端之间强制执行。