Пришла пора рассказать о том, как происходит чтение данных с битых жестких дисках. На примере утилиты от AceLab под названием Data Extractor. Сразу скажу, что утилита не бесплатная, на момент написания статьи она стоила на оффсайте 29600 рублей. Думаю, есть немало бесплатных программ для компьютера для этой же цели.
Итак, в чём же суть.
Если диск отдает паспорт и более-менее сносно работают головки чтения и механизм позиционирования, можно производить выбор данных с пластин.
Построение начальной карты
Строится первоначальная карта секторов исходя из данных паспорта (объем, размер блока). То есть некий массив размерностью в количество блоков LBA.
Далее, производим вычитывание служебной зоны диска — MFT (Master File Table), покажет таблицу размещения файлов. Размер её зависит от количества файлов. Как правило, она часто фрагментированна, так как количество файлов растёт, размер MFT тоже должен расти. Вот, происходит вычитывание поблочное $MFT файла, так же есть служебная копия ($MFTMirr). Вычитываем и её. Неплохо бы вычитать так же файлы $AttrDef (атрибуты), $Bitmap (карта занятых секторов), $BadClus (карта битых секторов).
Начинаем сканирование
В процессе сохранения цепочек файлов (существуют ведь ещё и фрагменты), может вырисовываться такая картина:
Сканирование
Зелёным здесь отмечены успешно прочитанные блоки. Черным — нечитаемые блоки. Желтым — пропущенные сектора. Пропуски получаются потому, что я выставил режим — пропускать 256 блоков после того, как встретится нечитаемый сектор. Зачем это нужно?
Предположим, что у нас на жестком диске существует участок из 300 бэдов (нечитаемых), попытка чтения такого массива заняла бы примерно 300*2 = 10 минут, при таймауте в 2 секунды. Немало, учитывая сотни миллионов блоков.
Так вот, существуют более эффективные алгоритмы, позволяющие сократить время чтения. Называется это «Уточняющее чтение». Допустим, встретили мы первый блок из этой череды бэдов (обычное дело, не так ли?). Через 2 секунды совершаем прыжок на +256 секторов. Читаем. Снова бэд (у нас ведь череда из трёх сотен), снова прыгаем на 256. Попадаем в 513-ый сектор. Читаем! Читается нормально (зелёная метка), и начинаем читать обратно посекторно, до тех пор, пока не попадём в 300-ый сектор. Таким образом
обозначая границы сбойного участка.
Конечно, внутри этого участка могут быть читаемые «островки». Но мы делаем первоначальное, черновое чтение. Для построения первичной карты нам хватит грубой работы.
Когда весь массив данных будет прочитан (предположим, статистика такова):
Статистика
Начинаем менять режимы чтения на более точные:
Настройки чтения
Убираем пропуск секторов с ошибкой. То есть в случае, если по направлению движения будет расположен ранее непрочитанный блок, предпринимаем повторные попытки чтения. Если же на диске есть запил — лучше это не делать, т.к. возможно ухудшить качество голов. Ну мы надеемся на благоприятный исход. Подстраиваем параметры под более точное (чистовое) вычитывание.
Режимы чтения
Подстраиваем так же режимы чтения. Важно помнить, что разные винты (и участки) по-разному читаются на этих режимах. Например, черновое быстрее проводить на «Не использовать аппаратные повторы» вперед, чистовое — на «UDMA33″ вперед. А заключительное — на «UDMA33″ назад (направление чтения указывается в предыдущем окне). Всё это выводится экспериментальным путем и применимо к конкретному диску.
Настраиваем обработку ошибок
В случае обнаружения ошибок — подстраиваем параметры для чистового чтения — 5 попыток чтения, с задержкой в 1 миллисекунду, можно выполнить так же программный сброс. Для финального чтения я выполнял 15 попыток, и случалось, что именно на 15-ой сектор успешно вычитался. Но большие значения тут сильно замедляют время чтения.Последнюю задачу я выполнял 5 дней. Удалось спасти большую часть данных, винт в итоге окончательно умер.
Уточнение карты
Таким образом, постоянно проходя с чтением в разных режимах взад-вперед строится более-менее полная карта. Сектора прочитанные ранее мы повторно не тормошим, перечитываем то, что ранее было пропущено или не прочитано.
Вся карта создается в каталоге задачи в виде отдельных файлов фиксированного размера, содержащих побайтовую копию своего участка. Например img0001000000.bin,img0002000000.bin,img0003000000.bin … и т.д. Все прочитанные блоки скидываются каждый в соответствующий файл. Поэтому нужно позаботиться, чтобы на диске с результатами задачи был значительный размер свободного места, поскольку размер карты будет 100% от размера диска (если без учета пустых секторов).
Сохранение данных
После того, как мы добились приемлемого качества чтения (или вычитали все 100% секторов), можем производить сохранение данных. Больной жесткий диск нам для этого уже не нужен, все данные хранятся в карте. Подключаем целевой носитель, на который нужно скинуть содержимое, запускаем нашу задачу с отметкой «Работа только с копией». Выбрать нужные папки-файлы и нажать «Сохранить».