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

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

РЕДАКТИРОВАТЬ: я попытался btrfs check --fix-crc как предложено в другом потоке, но, похоже, он не понимает флаг fix-crc , и я не могу найти его на странице руководства. Может быть, это устарело?

Я знаю, что есть btrfs check --init-csum-tree , но, насколько я знаю, он полностью пересчитывает все контрольные суммы, что означает полное перечитывание всего содержимого жесткого диска.

РЕДАКТИРОВАТЬ 2: я смог получить содержимое файла, которые не были затронуты ddrescue. Однако я также хотел бы получить доступ к содержимому поврежденного сектора (поскольку ошибки ввода-вывода генерируются только из-за ошибки контрольной суммы btrfs, после диска все в порядке).

В журнале dmesg отображается только csum failed root 5 ino 130384 off 260317184 csum 0x8068db14 expected csum 0x240ab6d1 mirror 1 Данное смещение является только локальным для файла, которое невозможно прочитать. Если бы я мог каким-то образом получить поврежденный блок partion, я мог бы легко прочитать содержимое, используя dd .

1 ответ1

0

Решение не относится к Btrfs.

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

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

ddrescue /path/to/affected/file /where/to/save/copy mapfile

В моем Kubuntu ddrescue использует размер сектора по умолчанию 512 байт (-b 512). Поскольку любое оборудование использует 512 или 4096 и Btrfs обычно (?) использует не менее 4096 байт, значение по умолчанию должно быть ОК, чтобы получить как можно больше файла с помощью этого метода.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .