Как определить, какой файл / индекс занимает данный сектор

Я получил сообщения в /var/log/kern.log которые указывают на сбой диска. Сообщения произошли при копировании моего $HOME между дисками (ext4 -> ext3):

[ 5733.186033] sd 4:0:0:0: [sdb] Unhandled sense code
[ 5733.186038] sd 4:0:0:0: [sdb]  Result: hostbyte=invalid driverbyte=DRIVER_SENSE
[ 5733.186042] sd 4:0:0:0: [sdb]  Sense Key : Medium Error [current] 
[ 5733.186048] sd 4:0:0:0: [sdb]  Add. Sense: Unrecovered read error
[ 5733.186053] sd 4:0:0:0: [sdb] CDB: Read(10): 28 00 05 b7 2e 40 00 00 08 00
[ 5733.186064] end_request: critical target error, dev sdb, sector 95891008

Сообщения приходят в больших количествах, это один из тех массовых. sdb это исходный диск.

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

find . -type f -print \
               -exec cp \{\} /dev/null \; \
               -exec tail -n 1 /var/log/kern.log \;

ОС: Ubuntu Oneiric.

РЕДАКТИРОВАТЬ: Команда выше также выводит на stderr файлы, которые не могут быть прочитаны.

2 ответа

Решение

Грубая идея была бы

  1. сделать некоторые вычисления, чтобы узнать номер блока файловой системы на основе номера физического сектора
  2. использование debugfs Команды testb/ncheck/icheck, чтобы узнать, используется ли блок, и имя файла (ов), которые его используют

На сайте проекта smartmontools есть плохой блок HOWTO, описывающий процесс более подробно.

  1. Найдите раздел, в котором находится сектор, запустив fdisk -lu /dev/sdb, Предположим, что это "sdb2", который начинается в секторе 45612307.

  2. Вычтите это из 95891008, чтобы получить 50278701.

  3. Далее определите, сколько секторов на блок: tune2fs -l /dev/sdb2 | grep Block, Предположим, это 4096.

  4. Рассчитать соотношение блоков / секторов: 512 байт / сектор / 4096 байт / блок = 0,125 блоков / сектор.

  5. Рассчитаем блок из сектора: 50278701 * 0,125 = 6284837,625.

  6. Используйте debugfs, чтобы узнать, кто использует блок. Если icheck 6284837 возвращает индекс 12345 и запускается ncheck 12345,

Предостережения: вам может потребоваться отключить ведение журнала. Это может не работать с ext4.

Другие вопросы по тегам