Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы

Как избавиться от нечитаемых секторов на диске

В логе 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
22.07.2008

Материал взят с сайта: http://www.opennet.ru/tips/info/1720.shtml

Главная > Программы