Итак, у меня есть резервный сервер, который мы используем в течение некоторого времени, это сервер FreeBSD, на котором запущен zfs и обслуживается через NFS. Экспорт прост: /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
Предыдущие клиенты, в которых использовался XenServer 6.2, если я попробую систему Ubuntu:
md5sum pg11.txt*
eff1e5d84df1d3a543d1c578192a2367 pg11.txt
81ca4f5b9b334d00a07fcb16f444a60a pg11.txt.1
Таким образом, кажется, что у каждого клиента своя картина, и обычно она не совсем правильная. Я надеюсь, что кто-то может дать мне ключ к пониманию того, что здесь происходит, и как это исправить, потому что я в тупике.
Редактировать:
Различные файлы, включая diff, можно найти здесь: https://gist.github.com/Whoops/0fbe1751675d5e344d43. Похоже, что начало файла повторяется несколько (7) раз, каждый раз ему предшествует одна и та же двоичная строка. Также интересно отметить, что повреждения, по-видимому, одинаковы для каждого клиента, то есть каждый клиент всегда видит одну и ту же поврежденную версию, а не разные повреждения при каждом чтении.
Edit2:
Проблема возникает как с NFSv3, так и с 4. Похоже, что она возникает только на клиентах Linux, а не на других FreeBSD. Протестированными клиентами являются XenServer 6.2 и Ubuntu 10.04, что означает, что если это ошибка клиента, она распространяется на версии ядра 2.6 - 3.11. В настоящее время у меня нет другого сервера FreeBSD для тестирования.
Итак, получается, что это ошибка драйвера bxe в FreeBSD 10.0-Release.
Драйвер bxe (4) может вызвать повреждение пакета, если включена функция TSO (разгрузка сегментации TCP). Эта функция включена по умолчанию и может быть отключена с помощью параметра -tso в ifconfig (8). Его можно указать в rc.conf (5) следующим образом:
ifconfig_bxe0 = "DHCP -tso"
Эта ошибка исправлена в FreeBSD 10.0-STABLE.
Большое спасибо junovitch на форумах FreeBSD за то, что выяснили это.