Может ли ext4 обнаружить поврежденное содержимое файла?

Может ли файловая система ext4 обнаруживать повреждение содержимого файлов? Если да, то он включен по умолчанию и как я могу проверить поврежденные данные?

Я прочитал, что ext4 поддерживает контрольные суммы для метаданных файла и его журнала, но мне не удалось найти информацию о контрольных суммах для фактического содержимого файла.

Для ясности: я хочу знать, изменился ли файл с момента последней операции записи.

Ответ 1

"Могла ли файловая система ext4 обнаруживать повреждение содержимого файлов?" Не в том смысле, которого вы ожидаете. Он выполняет ведение журнала, создавая логическую копию {before vs after}, чтобы обеспечить завершение io.

CRC/контрольная сумма - это тест для модификации из известного состояния, и хотя CRC или контрольная сумма могут не сравниться с оригиналом, это не означает, что файл затем "поврежден" (он же недействителен) - это только говорит он был изменен. Строго говоря, одной формой "коррупции" было бы изменить "магическое число" в начале файла, например, изменить% PDF на% xYz -, что сделало бы контент непригодным для использования в любой программе.

"... чтобы узнать, изменился ли файл с момента последней операции записи". Системы, которые отслеживают mtime(), будут делать это равномерно, поэтому каждая запись будет изменять mtime(), делая ваш запрос невозможным.

Единственный способ, с помощью которого mtime() не отражал бы последнюю запись io, было бы деградацией мультимедиа.

Ответ 2

Нет, ext4 не может и не может обнаружить повреждение содержимого файла.

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

Они делают это, вычисляя и сохраняя CRC для каждого записанного блока данных и проверяя CRC или каждый прочитанный блок данных. Если CRC не соответствует данным, последний не предоставляется вызывающему абоненту, и либо RAID допускает использование альтернативного блока, либо сообщается об ошибке I/O.

Процесс чтения никогда не будет получать поврежденные данные, либо это правильно, либо чтение не выполняется.