Назад | Перейти на главную страницу

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

Я получил сообщения в /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 файлы, которые не могли быть прочитаны.

  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.

Примерная идея -

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

Eсть bad block HOWTO на сайте проекта smartmontools описывая процесс более подробно.