mount.nfs:陳舊文件句柄錯誤 - 無法解除安裝
每次我嘗試掛載 NFS 共享時,我都會得到以下資訊:
>> mount -t nfs gitlab-replica-storage.blah.com:/export/registry-gitlab-prod-data-vol /mnt/test mount.nfs: Stale file handle
問題是我無法解除安裝,正如它所說:
>> umount -f -l /mnt/test umount: /mnt/test: not mounted
我嘗試檢查是否有任何程序正在使用掛載點,但事實並非如此。
還有其他解決方法嗎?
作為澄清:
- 我可以將它安裝在另一台機器上。
- 我無法將它安裝到受影響機器上的另一個安裝點。
最初引入錯誤 ESTALE 是為了處理 NFS 用來唯一標識伺服器上的文件的文件句柄不再引用伺服器上的有效文件的情況。當文件在伺服器上被刪除時,可能會發生這種情況,無論是通過伺服器上的應用程序、其他訪問伺服器的客戶端,或者有時甚至是來自同一客戶端的另一個掛載文件系統。當文件駐留在不再導出的文件系統上時,NFS 伺服器也會返回此錯誤。此外,一些 NFS 伺服器甚至會在重命名文件時更改文件句柄,儘管不鼓勵這種做法。
即使在伺服器上重新創建了同名的文件或目錄,而客戶端不知道它,也會發生此錯誤。文件句柄指的是文件的特定實例,刪除文件然後重新創建它會創建文件的新實例。
當使用記憶體的目錄資訊將路徑名轉換為 dentry/inode 對時,通常會看到錯誤 ESTALE。當後續操作發送到 NFS 伺服器時,會發現該資訊已過時或陳舊。當使用記憶體資訊將路徑名轉換為dentry/inode 對時,這很容易在諸如stat(2) 之類的系統呼叫中發生,但是隨後對伺服器的GETATTR 呼叫發現文件句柄不再有效。
當在查找要查找的路徑名的不同組件之間或在成功查找和後續操作之間在伺服器上進行更改時,也會發生此錯誤。
關於ESTALE的原始連結:ESTALE LWN。
我建議您檢查 NFS 伺服器上的文件和目錄,或者告訴 NFS 伺服器的管理員來執行此操作。
NFS 伺服器上可能存在一些舊的 pagecache、inode、dentry 記憶體條目。請清潔它:
# To free pagecache echo 1 > /proc/sys/vm/drop_caches # To free dentries and inodes echo 2 > /proc/sys/vm/drop_caches # To free pagecache, dentries and inodes echo 3 > /proc/sys/vm/drop_caches
如果伺服器對該客戶端有一些陳舊的導出條目,則A
mount -t nfs
失敗。Stale file handle
範例場景:當伺服器重新啟動而客戶端未先解除安裝 nfs 卷時,可能會發生這種情況。當伺服器返回並且客戶端然後解除安裝並嘗試安裝 nfs 卷時,伺服器可能會響應:
mount.nfs: Stale file handle
您可以通過查看
/proc/fs/nfs/exports
或來檢查這一點/proc/fs/nfsd/exports
。如果有客戶的條目,它可能是一個陳舊的條目。您可以通過顯式取消導出和重新導出伺服器上的相關導出來解決此問題。例如,要對所有導出執行此操作:
# exportfs -ua # cat /proc/fs/nfs/exports # exportfs -a
在此之後,客戶端
mount -t nfs ...
應該成功。請注意,mount yielding
ESTALE
與其他一些系統呼叫(如 open/readdir/unlink/chdir …)返回ESTALE
. 它的導出是陳舊的,而文件句柄是陳舊的。NFS 很容易發生陳舊的文件句柄(例如,客戶端有文件句柄,但文件在伺服器上被刪除)。