Материал просмотрен 115 раз(а)

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

Итак, что мы имеем – карта памяти, при попытке копирования данных происходит следующее – часть данных копируется, затем процесс замедляется, оценочное время копирования растёт, скорость падает практически до нуля, затем выдаёт ошибку чтения и всё.

Я попробовал снять образ в R-Studio – но после примерно 4 гигабайт процесс резко останавливался и практически не шёл, при этом в лог вылетало множество ошибок типа “Ошибка на устройстве”… В минуту примерно 3-4 ошибки таких, ну и процесс снятия образа 64Гб флешки оценивался в сутки+… Это не норм.

Оказалось, есть неплохая утилитка под названием ddrescue, которая предназначена специально для подобных мероприятий.

Принцип работы 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. А про Cygwin я как-нибудь ещё напишу, тоже открыл его для себя.