Еще один способ восстановления винчестера

Для восстановления так называемых "софтовых бэд-блоков" существует не так уж и много программ. Я знаю всего две: mhdd и Victoria. Есть еще всякие HDDLife и прочие HDDReanimator'ы, но только эти две у меня реально заработали.

До недавнего времени мне этого вполне хватало. Если на каком-нибудь жестком диске появлялось несколько нечитаемых секторов, можно было просто сделать Remap этих секторов и продолжать пользоваться этим диском еще некоторое время. Первая программа более быстрая, но разрабатывалась исключительно для DOS, если вы еще помните, что это такое. На сайте проекта есть образ загрузочного CD-диска с этой программой. Недостаток ее в том, что она не видит многие SATA-диски, если в биосе для них включен режим AHCI (или Enhanced). Victoria приходит на помощь если на компьютере установлена Windows. Последняя версия виктории была выпущена под Windows. Можно просто запустить Victoria, посмотреть SMART-статистику винчестера, запустить внутренние тесты SMART, ну и просканировать поверхность винчестера с возможностью Remap.

Но технологии не стоят на месте и вот уже мне попался ноутбук с UEFI-материнкой, в которой уже нет возможности перейти в режим совместимости с BIOS (нет пункта CSM). Для того, чтобы запустить mhdd нужно загрузиться в DOS, а ноут умеет грузиться только через EFI-загрузчик. Да если бы и удалось запустить mhdd, я не уверен, что mhdd смогла бы увидеть диск. В общем, все, что удалось мне запустить на этом ноуте - это 64-битные Linux системы, да установщик Windows 7. Ни МХДД, ни Виктория так не заработали на нем.

Вознес я мольбы к Великому ГУГЛЮ и нашел-таки решение. Первое, что я нашел - это попытка клонирования mhdd под Linux, называется это чудо whdd, входит в состав замечательного дистрибутива для восстановления системы System Rescue CD, к которому, в свою очередь, уже прикрутили UEFI-загрузчик. Но радость моя была недолгой. В этой утилите пока только можно посмотреть на квадратики, обозначающие поверхность диска и на нечитаемые сектора на нем, а больше ничего сделать нельзя. Мне же нужен был скальпель, чтобы удалить эту опухоль в виде bad-секторов.

Как оказалось, ответ лежал на поверхности. В линукс уже давно существует утилита badblocks, которая умеет находить нечитаемые сектора на диске, нужно только правильно подобрать параметры. После получения списка плохих секторов нужно только сделать их ремап. Тут начались новые танцы с новым бубном (старый порвался еще в процессе поиска программы для поиска bad-секторов). Владельцам SCSI-дисков (я все еще верю в их существование) повезло в стандарте SCSI указаны команды для пометки блока, как сбойного и все с водится к двум командам sg_verify и sg_reassign, контроллер послушно выполнит все, что ему скажут. А вот с IDE и SATA-дисками все гораздо сложнее, поиск и пометка сбойных секторов целиком возложена на контроллер и управлять этим процессом напрямую мы никак не можем. При чтении сбойного сектора, а точнее при попытке чтения из сбойного сектора, независимо от результатов (от простого считывания мусора вместо информации из этого сектора, до полного вылета жесткого диска из системы) контроллер бездействует. Не знаю почему он так себя ведет, но это проверенный факт, и такое происходит на дисках разных производителей. Какая логика двигала производителями - непонятно. Данные не считались или считались неправильно, о чем свидетельствует несовпадение контрольной суммы сектора, нужно как минимум в Current Pending их добавить. Но зато, опять же практикой проверено, что при попытке записи в этот сектор, контроллер практически всегда делает remap этого сектора. Писать сектор напрямую через контроллер у нас умеет hdparm.

В итоге все сводится к двум простым командам, которые есть в любом современном дистрибутиве Linux:

badblocks -s -v -b 512 -c 1 -o /tmp/bad.log /dev/sda

ключ -s показывает нам протекание процесса проверки в процентах
ключ -v показывает доп. информацию, сколько уже найдено плохих секторов
ключ -b 512 устанавливает размер сектора равным 512 байтам иначе номера секторов не будут совпадать с hdparm
ключ -c 1 указывает программе проверять каждый сектор отдельно, а не блоками по несколько секторов
ключ -o /tmp/bad.log указывает программе номера всех нечитаемых секторов записать в файл /tmp/bad.log
ну и последний параметр - это проверяемый диск (или раздел диска)

Вы можете убедиться, что сектора действительно нечитаемы, запустив команду hdparm --read-sector номер_сектора /dev/sda
Вторая команда, которая сделает всю грязную работу выглядит немного сложнее, вот она:

cat /tmp/bad.log | xargs -I {} hdparm --write-sector {} --yes-i-know-what-i-am-doing /dev/sda

Сначала здесь считываются номера секторов, найденные предыдущей командой и направляются программе xargs, которая для каждого сектора выполняет команду hdparm с параметрами, заменяя фигурные скобки на номер очередного нечитаемого сектора. Главное в конце правильно указать восстанавливаемый диск или раздел, точно такой же как и в предыдущей, программе иначе вы рискуете потерять свои данные на ни в чем не повинном, здоровом диске.

Обе команды нужно выполнять от имени администратора, так что если вы в убунте, предварительно выполните: sudo -i

Недостатком этого метода является то, что в отличие от mhdd или Victoria, в данном методе нет даже попытки восстановить информацию, записанную в плохих секторах, это сильно бы усложнило процесс. Тем же кому прежде всего важна сохранность информации, а не диска, советую другую программу: ddrescue (пакет называется gddrescue). Для нее нужен диск такого же или большего размера, а дальше так:

ddrescue -f -r 10 /dev/sda /dev/sdb /tmp/ddrescue.log

здесь -f - делать клон, даже если файл уже существует, -r 10 - делать 10 попыток чтения из сбойного сектора (процесс может затянуться), /dev/sda - больной диск, /dev/sdb - чистый диск, на который мы клонируем сбойный диск, /tmp/ddrescue.log - файл, в который записываются логи всех происходящих действий, чтобы можно было продолжить процесс в случае его прерывания по тем или иным причинам.

P. S.
Пока писал статью понял, почему контроллер не помечает bad-блоки при чтении, а все для того, чтобы дать шанс все-таки считать информацию из этого сектора. Вот я и стал еще на бит умнее, с чем я себя и поздравляю.


Uptime. Мониторинг сайтов и серверов.