September 29, 2018

Ddsecure: копирование повреждённого носителя

Принцип работы ddrescue

Несмотря на созвучное название, утилита ddrescue не имеет ничего общего с известной линуксовой dd. Это принципиально другой продукт, хотя и способный выполнить схожую задачу, но несколько иными методами.

Программа тесно работает со своим LOG-файлом, в который заносится информация о “плохих” зонах для их последующего уточняющего чтения, поэтому можно в принципе прерваться в любой момент и продолжить вычитку данных, указав тот же самый лог.

Итак, алгоритм такой:

  1. Весь диск считается не проверенным (non-tried);
  2. Происходит попытки чтения блоков большими порциями в первый проход. Все блоки, которые не удалось прочитать или чтение было слишком долгим маркируются (non-trimmed);
  3. Второй проход читает в обратную сторону только те блоки, которые не удалось прочитать на предыдущем шаге;
  4. Данная операция производится несколько раз, последовательно уменьшая размер блока чтения (вплоть до сектора) и меняя направление чтения. Таким образом строится “карта” плохих зон, сильно на них не акцентируясь, вычитывая максимально быстро хорошие зоны;
  5. Каждый блок читается посекторно до тех пор, пока не встретится плохой сектор. Затем этот блок читается с конца до тех пор, пока опять же не встретится плохой сектор. Эта зона помечается как “обрезанная”, но не “выцарапанная” (non-scraped);
  6. “Выцарапывание” – последовательное посекторное чтение обрезанных блоков, определённое количество попыток, после чего сектор помечается уже “плохим” (bad-sector).

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

Установка

В примере ниже вы увидите странное окошко. Это Cygwin – UNIX-подобная среда под Windows с характерными для Unix возможностями (программами и компонентами). То есть если вы хотите себе под Windows например wget, vim, python, diff, а также нормальный терминал с возможностями Linux-ового – это сюда!

Качаем Cygwin нужной архитектуры и ставим. В момент конфигурирования прописываем в поиске ddrescue и отмечаем установку Bin (а попутно поразитесь, сколько там разных компонентов можно поставить):

Пример работы

Для примера. Посмотреть где какой раздел:

$ cat /proc/partitions

Запустил программу с такими параметрами:

$ ddrescue --verbose --force /dev/sdd1 E:/sdcard.dd E:/rescue.log

  • ipos/opos – позиция чтения и записи соответственно;
  • non-tried: не прочитано ещё 61006 Мб;
  • rescued: прочитано успешно уже 2841 Мб;
  • pct rescued: процент прочитанного: 4,45%;
  • non-trimmed: первично помечено как “подлежит обрезке” 131071 байта (256 секторов по 512 байт). А 256 = 128 секторов (значение Copy block size (размер блока)) * 2 (ошибки чтения read errors);
  • run time: прошло 3м 24сек;

Прошло некоторое количество времени (7 часов 51 минута 40 секунд):

Вот что изменилось:

  • non-tried: 0 (весь диск пробежались);
  • rescued: 63833 Mb (успешно прочитано), pct rescued: 99.97% от всего диска;
  • non-trimmed: 0 (все участки “подрезаны”);
  • non-scraped: 14153 Kb (осталось порядка 14 Мб “выцарапать”);
  • bad-sector: 405504 B (помечено как окончательно нечитаемые участки порядка 400 Кб, за остальные идёт борьба);

процесс остановил и скормил образ R-Studio. Вытащил достаточно много нужной информации. Уверен, что если ещё немного подождать (ещё сутки), то из тех 14 мегабайт ещё порядка 5-6 может быть “выцарапано”.

Структура logfile

программа пишет в журнал всё, что находит. Выглядит это примерно так:

# Mapfile. Created by GNU ddrescue version 1.22

# Command line: ddrescue --verbose --force /dev/sdc G:/image2.dd G:/rescue.log

# Start time: 2018-07-25 08:24:30

# Current time: 2018-07-25 09:24:36

# Trimming failed blocks... (forwards)

# current_pos current_status current_pass

0xE6000C0200 * 1

# pos size status

0x00000000 0xE6000C0200 +

0xE6000C0200 0x19C6FE00 *

0xE619D30000 0x05B40000 +

0xE61F870000 0x00020000 *

0xE61F890000 0x4C7F0000 +

0xE66C080000 0x00020000 *

0xE66C0A0000 0x98FF0000 +

0xE705090000 0x00020000 *

0xE7050B0000 0x131FF0000 +

0xE8370A0000 0x00020000 *

0xE8370C0000 0xA9CF0000 +

0xE8E0DB0000 0x00006000 *

(другой пример)

Здесь вот что примечательно. 16-ричные значения – номера секторов. Символы – статусы. Означают следующее:

  • ? – блоки не сканировались ни разу;
  • * – не обрезанные блоки (второй этап);
  • / – не “выцарапанные” блоки (третий этап);
  • – – плохие сектора (окончательно печаль);
  • + – успешно считанный блок.

Соответственно, при большом желании можно редактировать файл “ручками” и задавать нужные значения самостоятельно.

Итак, ddrescue помогла вычитать карту памяти лучше всего, составив чуть менее, чем полный образ диска за приемлемое время. Утилитка однозначно Musthave.

Источник:https://litl-admin.ru/linux/kopiruem-povrezhdyonnyj-nakopitel-s-pomoshhyu-ddrescue.html