NFS 客戶端,ZFS 伺服器 ZoL:更改文件的 cat 以未找到結尾
自從我們的客戶從 Ubuntu 12.04 更新到 Ubuntu 14.04 後,我們遇到了麻煩。
行為:
在客戶端 AI 上更改 nfs 共享上的現有文件 foo。在客戶端 BI 上做一個 cat foo。
安裝後第一次工作。cat 顯示 foo 的內容。但是,如果我再次更改客戶端 A 上的 foo 並在 BI 上執行 cat 得到錯誤:cat: foo: No such file or directory
在 B 上執行 a
ls
可以解決問題並cat foo
再次顯示新內容。但是,如果我再次更改客戶端 A 上的 foo ,客戶端 B 上的 cat 將無法工作。分析:
如果 B 上的程序首先執行系統呼叫“stat”,則一切正常。但是如果像 cat 這樣的程序直接使用系統呼叫 open 是找不到文件的!
使用 tcpdump 和 wireshark 我可以看到 Ubuntu 12.04 使用正確的(更新的)文件句柄在“PUTFH”下的 NFS 包中呼叫,但在 14.04 中,文件句柄是錯誤的(等於舊文件句柄。在系統 A 上進行更改之前)。
現在非常有趣的部分:如果我在伺服器站點上的 nfs 共享駐留在 ext4 文件系統上,並且我通過 /etc/exports 共享它,則 nfs 伺服器會以錯誤程式碼 NFS4ERR_STALE 回答。客戶端 (B) 將使用正確的文件句柄進行第二次請求,一切正常。即使在 14.04。
如果我在伺服器站點上的 nfs 共享駐留在 ZFS 文件系統(ZoL 0.6.4.1、CentOS 7 和 Ubuntu 14.04)上,並且我通過 sharefs 選項或 /etx/exports 共享它,則 nfs 伺服器會以錯誤程式碼 NFS4ERR_NOENT 回答。客戶端將失敗。
問題: 1.如何讓較新的客戶端(14.04+)像在 12.04 上一樣正確更新文件句柄 2.(或者)如何讓伺服器在 ZFS 文件系統上使用 NFS4ERR_STALE 回答?或者根據規範,伺服器答案應該如何?
問候喬爾格
在 Linux 上的 ZFS 中修補:
https://github.com/zfsonlinux/zfs/pull/3404
獲取 git 版本並編譯它:
git clone https://github.com/zfsonlinux/zfs.git