web-dev-qa-db-ja.com

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

2番目のクライアントですがtcpを超えています:

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

Ubuntuシステムを試してみると、両方のXenServer 6.2が存在する以前のクライアント:

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

そのため、クライアントごとに異なる状況が見られ、通常は適切な状況ではありません。私はよく困惑しているので、誰かがここで何が起こっているのか、そしてそれを修正する方法について私にいくつかの手がかりを与えてくれることを願っています。

編集:

Diffを含むさまざまなファイルはここにあります: https://Gist.github.com/Whoops/0fbe1751675d5e344d4 。ファイルの開始が数回繰り返され、その前に毎回同じバイナリ文字列が続くようです。また、破損はクライアントごとに一貫しているように見えることに注意してください。つまり、各クライアントには、読み取りごとに異なる破損ではなく、常に同じ破損バージョンが表示されます。

Edit2:

この問題はNFSv3と4の両方で発生します。Linuxクライアントでのみ発生し、他のFreeBSDでは発生しないようです。テストされたクライアントはXenServer6.2とUbuntu10.04です。つまり、クライアントのバグの場合は、カーネルバージョン2.6〜3.11にまたがっています。私は現在、テストする別のFreeBSDサーバーを持っていません。

5
Walton Hoops

さて、これはFreeBSD10.0のbxeドライバのバグであることがわかりました-具体的にリリースしてください

Bxe(4)ドライバーは、TSO(TCPセグメンテーションオフロード)機能が有効になっている場合にパケットの破損を引き起こす可能性があります。この機能はデフォルトで有効になっており、ifconfig(8)の-tsoパラメーターを使用して無効にできます。次のようにrc.conf(5)で指定できます。

ifconfig_bxe0 = "DHCP -tso"

このバグはFreeBSD10.0-STABLEで修正されています。

これを理解してくれたFreeBSDフォーラムのjunovitchに感謝します。

3
Walton Hoops