从 NFS 服务器读取时文件不同

从 NFS 服务器读取时文件不同

所以我有一个我们已经使用了一段时间的备份服务器,它是一台运行 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

所以每个客户似乎都有不同的图片,而且通常都不是正确的图片。我希望有人能给我一些线索,告诉我这里发生了什么以及如何修复它,因为我很困惑。

编辑:

各种文件(包括差异)可在此处找到:https://gist.github.com/Whoops/0fbe1751675d5e344d43。文件开头似乎重复了几次(7 次),每次都以相同的二进制字符串开头。另外值得注意的是,损坏似乎对于每个客户端都是一致的,即每个客户端总是看到相同的损坏版本,而不是每次读取时都看到不同的损坏。

编辑2:

NFSv3 和 4 都存在此问题。它似乎只发生在 Linux 客户端上,而不会发生在其他 FreeBSD 上。经过测试的客户端是 XenServer 6.2 和 Ubuntu 10.04,这意味着如果这是一个客户端错误,则它涵盖内核版本 2.6 - 3.11。我目前没有其他 FreeBSD 服务器可供测试。

答案1

好吧,事实证明这是 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 解决了这个问题。

相关内容