пятница, 5 апреля 2013 г.

Знакомимся с DD

Есть жесткий диск объемом 1Т с бед блоками на поверхности и важными данными. Этот диск мы будем называть исходным. Есть второй диск равный по объему исходному и подготовленный в соответствии с его разметкой. Дадим ему название целевой диск. Задача заключается в создании полной копии исходного диска утилитой dd. Операция переноса данных выполняется в однопользовательском режиме FreeBSD. Для этого можно использовать например LiveCD дистрибутив Frenzy. Определившись с дисками запускаем процесс копирования следующей командой
dd if=/dev/{устройство исходного диска} of=/dev/{устройство целевого диска} bs=64K conv=noerror
Так как копируемый диск содержит сбойные сектора опция noerror позволяет пропустить такие блоки и выполнить проверку. Для ускорения работы dd, которая к слову сказать не отличается быстротой, можно использовать параметр bs задающий размер копируемого блока.

Запустив процесс копирования остается набраться терпения. Как я уже сказал, dd очень медленно выполняет свою работу. Например на диске в 1Т утилита работала почти 6 часов! Более того утилита никаким образом не информирует пользователя о ходе выполнения своей работы, и блокирует терминал, так как выполняется в синхронном режиме. И все же, чтобы оценить объем проделанной работы можно послать процессу dd сигнал SIGINFO. Для этого надо запустить второй терминал (Alt+F2) и выполнить
killall -SIGINFO dd
Выдав статистику работы dd продолжит выполнение дальше. Если послать сигнал SIGINT dd после выдачи статистики завершит свою работу.

P.S. В Linux для получения статистики работы dd используется сигнал USR1. Если такой сигнал послать dd выполняющейся на платформе FreeBSD, dd завершит свою работу без выдачи какого-нибудь результата. Имейте это в виду, так как dd никогда не использует результаты своей предыдущей работы, а начинает цикл копирования заново. Утилита dd полностью повторяет копируемый диск. Если на нем были сбойные сектора они будут и на целевом. К тому же dd будет копировать не только занятую область, но и свободную, т.е. диск в диск. Другие примеры использования утилиты dd несложно найти в интернете.