В логе smartd появились подобные свидетельства наличия нечитаемых секторов на диске: smartd[798]: Device: /dev/ad5, 15 Currently unreadable (pending) sectors
smartd[798]: Device: /dev/ad5, 15 Offline uncorrectable sectors
SMART тестирование подтвердило подозрения:
Запускаем фоновый тест диска, не мешающий основной работе:
smartctl -t long /dev/ad5
Ждем завершения периодически просматривая статус:
smartctl -l selftest /dev/ad5
В итоге смотрим содержимое лога, в самом конце вывода:
smartctl -a /dev/ad5
Имеем:
# 1 Extended offline Completed: read failure 90% 2916 10373954
Выявляем полный список сбойных секторов, путем чтения всех данных с диска:
dd if=/dev/ad5 of=/dev/null bs=512 conv=noerror,sync
В один прекрасный момент появятся надписи вида:
dd: /dev/ad5: Input/output error
10373954+0 records in
10373954+0 records out
5311464448 bytes transferred in 2427.397393 secs (2188131 bytes/sec)
В системном логе увидим:
kernel: ad5: TIMEOUT - READ_DMA retrying (1 retry left) LBA=10373954
kernel: ad5: TIMEOUT - READ_DMA retrying (0 retries left) LBA=10373954
....
kernel: ad5: FAILURE - READ_DMA timed out LBA=10374109
kernel: ad5: TIMEOUT - READ_DMA retrying (1 retry left) LBA=10374113
Проверяем, каждый участок еще раз:
dd if=/dev/ad5 of=/dev/null bs=512 count=1 skip=10373954 conv=noerror,sync
Смотрим какой файл в ФС подпадает под этот блок.
Смотрим и примерно вычисляем номер раздела на который приходится сбойный сектор (LBA 10373954):
fdisk -s /dev/ad5
/dev/ad5: 775221 cyl 16 hd 63 sec
Part Start Size Type Flags
1: 63 398444067 0xa5 0x80
2: 398444130 382973535 0xa5 0x80
10373954 - 63 = 10373891
disklabel /dev/ad5s1
# /dev/ad5s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 2097152 0 4.2BSD 2048 16384 28552
b: 4194304 2097152 swap
c: 398444067 0 unused 0 0 # "raw" part
d: 2097152 6291456 4.2BSD 2048 16384 28552
e: 10485760 8388608 4.2BSD 2048 16384 28552
f: 104857600 18874368 4.2BSD 2048 16384 28552
g: 104857600 123731968 4.2BSD 2048 16384 28552
h: 162127234 228589568 4.2BSD 2048 16384 28552
Видим, что 10373891 приходится на раздел /dev/ad5s1e
Расчитываем смещение относительно начала раздела:
10373891 - 8388608 = 1985283
Находим иноду, которой принадлежит заданный блок:
fsdb -r /dev/ad5s1e
findblk 1985283
повторяем для каждого сбойного сектора
(для Linux нужно использовать debugfs - http://smartmontools.sourceforge.net/BadBlockHowTo.txt)
Пытаемся записать данные в сбойный сектор, чтобы инициировать процесс
ремапинга на диске.
sysctl kern.geom.debugflags=16 # иначе будет dd: /dev/ad5: Operation not permitted)
dd if=/dev/zero of=/dev/ad5 bs=512 count=1 skip=10373954 conv=noerror,sync
sysctl kern.geom.debugflags=0
Если после записи сектор начал читаться - все ok,
если нет - резервная область на диске уже заполнена, пробуем запретить обращещние окружающих секторов в ФС:
man badsect
/dev/ad5s1e примонтирован как /usr, создаем директорию /usr/BAD и выполняем
badsect /usr/BAD 1985283
fsck -y /dev/ad5s1e
Полезные порты:
/usr/ports/sysutils/recoverdm
/usr/ports/sysutils/diskcheckd
URL:
Обсуждается: https://www.opennet.ru/tips/info/1720.shtml