Команда dd в Linux – это утилита для копирования и преобразования файлов, которая имеет множество практических применений.

Предполагается, что имя является производным от более старой функции IBM Job Control Language, где dd означало «Data Definition (Определение данных)». В Linux аббревиатура расшифровывается как «Data Duplicator (Дубликатор данных)» или «Disk Dump (Дамп диска)» или множество других аллитераций в зависимости от вашего источника.

Возможно, он даже получил прозвище «data destroyer (разрушитель данных)», что подводит нас к важному моменту. Пожалуйста, соблюдайте осторожность при выполнении команды dd.

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

 

Знакомство с командой dd

Вот синтаксис команды dd:

dd if=<filename> of=<filename> [options]

 

У этой команды есть широкий спектр применения, мы представляем несколько общих подходов.

 

Физические носители/Разделы, клоны/резервные копии

В приведенном выше синтаксисе ‘if’ и ‘of’ предназначены для входного файла и выходного файла, соответственно. Это основная функциональность dd. Он дублирует данные из одного источника в другой. Вам не нужно использовать физический носитель с dd.

 

Манипулирование текстом

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

Одна из первоначальных функциональных возможностей этой команды фактически заключалась в преобразовании EBCDIDC, схемы кодирования, созданной IBM, в ASCII.

 

Манипуляция файловой системой

Вы также можете копировать файлы с ним, но для этого простого приложения рекомендуется использовать команду cp вместо dd. У нас есть статья, где вы можете прочитать о команде cp.

 

Некоторые поведенческие заметки

При копировании с dd, вы также должны знать, что по умолчанию он будет копировать полную информацию из указанного источника.

Это означает, что если вы попытаетесь скопировать раздел или диск, он также скопирует свободное место.

Так, например, если вы клонируете жесткий диск с 4 ТБ, вам понадобится целевой диск с по крайней мере 4 ТБ для предотвращения усеченных файлов и ошибок. Помните также, что если на диске всего 1 ТБ данных, dd все равно скопирует остальные 3 ТБ пространства. Это плохой ход, который будет тратить много времени и ресурсов.

Есть некоторые ограничения, которые мы можем добавить к dd, и другие меры, которые мы можем предпринять, чтобы изменить это поведение. На самом деле существует огромное количество элементов управления, которые можно использовать вместе с dd. Мы попытаемся рассмотреть некоторые из тех, которые, на мой взгляд, могут принести больше пользы нашим читателям, но цель этой статьи – дать учебник по dd, а не документировать все возможные функции.

 

Внимание!Для практики используйте виртуальную машину

Мы призываем вас осмыслить вашу цель и тщательно выполнить ее, чтобы не повредить или не уничтожить важные файлы. Очевидно, что мы не несем ответственности за потерю вашей информации. Если вы ошиблись. Не говорите, что мы вас не предупреждали.

Мы рекомендуем потренироваться на фиктивной виртуальной машине, чтобы ознакомиться, прежде чем пытаться изменить какие-либо активы «реального мира». Это связано с тем, что команда dd имеет возможность изменить и, следовательно, повредить файловую систему, если вы используете ее неправильно.

Для этого урока мы решили попробовать что-то вне семейства Debian и развернули копию Fedora 31 в VirtualBox.

 

5 практических примеров использования команды dd

С предупреждениями и некоторой контекстной информацией мы готовы перейти к некоторым приложениям для этой простой, но мощной команды.

 

Пример 1: клонирование дисков

Клонирование одного диска на другой может быть очень простым с помощью dd. Для нашего примера есть два диска с именами ‘sda’ и ‘sdb’.

Помните, что sda попытается скопировать себя в sdb, используя все содержимое диска, а не только данные.

Вам необходимо выделить достаточно места в выходном файле для размещения неиспользуемого пространства в секторе. Вы также можете переразбить диск на точный размер, заполненный данными. Мы бы порекомендовали этот метод. Это уменьшит время, необходимое для выполнения операции и создания более полезного документа.

Когда вы будете готовы клонировать диск, вы можете запустить fdisk, чтобы определить ваши диски, их разделы и их емкость.

sudo fdisk -l

 

Выполнение этой команды выведет список доступных дисков и разделов и их соответствующие размеры. Это может быть полезно для правильной идентификации вашего целевого устройства.

Опять же, для нашего приложения мы используем имена ‘sda’ и ‘sdb’, и мы будем предполагать, что они имеют одинаковый размер.

[andreyex@fedora ~]$ sudo dd if=/dev/sda of=/dev/sdb
[[enter pw for sudo]]
dd: writing to 'dev/sdb': No space left on device
8108369+0 records in
8108369+0 records out
4151484416 bytes (4.2 GB, 3.9 GiB) copied, 12.3602 s 336 MB/s

 

Вывод дает нам знать, что запись прошла успешно, мы можем игнорировать сообщение о том, что в ‘sdb’ больше нет свободного места.

В сводке также указывается количество скопированных данных, сколько времени это заняло и как быстро они были скопированы. Мы рассмотрим это немного подробнее, когда я расскажу о размере блока.

 

Пример 2. Резервное копирование раздела диска

Шаги для клонирования устройства и резервного копирования раздела аналогичны. Вместо того, чтобы наш целевой файл был устройством, мы можем создать файл .img (необработанный образ диска).

Скажем, в нашей системе есть отдельный раздел для нашего домашнего каталога по адресу ‘sda2’, и мы хотим сделать его резервную копию в файле с именем ‘home_backup.img’ в нашем текущем каталоге.

dd if=/dev/sda2 of=home_backup.img

 

Это так просто! Так что теперь у вас нет оправданий тому, что у вас нет хорошей подпрограммы резервного копирования.

Конечно, это было легко, но всегда есть чему поучиться.

 

