Неожиданная ошибка в OpenZFS 2.2.0 безвозвратно повреждает данные пользователей

Вскоре после релиза OpenZFS 2.2.0, широко используемого в FreeBSD 14 и других открытых операционных системах, в любимой многими файловой системе был обнаружен серьёзный баг. Он приводит к уничтожению файлов и может присутствовать в разных версиях OpenZFS, не ограничиваясь лишь 2.2.0.

Изначально считалось, что потерю данных вызывает новая функция блочного клонирования, добавленная в версии 2.2.0, но теперь выяснилось, что она лишь усугубляет ранее неизвестный баг.

Эд Масте из Фонда FreeBSD предупредило потенциальных рисках повреждения данных, затрагивающей множество версий OpenZFS. По словам Масте, в реальных условиях баг встречается редко, да и целенаправленно воспроизвести его не всегда удаётся. Тем не менее, его воздействие крайне ощутимо и может стоить пользователям целостности всех данных.

Ошибка проявляется в повреждении содержимого файлов при их копировании. Вместо ожидаемого содержимого появляются участки нулей, смешанные с блоками данных, которые выглядят как данные в кодировке Base64. По итогу, скопированная информация становится недоступна для чтения.

Для FreeBSD 14.0 и 13.2 существует временное решение выявленной проблемы, заключающееся в установке системного параметра “vfs.zfs.dmu_offset_next_sync” в значение “0”, что возможно сделать через следующие команды:

# echo vfs.zfs.dmu_offset_next_sync=0 >> /etc/sysctl.conf

# sysctl vfs.zfs.dmu_offset_next_sync=0

Как сообщается, временное решение не исключает появление проблемы, но значительно снижает вероятность её возникновения.

Примечательно и то, что для тех пользователей, которые после прочтения этой новости сомневаются, не повредили ли случайно свои собственные данные, на текущий момент нет рабочего решения, которое могло бы просканировать файловую систему и обнаружить битые данные.

Единственный способ убедиться в этом – сравнить контрольные суммы до и после копирования, поэтому обеспокоенные пользователи, у которых нет резервных копий, хранящихся в других типах файловых систем, банально не смогут выявить проблему наверняка.

Возможная причина бага, вероятно, уже найдена. Она связана с обработкой “грязных” dnode в ZFS, что могло оставаться незамеченным годами.

Важно отметить, что дополнительным условием для повреждения данных при копировании является наличие последней версии пакета coreutils (версия выше 9.x), влияющего на функциональность команды cp.

Весьма вероятно, что за обновлением OpenZFS 2.2.1, которое просто отключает клонирование блоков, быстро последует выпуск 2.2.2, исправляющий базовую обработку dnode. Разумеется, если проблему удастся решить таким образом.

Public Release.