重新导出 NFS 文件系统

概述

通过 NFS 重新导出 NFS 文件系统是可能的。然而,此功能具有诸多限制。在尝试之前,我们建议您仔细研究,以确定它是否符合您的目的。

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

需要“fsid=”,crossmnt 已损坏

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

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

重启恢复

当重新导出服务器重启时,NFS 协议的正常重启恢复机制不起作用,因为源服务器尚未重启,因此它不在宽限期内。由于源服务器不在宽限期内,它无法保证在锁丢失和任何尝试恢复它们之间文件不会被更改。这同样适用于委托和任何相关锁。客户端不允许从重新导出服务器获取文件锁或委托,任何尝试都将失败并显示操作不支持。

文件句柄限制

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

结果必须符合 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 位被忽略

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