重新导出 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 用户强制执行,而不针对本地访问导出文件系统的进程。重新导出服务器也不会将它们传递给原始服务器,因此它们不会在不同重新导出服务器的客户端之间强制执行。