Работа с размером блока в команде dd

Прежде чем перейти к следующему примеру, давайте поговорим о BS или размере блока. Если вы видели, что это используется для указания значения с помощью команд dd, вы можете удивиться, почему оно есть. Если ваше любопытство привело вас к поиску в Интернете, то я готов поспорить, что вы, вероятно, все еще задаетесь вопросом, почему он там есть.

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

Вы можете искать информацию на носителе, таком как диск, ища определенный блок данных. Так, например, система может читать CD-ROM и искать информацию, начиная с блока 500 (произвольное число). Он также может быть использован для «сглаживания» информации и может использовать информацию от блока 500 до блока 1500.

Эти блоки могут быть сегментированы таким образом, чтобы система могла эффективно анализировать. Это может отражать пространство хранения носителя или стандартные системные характеристики, с которыми, вероятно, связан носитель.

Мы продолжим с примером компакт-диска, который имеет свой собственный определенный размер блока (2048). Каждый блок должен иметь максимум 2048 байтов. Даже если блок содержит только 100 байтов данных, он все равно займет те же 2048 байтов.

В некоторых случаях вам может потребоваться определить размер блока, чтобы ускорить работу dd или предотвратить повреждение данных. Возвращаясь к нашему примеру с CD-ROM, создание блоков другого размера может привести к аномалиям, когда пришло время для чтения данных.

Если не указано, dd будет использовать размер блока 512. Это наименьший размер блока, который может прочитать типичный жесткий диск.

Если ваш носитель не ограничен определенным размером блока, вы, вероятно, можете настроить его на производительность (время записи). Давайте посмотрим на несколько примеров.

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

[andreyex@fedora ~]$ sudo dd if=/dev/sda of=home_backup.img
[sudo] password for andreyex:
dd: writing to 'home_backup.img': No space left on device
31974953+0 records in
31974952+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 113.848 s, 144 MB/s

 

Производительность с размером блока 1024

[andreyex@fedora ~]$ sudo dd if=/dev/sda of=home_backup.img bs=1024
[sudo] password for andreyex:
dd: error writing 'home_backup.img': No space left on device
15987477+0 records in
15987476+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 75.4371 s, 217 MB/s

 

Вы можете видеть, что процесс был выполнен с большей скоростью. Еще один прогон с размером блока 4096 был быстрее, но со скоростью 327 МБ/с. Системное кэширование также может играть роль в скорости, но это тема для другого дня.

Возможно, вы заметили разницу в количестве записей в и из. Это связано с тем, что мы меняем размер каждого блока и, следовательно, емкость отдельных блоков, несмотря на то, что размер выходного файла остается прежним. По этой причине настройка значения bs может иметь непредвиденные последствия. Например, это может привести к расхождению при выполнении контрольной суммы.

 

Пример 3: Удалить данные и обнулить диск

Помните все предупреждения от ранее? Эта команда заменит каждый блок ‘sda’ нулями.

dd if=/dev/zero of=/dev/sda

 

Как это работает? По сути, так же, как и все остальные команды ввода и вывода dd. Что такое /dev/zero?

Это псевдо-устройство, включенное в операционные системы Unix/Linux, которое будет записывать нули в файл до тех пор, пока оно не достигнет конца файла.

Вы также можете использовать dev/random, который выводит случайные биты данных. Это может быть ненужным, если вы планируете использовать необработанный файл изображения для замены содержимого, поскольку использование dd уже скопирует неиспользуемое пространство.

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

 

Пример 4: Создание .ISO из CD/DVD

Вы можете скопировать напрямую с диска CD-ROM, если он есть на вашем компьютере. Мы ранее упоминали, что стандартный размер байта CD-ROM равен 2048. Мы установим размер байта, чтобы он соответствовал этому, чтобы избежать проблем с преобразованием, а затем добавим пару других команд.

dd if=/dev/cdrom of=space_jam_dvd.iso bs=2048 conv=noerror,sync

 

Позвольте нам объяснить несколько вещей. С conv = noerror любые ошибки будут игнорироваться. Программа будет продолжаться до последнего кадра без остановки. Это не остановит их.

При использовании в сочетании с «noerror», «sync» гарантирует, что любые отсутствующие блоки данных будут автоматически заполнены нулевой информацией.

Это означает, что существующие данные будут отображаться в те же местоположения, предположительно сохраняя как можно большую часть контента.

Важно убедиться, что ваши исходные и конечные файлы имеют одинаковый набор «bs» для этих операций, иначе они не будут иметь ожидаемых результатов.

 

Пример 5: создание загрузочного USB

Вы можете использовать dd для создания загрузочного USB, и это так же просто, как и следовало ожидать. На самом деле это одно из самых популярных применений команды dd.

Здесь есть один дополнительный шаг. Мы используем команду ‘mkfs’ для сборки файловой системы на нашем USB перед запуском ‘dd’.

Без опций используется система ext2 по умолчанию. Таким образом, предполагая, что USB, который мы хотим подготовить, называется sdb, и мы хотим изменить файловую систему на ext4, мы запустим следующую команду:

sudo mkfs.ext4 /dev/sdb

 

Если вы хотите использовать систему Windows, вы можете заменить первую часть команды на mkfs.ntfs.

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

mkfs -t [for type] $filesystem.

 

Как только загрузочный носитель подготовлен, мы можем перейти к нашей команде dd.

dd if=someFile.iso of=/dev/sdb

 

Используйте монтируемый образ .iso и скопируйте его на соответствующее имя диска для вашего USB-устройства.

 

Заключение

Спасибо за чтение. Надеюсь, вам понравился этот учебник по dd. Есть так много разных способов, которыми вы можете использовать эту команду. Мы попытались охватить множество более полезных примеров.

Источник: AndreyEx.ru