dmesg: Unrecovered read error — auto reallocate failed

// Ноябрь 17th, 2014 // hdparm, linux, recovery, smartctl

После внезапной перезагрузки одного сервера из-за сбоя питания — он отметился резким падением производительности, а один сервис вообще отказывался стартовать. Вывод лога dmesg сразу подсказал, в чем проблема:

 [ 105.283113] ata2.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x0
 [ 105.283113] ata2.00: BMDMA stat 0x64
 [ 105.283113] ata2.00: cmd c8/00:a0:b6:cb:5e/00:00:00:00:00/e3 tag 0 dma 81920 in
 [ 105.283113] res 51/40:00:4f:cc:5e/00:00:00:00:00/e3 Emask 0x9 (media error)
 [ 105.283113] ata2.00: status: { DRDY ERR }
 [ 105.283113] ata2.00: error: { UNC }
 [ 105.309608] ata2.00: configured for UDMA/133
 [ 105.309632] sd 1:0:0:0: [sda] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE,SUGGEST_OK
 [ 105.309639] sd 1:0:0:0: [sda] Sense Key : Medium Error [current] [descriptor]
 [ 105.309646] Descriptor sense data with sense descriptors (in hex):
 [ 105.309650] 72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
 [ 105.309664] 03 5e cc 4f
 [ 105.309670] sd 1:0:0:0: [sda] Add. Sense: Unrecovered read error - auto reallocate failed
 [ 105.309678] end_request: I/O error, dev sda, sector 56544335

И пока сервер ждет замены накопителя с этим нужно что-то сделать.
Нам потребует две утилиты hdparm и smartctl,

установить их можно так:

apt-get install hdparm smartmontools

Пробуем прочитать руками указанный блок:

hdparm --read-sector 56544335 /dev/sda

предсказуемо в ответ получаем:

/dev/sda:
reading sector 56544335: FAILED: Input/output error

Чаще всего это означает, что контрольная сумма сектора не сходится с контрольной суммой содержимого, это конечно не значит что сектор совсем мертв, но все же уже является поводом для беспокойства и причиной для замены накопителя. Если сектор еще живой — можно попробовать насильно затереть его нулями, и он вернутся к жизни (на долго ли?). Следующая команда затирает сектор нулями, вы должны понимать, что это процесс необратимый и в этом секторе наверняка содержится/содержалась какая-то полезная информация, если это какой-то лог файл — наверняка не жалко будет, но если на вашем накопителе есть, допустим, БД с бухгалтерией или еще какие важные данные, вы должны осознавать что это действие может безвозвратно повредить или вообще удалить какой-то файл.

hdparm --write-sector 56544335 --yes-i-know-what-i-am-doing /dev/sda

и еще раз попытаемся считать данные из сектора:

/dev/sda:
reading sector 56544335: succeeded
0000 0000 0000 0000 0000 0000 0000 0000
...
0000 0000 0000 0000 0000 0000 0000 0000

Мне повезло, сектор жив.
Так же стоит детальнее взглянуть на лог и проверить наличие других сбойных секторов:

dmesg | egrep 'I/O.*sector'

Для проверки поверхности диска на наличие сбойных секторов запустим smartctl, вы так же должны понимать, что тест поверхности может очень сильно деградировать производительность, особенно если действительно существуют проблемы на диске и может занимать длительное время в зависимости от объема накопителя:

smartctl -t long /dev/sda

мне радостно сообщили, что тест начат и ориентировочное время 45 минут.
Если что-то пошло не так как вам хотелось — отменить тест можно командой:

smartctl -X

Поглядывать на результаты тесто можно так:

smartctl -l selftest /dev/sda

Пока тест не окончен будет примерно следующее сообщение:

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
No self-tests have been logged. [To run self-tests, use: smartctl -t]

по окончанию выглядеть будет так:

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Extended offline Completed without error 00% 24335 -

что не может не радовать, тест пройден, более ошибок не обнаружено.

Leave a Reply