Восстановление файловой системы ext4 с поврежденным журналом

9

У меня есть жесткий диск, на котором, похоже, возникла какая-то аппаратная проблема в журнале. Это предотвращает загрузку диска. Запуск mount -r -t ext4 /dev/sda5 /mnt/rootрезультатов в следующем ядре извергается:

[ 1420.671055] ata1.00: exception Emask 0x0 SAct 0x1000000 SErr 0x0 action 0x0
[ 1420.673862] ata1.00: irq_stat 0x40000008
[ 1420.676600] ata1.00: failed command: READ FPDMA QUEUED
[ 1420.679326] ata1.00: cmd 60/40:c0:a8:9d:0a/00:00:08:00:00/40 tag 24 ncq 32768 in
[ 1420.679326]          res 41/40:40:e1:9d:0a/00:00:08:00:00/00 Emask 0x409 (media error) <F>
[ 1420.685014] ata1.00: status: { DRDY ERR }
[ 1420.687858] ata1.00: error: { UNC }
[ 1420.761064] ata1.00: configured for UDMA/133
[ 1420.763863] sd 0:0:0:0: >[sda] Unhandled sense code
[ 1420.766653] sd 0:0:0:0: >[sda]  
[ 1420.769364] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 1420.772104] sd 0:0:0:0: >[sda]  
[ 1420.774780] Sense Key : Medium Error [current] [descriptor]
[ 1420.777491] Descriptor sense data with sense descriptors (in hex):
[ 1420.780249]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00 
[ 1420.783175]         08 0a 9d e1 
[ 1420.785972] sd 0:0:0:0: >[sda]  
[ 1420.788730] Add. Sense: Unrecovered read error - auto reallocate failed
[ 1420.791545] sd 0:0:0:0: >[sda] CDB: 
[ 1420.794331] Read(10): 28 00 08 0a 9d a8 00 00 40 00
[ 1420.797242] end_request: I/O error, dev sda, sector 134913505
[ 1420.800072] ata1: EH complete
[ 1420.800077] JBD2: Failed to read block at offset 2748
[ 1420.812529] JBD2: recovery failed
[ 1420.815275] EXT4-fs (sda5): error loading journal

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

JSB ձոգչ
источник
Две вещи: обязательно отсоедините и снова подключите кабели. Если возможно, даже избавиться от проблемы с оборудованием временно. Если это так, получите новые кабели. В противном случае также попробуйте диск (и) в другом компьютере с другими кабелями.
0xC0000022L
Вы пробовали fsckв файловую систему?
psusi
У меня была похожая проблема сегодня, когда мне каким-то образом удалось повредить журнал при разблокировке моего зашифрованного раздела ext4. Я мог только монтировать только для чтения. Мне удалось это исправить, запустив процедуру «Проверка» для раздела в GParted. Процедура «Проверка» обнаружила проблемы с журналом и исправила их автоматически.
Навнав

Ответы:

8

Чтобы смонтировать его только для чтения, без повторного воспроизведения журнала, чтобы вы могли получить доступ к своим файлам (вы, вероятно, потеряете некоторые изменения, которые еще не были зафиксированы в обычном fs):

mount -o ro,noload ...

Рональд
источник
7

Посмотрите на вывод smartctl -a /dev/sda. Если проблема не в кабеле, возможно, диск умирает. Если у вас нет последней резервной копии, попробуйте скопировать содержимое блочного устройства (без монтирования), используя dd_rescue или dd с соответствующими параметрами.

После этого вы можете попробовать hdparm --write-sector(всегда смешно эти «ОЧЕНЬ ОПАСНЫЕ» варианты ...).

Другим вариантом является создание устройства DM, которое обходит дефектные сектора. Это не восстанавливает их содержимое, конечно. Вы должны преобразовать смещение sda (134913505) в смещение sda5 (узнать номер первого сектора sda5 и вычесть его). Давайте предположим, что смещение sda5 равно 12345. Вы создаете блочное устройство, сектор которого 12345 не отображается на sda5, а где-то еще (например, устройство петли). Определение устройства (для dmsetup create) выглядит так:

0 12345 linear /dev/sda5 0
12345 1 linear /dev/loop0 0
12346 99987653 /dev/sda5 12345

# format:
# logical_start_sector num_sectors linear destination_device start_sector

Вам не повезет настолько, что есть только один дефектный сектор. Вы можете отобразить столько, сколько хотите (в результате устройство DM поставляет нули для этих секторов, но доступно для записи), но вычисление смещений в loop0 может стать забавным. Другим вариантом может быть использование виртуального устройства того же размера для переназначения и использование либо тонкой инициализации, либо моментального снимка (с небольшим размером фрагмента, например, 1 сектор) нулевого целевого устройства.

Редактировать 1

Конечно, устройство цикла не должно указывать на файл на том же диске (sda).

Хауке Лагинг
источник
Очень хороший момент. --write-sectorэто далеко от "опасного". На самом деле, это действительно идеальный вариант для использования в случаях , когда некоторые коррумпированные одиночные сектора мешают вам получать непрерывное изображение сырьевого сектора ( ddбудет выручать с «Ошибкой устройством ввода / вывода», некоторые винчестеры даже требует , чтобы отключить питание машины ( !) чтобы получить признание ОС снова). Тем не менее, вы должны знать о сценариях оболочки, если вы хотите использовать --write-sectorдля диапазонов секторов .
синтаксическая ошибка
0

Вы можете загрузиться в режиме восстановления, в котором ФС будет монтироваться только для чтения, и скопировать ваши вещи.

schaiba
источник
Я монтирую только для чтения. Я исправил командную строку, показанную выше, чтобы сделать это более понятным.
JSB ձոգչ
И вы можете получить доступ к диску?
Щайба
Нет. Попытка смонтировать RO диска (или в R / W, это не имеет значения) приводит к ошибке, показанной выше.
JSB ձոգչ
Тогда предложение с заменой кабеля может пригодиться. А что касается вашего вопроса, журнал не может быть перемещен так, как вы хотите.
Щайба