从NFS服务器读取文件是不同的

所以我有一个我们已经使用了一段时间的备份服务器,它是一个运行zfs并通过NFS提供服务的FreeBSD服务器。 导出很简单: /backup/vm -maproot=root -alldirs 。 如果相关,则通过zfsconfiguration:

 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我可以很容易地find像这样的行:

 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 

所以每个客户似乎都有不同的画面,通常不是正确的。 我希望有人能给我一些线索,知道这里发生了什么,以及如何解决这个问题,因为我很困难。

编辑:

各种文件,包括差异可以在这里find: https : //gist.github.com/Whoops/0fbe1751675d5e344d43 。 看起来,文件的开始重复了几次(7次),每次前面都有相同的二进制string。 另外有意思的是,腐败对于每个客户来说似乎是一致的,即每个客户总是看到相同的损坏版本,而不是在每个读取上有不同的损坏。

EDIT2:

这个问题同时出现在NFSv3和4.这似乎只发生在Linux客户端,而不是其他FreeBSDs。 经testing的客户端是XenServer 6.2和Ubuntu 10.04,这意味着如果是客户端错误,它将跨越内核版本2.6 – 3.11。 我目前还没有其他的FreeBSD服务器可以testing。

好吧,原来这是FreeBSD 10.0-Release中的bxe驱动程序的一个bug

启用TSO(TCP分段卸载)function时,bxe(4)驱动程序可能导致数据包损坏。 此function默认启用,可以使用ifconfig(8)的-tso参数禁用。 它可以在rc.conf(5)中指定,如下所示:

ifconfig_bxe0 =“DHCP -tso”

这个bug已经在FreeBSD 10.0-STABLE上修复了。

非常感谢FreeBSD论坛上的junovitch来解决这个问题。