Главная | Контакты



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

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

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

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