Filesystems

陳舊的 NFS 文件句柄為什麼 fsid 可以解決它?

  • November 7, 2018

問題陳述(注意這個問題已經解決了,但是有一個關於為什麼解決方案有效的問題)

NFS 伺服器是 Ubuntu 16.04.4 LTS。客戶端是 Ubuntu 16.04.4 LTS 和 CentOS 6.10 和 7 的混合。

NFS 伺服器幾個月來一直執行良好,其中一項特殊的導出服務是為多個客戶端提供備份服務。NFS 伺服器目錄如下所示:

/mnt/backups/client1
/mnt/backups/client2
/mnt/backups/client3
/mnt/backups/client4

/etc/exports 包含:

/mnt/backups 1.2.3.0/24(rw,sync,no_subtree_check)

客戶端僅在備份期間掛載 nfs 伺服器,然後在完成後解除安裝備份。

這工作正常,但是,確定客戶端不應該能夠在 /mnt/backups 目錄中看到彼此。每個客戶端都使用相同的備份 uid/gid。因此,決定通過使用 /etc/exports 文件來分離目錄。

為此,NFS 伺服器已停止,並且 /etc/exports 已修改,因此它包含:

/mnt/backups/client1 1.2.3.21(rw,sync,no_subtree_check)
/mnt/backups/client2 1.2.3.22(rw,sync,no_subtree_check)
/mnt/backups/client3 1.2.3.23(rw,sync,no_subtree_check)
/mnt/backups/client4 1.2.3.24(rw,sync,no_subtree_check)

回想一下,客戶端僅在進行備份時(凌晨 4 點)才掛載 NFS 伺服器。在伺服器上重新啟動 NFS 服務,並使用 exportfs 檢查導出,看起來不錯。

好的,測試client1:

mount nfserver:/mnt/backups/client1 /mnt/client1

工作正常,但是,對 /mnt/client1 的任何操作都會導致:

cannot open directory /mnt/client1/: Stale file handle

採取的解決措施*(無效)*:在伺服器上重新啟動 NFS。重新啟動客戶端。lsof |grep /mnt 在客戶端和伺服器上查看是否有任何程序保持打開文件。伺服器/客戶端的權限檢查。同樣,將 NFS /etc/exports 切換回舊文件並從客戶端掛載 nfs 伺服器可以正常工作。切換回“新”方法不起作用。

經過大量的咬牙切齒、手冊頁和 STFW 只是為了找到像“重新啟動 NFS”這樣的答案,我回憶起幾年前我遇到了這個問題,並且出於某種原因 fsid 與解決方案有關。閱讀手冊頁後,在 NFS 伺服器 /etc/exports 文件中添加了以下內容:

/mnt/backups/client1 1.2.3.21(fsid=101,rw,sync,no_subtree_check)
/mnt/backups/client2 1.2.3.22(fsid=102,rw,sync,no_subtree_check)
/mnt/backups/client3 1.2.3.23(fsid=103,rw,sync,no_subtree_check)
/mnt/backups/client4 1.2.3.24(fsid=104,rw,sync,no_subtree_check)

同樣,在此操作之後,唯一執行的操作是在伺服器上執行 exportfs -ra。

現在所有客戶端都可以掛載 nfs 伺服器導出並且它們都可以工作。

為什麼這是一個解決方案?

我們應該在每次導出時使用 fsid嗎?

閱讀像這樣的手冊頁似乎並不能清楚地解釋為什麼 fsid 是一種解決方案。我有一個想法,可能是陳舊的掛載是客戶端(或者可能是伺服器端)上的某種 NFS 文件處理程序,但是在重新啟動後仍然存在這種情況似乎很奇怪。

簡而言之,fsid 是客戶端和伺服器在掛載後辨識導出的方式。

如手冊頁所述,如果未指定,fsid 將從底層文件系統派生。

四個導出具有相同的 fsid,因此當 client1 詢問其掛載的文件時,伺服器可能認為它正在嘗試訪問 client4 的導出(假設它只保留最新出現的相同 fsid。)

我想有幾種方法可以驗證這個假設,例如通過檢查 4 個客戶端中的一個(並且只有一個)可以工作。此外,僅保留 client1 導出,不保留其他 3 個,然後確認 client1 將起作用。

另請參閱此答案以獲取使用命令從客戶端查詢 fsid 的方法mountpoint -d,您可以從 4 個客戶端使用該命令來確認 4 個掛載具有相同的 fsid。

為什麼這是一個解決方案?

因為使用不同的 fsid,導出對於 NFS 伺服器來說看起來是不同的,所以它會正確地將客戶端訪問匹配到相應的掛載。

我們應該在每次導出時使用 fsid 嗎?

是的,我認為這是一個很好的做法,它可以確保您保持對底層儲存設備的控制和更改,並且導出不會影響您的客戶端。

(在我的例子中,我記得採用它是因為我的一些磁碟在 SAN 上的 NFS 伺服器有時會以不同的順序掃描磁碟,所以在重新啟動後 /dev/sdh 會突然變成 /dev/sdj。使用標籤安裝可以確保它將被安裝在正確的位置,但 fsid 會改變並且客戶端會失去.這是在 UUID 普遍存在之前,顯然現在支持並且當然是一個更好的解決方案,當磁碟時不會中斷以不同的順序掃描。但是,明確指定 fsid 仍然不是一個壞主意,讓您保持完全控制。)

引用自:https://unix.stackexchange.com/questions/479968