Как вправить мозги винту


Опубликовано:   |   Read in English   |   Leer en español   |   Больше записей о hardware magic

Я тут на днях спас пару своих винтов в некотором смысле шаманским способом.

Симптомы были практически идентичны: во время загрузки система вываливала в терминал тучу ошибок, и такие же ошибки регулярно сыпались в логи. В общем, наблюдалось что-то подобное:

Mar 31 07:31:31 rohan kernel: [    1.640757] ata5.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x0
Mar 31 07:31:31 rohan kernel: [    1.641114] ata5.00: irq_stat 0x40000008
Mar 31 07:31:31 rohan kernel: [    1.641317] ata5.00: failed command: READ FPDMA QUEUED
Mar 31 07:31:31 rohan kernel: [    1.641582] ata5.00: cmd 60/08:00:50:00:02/00:00:00:00:00/40 tag 0 ncq 4096 in
Mar 31 07:31:31 rohan kernel: [    1.641582]          res 41/40:00:52:00:02/00:00:00:00:00/40 Emask 0x409 (media error) <F>
Mar 31 07:31:31 rohan kernel: [    1.642365] ata5.00: status: { DRDY ERR }
Mar 31 07:31:31 rohan kernel: [    1.642570] ata5.00: error: { UNC }
Mar 31 07:31:31 rohan kernel: [    1.650046] ata5.00: configured for UDMA/133
Mar 31 07:31:31 rohan kernel: [    1.650057] sd 4:0:0:0: [sdb] Unhandled sense code
Mar 31 07:31:31 rohan kernel: [    1.650061] sd 4:0:0:0: [sdb]
Mar 31 07:31:31 rohan kernel: [    1.650064] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
Mar 31 07:31:31 rohan kernel: [    1.650067] sd 4:0:0:0: [sdb]
Mar 31 07:31:31 rohan kernel: [    1.650069] Sense Key : Medium Error [current] [descriptor]
Mar 31 07:31:31 rohan kernel: [    1.650075] Descriptor sense data with sense descriptors (in hex):
Mar 31 07:31:31 rohan kernel: [    1.650078]         72 03 11 04 00 00 00 0c 00 0a 80 00 00 00 00 00
Mar 31 07:31:31 rohan kernel: [    1.650094]         00 02 00 52
Mar 31 07:31:31 rohan kernel: [    1.650101] sd 4:0:0:0: [sdb]
Mar 31 07:31:31 rohan kernel: [    1.650104] Add. Sense: Unrecovered read error - auto reallocate failed
Mar 31 07:31:31 rohan kernel: [    1.650108] sd 4:0:0:0: [sdb] CDB:
Mar 31 07:31:31 rohan kernel: [    1.650110] Read(10): 28 00 00 02 00 50 00 00 08 00
Mar 31 07:31:31 rohan kernel: [    1.650123] end_request: I/O error, dev sdb, sector 131154
Mar 31 07:31:31 rohan kernel: [    1.650416] Buffer I/O error on device sdb2, logical block 1
Mar 31 07:31:31 rohan kernel: [    1.650711] ata5: EH complete

В то же время smartctl не выдавал никаких серьёзных косяков. Единственное, что меня смущало, выглядело как-то так:

197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       1
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       3

Ненулевые значения в «Pending sectors» означают, что винт не может записать сектор и не может переместить его, поскольку прочитать его тоже по какой-то причине невозможно. Ненулевое значение в «CRC errors» означает, что вероятно что-то не так с каналом связи между собственно винтом и матерью. Ну это одна из возможностей, которая может объясняться, например, глючным кабелем.

Я решил проверить, на самом ли деле винт загнулся, или он всё ещё жив. Самый простой способ сделать это весьма радикален и разрушителен, однако он просто работает. Я имею в виду, что можно перезаписать нафиг весь винт каким-нибудь мусором, например, просто нулями. В случае, если винт мёртв, сделать это не удастся. Ну а поскольку данный конкретный диск пылился уже больше двух лет, и я смирился с потерей данных, я сделал

# dd if=/dev/zero of=/dev/sdb bs=16M

… и через 5 часов мой 2-терабайтный винт был как новенький.

После этой процедуры ядро успокоилось и в логах стало чисто. Пара дней работы с этим винтом показали. что с ним всё в порядке, и я могу сделать такую же подлость с другим диском, который недавно отвалился от зеркального рейда. Сказано–сделано, и на следующее утро я получил ещё один девственно чистый диск и столь же чистые логи. После этого не составило проблемы восстановить на нём таблицу разделов и присобачить его обратно в зеркало. К настоящему моменту он пашет уже больше недели, и я не заметил каких-либо признаков деградации зеркала или нестабильной работы самого винта. Хотя, конечно, слишком рано ещё о чём-то говорить, посмотрим, что случится хотя бы через месяц. Ну и вообще-то, я бы конечно же проверил бы оба винта какой-нибудь шнягой типа whdd или типа того… Ну, когда-нибудь, наверное…