Добрый день. Сегодня впервые воспользовался программкой ddrescue для создания образа повреждённой карты памяти, остался очень доволен качеством работы, поэтому оставлю небольшую шпаргалку на будущее себе или ещё кому-нибудь, кому понадобится.
Итак, что мы имеем – карта памяти, при попытке копирования данных происходит следующее – часть данных копируется, затем процесс замедляется, оценочное время копирования растёт, скорость падает практически до нуля, затем выдаёт ошибку чтения и всё.
Я попробовал снять образ в R-Studio – но после примерно 4 гигабайт процесс резко останавливался и практически не шёл, при этом в лог вылетало множество ошибок типа “Ошибка на устройстве”… В минуту примерно 3-4 ошибки таких, ну и процесс снятия образа 64Гб флешки оценивался в сутки+… Это не норм.
Оказалось, есть неплохая утилитка под названием ddrescue, которая предназначена специально для подобных мероприятий.
Принцип работы ddrescue
Несмотря на созвучное название, утилита ddrescue не имеет ничего общего с известной линуксовой dd (о которой я писал раньше). Это принципиально другой продукт, хотя и способный выполнить схожую задачу, но несколько иными методами.
Программа тесно работает со своим LOG-файлом, в который заносится информация о “плохих” зонах для их последующего уточняющего чтения, поэтому можно в принципе прерваться в любой момент и продолжить вычитку данных, указав тот же самый лог.
Итак, алгоритм такой:
- Весь диск считается не проверенным (non-tried);
- Происходит попытки чтения блоков большими порциями в первый проход. Все блоки, которые не удалось прочитать или чтение было слишком долгим маркируются (non-trimmed);
- Второй проход читает в обратную сторону только те блоки, которые не удалось прочитать на предыдущем шаге;
- Данная операция производится несколько раз, последовательно уменьшая размер блока чтения (вплоть до сектора) и меняя направление чтения. Таким образом строится “карта” плохих зон, сильно на них не акцентируясь, вычитывая максимально быстро хорошие зоны;
- Каждый блок читается посекторно до тех пор, пока не встретится плохой сектор. Затем этот блок читается с конца до тех пор, пока опять же не встретится плохой сектор. Эта зона помечается как “обрезанная”, но не “выцарапанная” (non-scraped);
- “Выцарапывание” – последовательное посекторное чтение обрезанных блоков, определённое количество попыток, после чего сектор помечается уже “плохим” (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 я как-нибудь ещё напишу, тоже открыл его для себя.
Comments: