Linux

從 NFS 伺服器讀取時文件不同

  • September 9, 2014

所以我有一個我們已經使用了一段時間的備份伺服器,它是一個執行 zfs 並通過 NFS 提供服務的 FreeBSD 伺服器。導出很簡單:/backup/vm -maproot=root -alldirs. 如果相關,那是通過 zfs 配置的:

zfs get sharenfs
backup/vm sharenfs  -maproot=root -alldirs  local

它執行良好,我們甚至恢復了這些備份。今天我純屬偶然發現,從 nfs 共享讀取的文件與寫入的內容(以及伺服器上的內容)不匹配。

展示:在我們擁有的伺服器上

pg11.txt (downloaded on the server)
pg11.txt.1 (uploaded by a client over nfs)

兩者都是愛麗絲夢遊仙境,從這裡下載: http: //www.gutenberg.org/cache/epub/11/pg11.txt

在 nfs 伺服器上:

md5 pg11.txt*
MD5 (pg11.txt) = eff1e5d84df1d3a543d1c578192a2367
MD5 (pg11.txt.1) = eff1e5d84df1d3a543d1c578192a2367

到現在為止還挺好。現在在客戶端:

md5sum pg11.txt*
4d79d99b8eebe364cddf5ce42949bc3e  pg11.txt
eff1e5d84df1d3a543d1c578192a2367  pg11.txt.1

什麼?pg11.txt從客戶端閱讀我可以很容易地找到如下行:

Alice started to her feet, for it flashed across her <80>^A^@<80>^V<A0>R+^@^@^@^A^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^A^@^@^@^A^@^@^A<A4>^@^@^@^A^^@^@^@^@^@^@^@^@^@^@^@^@^B<8E>^^@^@^@^@^@^B^B^@^@^@^@f7<D9>^@^@^@^@^@^@^V^V<EE>3^@^@^@^@^@^@^BFT^B<8C<FF>^E<D9>m(T^B<8C><E7>^]<CE>[<95>T^B<8C><E7>^]<CE>[<95>^@^A^@^@^@^@^@^@^@^A^@^@<U+FEFF>Project Gutenberg's Alice's Adventures in Wonderland, by Lewis Carroll

現在在不同的客戶端上:

md5sum pg11.txt*
eff1e5d84df1d3a543d1c578192a2367  pg11.txt
b9c4076a85a151e730b9a9077fd6023b  pg11.txt.1

第二個客戶端,但通過 tcp:

md5sum  pg11.txt*
d80ce8c17092b1b759295e27a3c0af60  pg11.txt
14cde84fd05bd39845c9bb8fc0042eda  pg11.txt.1

以前的客戶端都是 XenServer 6.2,如果我嘗試 Ubuntu 系統:

md5sum pg11.txt*
eff1e5d84df1d3a543d1c578192a2367  pg11.txt
81ca4f5b9b334d00a07fcb16f444a60a  pg11.txt.1

所以每個客戶似乎都有不同的圖片,而且通常不是正確的。我希望有人能給我一些關於這裡發生了什麼以及如何解決它的線索,因為我很困惑。

編輯:

可以在這裡找到各種文件,包括 diff:https ://gist.github.com/Whoops/0fbe1751675d5e344d43 。文件的開頭似乎重複了幾 (7) 次,每次都以相同的二進製字元串開頭。另外有趣的是,每個客戶端的損壞似乎是一致的,即每個客戶端總是看到相同的損壞版本,而不是每次讀取時都看到不同的損壞。

編輯2:

NFSv3 和 4 都會出現這個問題。它似乎只出現在 Linux 客戶端上,而不是其他 FreeBSD。測試的客戶端是 XenServer 6.2 和 Ubuntu 10.04,這意味著如果它是客戶端錯誤,它跨越核心版本 2.6 - 3.11。我目前沒有另一個 FreeBSD 伺服器可供測試。

好的,事實證明這是 FreeBSD 10.0-Release 中的 bxe 驅動程序的一個錯誤

當啟用 TSO(TCP 分段解除安裝)功能時,bxe(4) 驅動程序可能會導致數據包損壞。此功能預設啟用,可以使用 ifconfig(8) 的 -tso 參數禁用。它可以在 rc.conf(5) 中指定,如下所示:

ifconfig_bxe0=“DHCP -tso”

此錯誤已在 FreeBSD 10.0-STABLE 上得到修復。

非常感謝 FreeBSD 論壇上的 junovitch 解決了這個問題。

引用自:https://serverfault.com/questions/625255