Я получил сообщения в /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
файлы, которые не могли быть прочитаны.
Найдите, в каком разделе находится сектор, запустив fdisk -lu /dev/sdb
. Предположим, что это «sdb2», который начинается в секторе 45612307.
Вычтите это из 95891008, чтобы получить 50278701.
Затем определите, сколько секторов в блоке: tune2fs -l /dev/sdb2 | grep Block
. Допустим, это 4096.
Рассчитайте соотношение блок / сектор: 512 байт / сектор / 4096 байт / блок = 0,125 блока / сектор.
Рассчитываем блок из сектора: 50278701 * 0,125 = 6284837,625.
Используйте debugfs, чтобы узнать, кто использует блок. Если icheck 6284837
возвращает индекс 12345, затем запускается ncheck 12345
.
Предостережения: вам может потребоваться отключить ведение журнала. Это может не работать с ext4.
Примерная идея -
debugfs
команды testb / ncheck / icheck, чтобы узнать, используется ли блок, и имя файла (ов), которые его используютEсть bad block HOWTO на сайте проекта smartmontools описывая процесс более подробно.