Команда dd, большая сила – большая ответственность

Команда dd в Linux особенная. Ее синтаксис не похож на синтаксис других команд, а благодаря ее широкой функциональности она заслуживает отдельного внимания. Рассмотрим ее подробнее.

Краткая история

dd хоть и весьма старая команда, но еще вполне актуальная и очень полезная. Ее история начинается вместе с историей Unix – 1 января 1970 года. Тогда эта команда использовалась для работы с ленточными накопителями.

Почему ее назвали именно так – dd – теперь уже никто не вспомнит. Встречаются различные варианты расшифровки этого названия (вроде data defenition – определение данных), но так это или нет, точно не ясно.

Синтаксис

Подробно описывать синтаксис команды dd считаю не целесообразным, т.к. он хорошо описан в man (обязательно ознакомьтесь со страницей руководства, даже если полностью прочитаете эту статью!). Вообще работать с man нужно научиться, если вы хотите полноценно работать в среде Linux систем, на любую команду терминала существует свой man – полное описание, документация. Как работать с man можно прочитать здесь.

Предупреждение

Но прежде хочу предупредить вас, что команда dd очень опасна, и ее неправильное применение может полностью уничтожить данные на жестком диске вашего компьютера – и не только на разделе Linux! Поэтому помните, с большой силой наступает и большая ответственность! : )

С другой стороны, если применять ее осторожно и осмысленно (а так нужно поступать всегда при работе с Linux), можно извлечь из нее много пользы. Перейдем к практическим примерам использования команды dd.

Копирование файлов с помощью команды dd

Обычно никто не копирует файлы командой dd – для этого существует команда cp. Но при желании можно выполнить копирование и командой dd. В данном случае рассмотрим копирование файлов с ее помощью, чтобы немного разобраться с синтаксисом команды, который проще изучить на безобидных примерах, которые не повредят вашим данным. Сразу отмечу, что для выполнения команды dd нужны  права root, поэтому здесь и далее приглашение командной строки будет иметь вид #. В тех дистрибутивах, где вы не можете зарегистрироваться как root (например в Ubuntu), придется выполнять команду dd через команду sudo, или через команду su.

Для начала создадим тестовый файл test.txt с помощью консольного текстового редактора nano.

lexone@DebianWorkStation:/home/lexone# nano test.txt

Чтобы скопировать файл /home/lexone/text.txt в файл /home/lexone/test.bak, выполним следующую команду:

lexone@DebianWorkStation:/home/lexone# dd if=test.txt of=test.bak

Параметр if (input file) задает входной файл, параметр of (output file) – выходной файл. Синтаксис необычен и имеет вид “опция=значение”. Была бы команда dd обычной командой Linux, ее синтаксис выглядел бы примерно так:

# dd -if /home/lexone/test.txt -of /home/lexone/test.bak

Проверим что получилось с использованием команды ls

ls показывает список файлов и каталогов в месте нашего нахождения – домашней папке.

Там появился файл test.bak, так же результатом выполнения нашей команды стал вывод, сколько записей получено и сколько отправлено, размер данных и скорость копирования. Ошибок нет, значит все прошло успешно.

Проверим результирующий файл test.bak:

Текст в точность такой, какой мы прописали. Успех.

Суть команды dd

В целом ничего интересного мы не сделали. Просто скопировали один файл в другой. Но самое интересное тут в другом. Команде dd все равно, что будет входным, а что выходным файлом, она работает с необработанными данными (raw) на самом низком уровне – на уровне секторов жесткого диска. Именно поэтому данная команда так опасна. Ведь она может запросто взять секторы одного диска и заменить ими секторы другого диска. В результате вместо данных на диске останется нечитаемая каша.

Параметры if и of правильнее назвать входным и выходным буферами. Величина буфера задается параметром bs (block size). По умолчанию размер блока равен 512 байтам, что подходит для большинства задач.

Резервное копирование MBR записи

Параметр count задает число блоков, которое должно быть считано. Считаем в файл главную загрузочную запись (MBR) жесткого диска компьютера:

root@DebianWorkStation:/home/lexone# dd if=/dev/sda of=mbr.bak bs=512 count=1
1+0 записей получено
1+0 записей отправлено
512 байт скопировано, 0,000495303 s, 1,0 MB/s

Эта команда скопировала всего 512 байт первого жесткого диска (/dev/sda) вашего компьютера и поместила их в файл mbr.bak. Теперь скопируйте этот файл на флешку и храните в безопасном месте. Если что-то повредит MBR этого жесткого диска, вы всегда сможете восстановить его примерно такой командой:

root@DebianWorkStation:/home/lexone# dd if=/dev/sdb1/mbr.bak of=/dev/sda bs=512 count=1

где /dev/sdb1 – ваша флеш-карта.

Разделение файла на несколько частей

Очень удобное, на мой взгляд, решение. Порой очень необходимое. Иногда большой файл не помещается полностью на носитель, и его нужно разбить на несколько частей. Следующие две команды разделят файл размером 1000 Мбайт на два файла по 500 Мбайт (part1 и part2):

root@DebianWorkStation:/home/lexone# dd if=file1000 of=part1 bs=1M count=500
root@DebianWorkStation:/home/lexone# dd if=file1000 of=part2 bs=1M skip=500

Параметр skip задает смещение – то есть команда должна пропустить первые 500 Мбайт файла, так как они уже вошли в первую часть (part1).

Чтобы соединить файл в последующем, нужно просто скопировать в новый файл первую часть, потом вторую со смещением.

Создание архива с резервной копией всего жесткого диска

Как правило, двух одинаковых жестких дисков под рукой не оказывается, но необходимость создать резервную копию присутствует. Создадим архив с резервной копией жесткого диска /dev/sda. Сама команда dd не умеет создавать архивы, но мы можем перенаправить ее вывод программе gzip, которая и сделает основную работу.

Для создания резервной копии выполняем:

# dd if=/dev/sda | gzip > /mnt/sdb1/backups/sda.img.gz

Созданный архив будет записан в файл /mnt/sdb1/backups/sda.img.gz. В случае необходимости архив разворачиваем обратно на диск /dev/sda загрузившись с LiveCD командой:

# gzip -dc /mnt/sdb1/sda.img.gz | dd of=/dev/sda