GNU ddrescue: Копирование данных с повреждённых носителей в Astra Linux (Астра Линукс)

#1 2022.07.28 08:25:51

0

Web-сайт разработчиков GNU ddrescue ссылка

Инструмент GNU ddrescue (не путать с инструментом dd_rescue) копирует данные из одного (повреждённого) источника в другой, предпринимая максимально возможные усилия для максимально возможного извлечения данных.

Инструмент GNU ddrescue входит в репозиторий Astra Linux Common Edition 2.12 и может быть установлен командой:

sudo apt install gddrescue

В Astra Linux Special Edition инструмент может быть установлен из репозитория Astra Linux Common Edition.

Общий синтаксис вызова:

sudo ddrescue [<параметры>] <источник_данных> <приёмник_данных> [<карта>]

 Astra Linux писал(а) 

После вызова инструмент сначала пытается скопировать данные из указанного источника в указанный приёмник пропуская "сбойные данные". При этом чтение осуществляется в прямом и обратном направлении постепенно уменьшающимися блоками, а результаты копирования запоминаются в "карте" (журнале хода копирования). После завершения копирования легкодоступных данных информация, сохранённая в "карте", используется для попыток копирования пропущенных "сбойных" участков. При этом наличие "карты" позволяет в произвольные моменты времени останавливать и возобновлять операцию копирования, не выполняя чтение ранее скопированных участков. Таким образом, возможное нарастание повреждений носителя в процессе работы не повлияет на уже прочитанные данные.



1. В начале работы всему источнику назначается статус "не проверенный" (non-tried). Далее на всех этапах заполняется "карта" блоков с регистрацией изменения их статуса;

2. Первый проход. Выполняется попытка чтения большими блоками. Все блоки, которые не удалось прочитать или чтение которых было слишком долгим маркируются как "не обрезанные" (non-trimmed);

3. Второй проход. Выполняется чтение в обратной последовательности только тех блоков, которые не удалось прочитать на предыдущем шаге. Данная операция повторятся несколько раз с уменьшением размера блока чтения (вплоть до сектора) и переменным направлением чтения. При этом детализируется “карта” "плохих" зон и максимально быстро считываются "хорошие" зоны. Каждый блок читается посекторно до тех пор, пока не встретится плохой сектор. Затем этот блок читается с конца до тех пор, пока опять не встретится плохой сектор. Такой блок помечается как “обрезанный”, но не “выцарапанный” (non-scraped);

4. “Выцарапывание” – последовательное посекторное чтение "обрезанных" блоков, при котором выполняется определённое количество попыток, после чего непрочитанные данные помечаются как окончательно “плохие” (bad-sector).

Параметр "карта" является необязательным, но именно его применение делает инструмент действительно эффективным.

В качестве источника и приёмника могут быть использованы любые блочные устройства в любых сочетаниях: накопители (например, /dev/sdb), дисковые разделы (/dev/sdb1), файлы.

В параметрах вызова команды могут быть указаны:
-r N - количество повторных попыток чтения повреждённых блоков;
-i NNN - начало зоны чтения;
-d - прямое чтение без использования буферов ядра;
-f - разрешение переписывать данные в приёмнике (используется для записи в приёмники, являющиеся устройствами).
-n - быстрое чтение без фазы "выцарапывания" данных;
-A - пометить все сбойные области как непрочитанные. Применяется для восстановления после потери источника и его последующего подключения.


Пример 1.
Быстро копируем доступные данные с дискового накопителя /dev/sdh в файл-образ file.tmp используя карту map.tmp:


sudo ddrescue /dev/sdh file.tmp map.tmp
GNU ddrescue 1.21
Press Ctrl-C to interrupt
ipos: 120034 MB, non-trimmed: 0 B, current rate: 24576 B/s
opos: 120034 MB, non-scraped: 0 B, average rate: 23968 kB/s
non-tried: 0 B, bad-sector: 0 B, error rate: 0 B/s
rescued: 120034 MB, bad areas: 0, run time: 1h 23m 27s
pct rescued: 100.00%, read errors: 0, remaining time: n/a
time since last successful read: n/a
Finished



Пример 2.
В приведённом выше примере использован исправный диск, ошибок нет. При возникновении ошибок чтения - повторно копируем данные с накопителя, извлекая данные из повреждённых частей. Используются карта и файл образа, созданные при первой попытке копирования, извлечённые данные добавляются в образ, выполняются 3 попытки повторного чтения повреждённых данных, и используется прямой доступ к данным (-d):

sudo ddrescue -f -d -r3 /dev/sdh file.tmp map.tmp

Полученный таким способом образ диска можно использовать следующим способом:

1. Перед дальнейшими манипуляциями создать резервную копию образа в ещё одном файле;

2. Исследовать образ с помощью описанного ниже инструмента testdisk - попробовать восстановить испорченную структуру дисковых разделов и файловых систем;

3. Исследовать образ с помощью описанного ниже инструмента photorec - попробовать извлечь фото и видео из испорченной файловой структуры;

4. Примонтировать дисковые разделы и изучить их содержимое. Обратите внимание - копировался диск целиком, и полученный образ может содержать внутри себя один или несколько дисковых разделов. Для монтирования дисковых разделов, находящихся в таком образе - см. команды:
** partx и kpartx (соответственно пакеты partx и kpartx);
** losetup (пакет klibc-utils);
** mount - эта команда позволяет монтировать дисковый раздел, находящийся внутри образа диска, если указать смещение этого раздела от начала образа (см. соответствующую документацию).

Копировать весь диск не обязательно, можно копировать отдельные дисковые разделы или даже только важные файлы (если они доступны, на повреждённом диске разделы и файлы могут не определяться).


Пример 3.
Копирование отдельно дискового раздела /dev/sdb1 в новый дисковый раздел /dev/sdc1 (новый раздел должен быть создан заранее и иметь достаточный для размещения копируемых данных размер). Команды отличаются от команд в предыдущем примере только названиями источника и приёмника:

sudo ddrescue -f /dev/sdb1 /dev/sdc1 partmap.tmp
sudo ddrescue -f -r3 /dev/sdb1 /dev/sdc1 partmap.tmp



Пример 4.
Перезапуск копирования после отказа и восстановления диска-источника (например, диск-источник перестал отвечать, но удалось заставить его работать после переподключения).

Можно указать смещение, с которого нужно продолжить копирование (для этого использовать информацию о выполненном копировании, полученную в предыдущей попытке копирования):

sudo ddrescue -f -r3 -i 1234567000 /dev/sdb /dev/sdc map.tmp

Можно продолжить копирование в обратном порядке:

sudo ddrescue -f -r3 -R /dev/sdb /dev/sdc map.tmp

Можно пометить сбойные области как непрочитанные для повторного чтения (рекомендуется при возобновлении копирования после потери диска):

sudo ddrescue -f -r3 -A /dev/sdb /dev/sdc map.tmp


Пример 5.
Отказы носителей-приёмников. Если копирование прервано из-за отказа со стороны диска-приёмника (/dev/sdc), можно скопировать содержимое неисправного приёмника на третий диск (/dev/sdd) и продолжить копирование из источника:

sudo ddrescue -f -m map.tmp /dev/sdc /dev/sdd newmap.tmp
sudo ddrescue -f -n /dev/sdb /dev/sdd newmap.tmp
sudo ddrescue -f -d -r3 /dev/sdb /dev/sdd newmap.tmp