重新匯出 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 使用者強制執行,而不針對本地訪問匯出檔案系統的程序。重新匯出伺服器也不會將它們傳遞給原始伺服器,因此它們不會在不同重新匯出伺服器的客戶端之間強制執行。