Команда dd_rescue

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

Установка утилиты

В первую очередь вам придется установить рассматриваемую утилиту; проще всего это сделать с помощью терминала путем исполнения соответствующей вашему дистрибутиву команды. Подробнее об установке программного обеспечения рассказано в данном разделе.

Команда для Linux Mint и Ubuntu:

$ sudo apt-get install dd_rescue

Команда для Fedora Workstation:

$ sudo dnf install dd_rescue

Основные возможности

В то время, как утилита dd является универсальным инструментом для копирования данных, утилита dd_rescue предназначена исключительно для копирования файловых систем с потенциально поврежденных носителей. При использовании стандартных параметров dd_rescue работает примерно так же, как и утилита dd с параметрами conv=noerror,sync, но при этом выполняет операции чтения гораздо быстрее. При этом dd_rescue поддерживает следующие дополнительные функции:

  • Переключение между двумя размерами блоков при копировании данных для восстановления максимального объема данных.
  • Обратное копирование данных, то есть, копирование данных до и после поврежденной области.

Базовый синтаксис команды выглядит следующим образом:

# dd_rescue [параметры] <файл устройства> <файл образа>

Утилита поддерживает большое количество различных параметров, но при этом отлично работает даже в том случае, если пользователь не использует их. Наиболее важными параметрами являются параметр -b, позволяющий задать размер блока устройства, параметр -B, позволяющий задать размер блока, используемый в случае обнаружения ошибки, параметр -d, позволяющий осуществлять копирование в обход механизма кэширования файловых систем, параметр -r, активирующий режим обратного копирования данных, параметр -k, активирующий режим zero-copy на уровне ядра ОС для повышения скорости операций копирования, а также параметр -o, позволяющий создать файл с номерами поврежденных блоков по аналогии с утилитой badblocks.

Примеры использования

Простейший пример использования утилиты заключается в восстановлении данных с неисправного жесткого диска. Предположим, что в нашем случае таким жестким диском является диск, представленный файлом устройства /dev/sda1. В случае неполадок жесткого диска система будет работать как и прежде, но время от времени будут выводиться сообщения о невозможности чтения данных из поврежденных секторов. Это означает, что диск нуждается в замене, а доступные данные из его разделов должны быть немедленно скопированы на исправный жесткий диск, на котором впоследствии могут быть предприняты действия, направленные на восстановление файловых систем. (Попытки их восстановления на неисправном жестком диске с большой вероятностью закончатся ничем, причем дополнительная активность этого диска может привести к повреждению большего объема хранящихся на нем данных.)

В случае использования утилиты dd обычно выполняются следующие подготовительные действия:

  • На новом жестком диске создается целевой раздел (например, он будет представлен файлом устройства /dev/sdb1) того же размера, что и раздел на неисправном жестком диске.
  • Утилита dd используется для копирования данных из исходного раздела неисправного жесткого диска в целевой раздел нового жесткого диска с игнорированием ошибок:
    # dd if=/dev/sda1 of=/dev/sdb1 bs=4096 conv=noerror,sync

Таким образом можно восстановить уцелевшие данные, но вам в любом случае придется передавать утилите фиксированное значение, соответствующее размеру блока. Так как dd работает с параметрами conv=noerror,sync, при выявлении ошибки в процессе копирования данных все следующие за ней данные блока будут заменены нулевыми байтами. Блоки больших размеров будут копироваться быстрее, но при каждой ошибке часть данных из этих блоков будет игнорироваться. Блоки меньших размеров минимизируют потери данных, но копирование этих блоков занимает больше времени во-первых, потому, что процесс чтения и записи небольших по размеру блоков данных является менее эффективным и во-вторых потому, что в случае выхода поврежденного сегмента за пределы блока небольшого размера время будет теряться на попытки чтения поврежденных секторов, которые в противном случае были бы просто пропущены.

Утилита dd_rescue может выполнять те же действия, что и утилита dd в примере выше, но  при этом позволяет восстанавливать больший объем данных, чем dd с параметром bs=4096 и быстрее работает с блоками меньшего размера. А это аналогичная команда:

# dd_rescue /dev/sda1 /dev/sdb1

Данная команда будет копировать данные блоками по 64 Кб до момента обнаружения ошибок — в этом случае будут использоваться блоки размером в 512 байт до того момента, пока множество таких блоков не будет скопировано без ошибок, после чего утилита снова начнет копировать данные блоками размером в 64 Кб.

Утилита dd_rescue и сценарий dd_rhelp

dd_rescue является отличным инструментом для восстановления данных. Однако, у данного инструмента есть один серьезный недостаток: он может терять достаточно много времени на восстановление данных из поврежденных секторов, задерживая восстановление данных из неповрежденных секторов.

Восстановление максимального объема данных требует значительных затрат времени, причем чаще всего большие затраты времени себя не оправдывают. По этой причине пользователи чаще всего не осуществляют восстановление максимального объема данных, ограничиваясь результатами запуска утилиты со стандартными параметрами.

dd_rhelp является сценарием-оберткой над утилитой dd_rescue, который реализует следующие функции:

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

Данные обстоятельства делают сценарий dd_rhelp отличным дополнением для утилиты dd_rescue, способствующим восстановлению данных с дисков с длинными последовательностями поврежденных секторов или с дисков, с которых нужно восстановить максимальный объем данных, а не только все доступные для чтения в данный момент данные.