Команда dd в Linux — это утилита для копирования и преобразования файлов, которая имеет множество практических применений.
Предполагается, что имя является производным от более старой функции IBM Job Control Language, где dd означало «Data Definition (Определение данных)». В Linux аббревиатура расшифровывается как «Data Duplicator (Дубликатор данных)» или «Disk Dump (Дамп диска)» или множество других аллитераций в зависимости от вашего источника.
Возможно, он даже получил прозвище «data destroyer (разрушитель данных)», что подводит нас к важному моменту. Пожалуйста, соблюдайте осторожность при выполнении команды 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.
С предупреждениями и некоторой контекстной информацией мы готовы перейти к некоторым приложениям для этой простой, но мощной команды.
Клонирование одного диска на другой может быть очень простым с помощью 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’ больше нет свободного места.
В сводке также указывается количество скопированных данных, сколько времени это заняло и как быстро они были скопированы. Мы рассмотрим это немного подробнее, когда я расскажу о размере блока.
Шаги для клонирования устройства и резервного копирования раздела аналогичны. Вместо того, чтобы наш целевой файл был устройством, мы можем создать файл .img (необработанный образ диска).
Скажем, в нашей системе есть отдельный раздел для нашего домашнего каталога по адресу ‘sda2’, и мы хотим сделать его резервную копию в файле с именем ‘home_backup.img’ в нашем текущем каталоге.
dd if=/dev/sda2 of=home_backup.img
Это так просто! Так что теперь у вас нет оправданий тому, что у вас нет хорошей подпрограммы резервного копирования.
Конечно, это было легко, но всегда есть чему поучиться.
Прежде чем перейти к следующему примеру, давайте поговорим о 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 может иметь непредвиденные последствия. Например, это может привести к расхождению при выполнении контрольной суммы.
Помните все предупреждения от ранее? Эта команда заменит каждый блок ‘sda’ нулями.
dd if=/dev/zero of=/dev/sda
Как это работает? По сути, так же, как и все остальные команды ввода и вывода dd. Что такое /dev/zero?
Это псевдо-устройство, включенное в операционные системы Unix/Linux, которое будет записывать нули в файл до тех пор, пока оно не достигнет конца файла.
Вы также можете использовать dev/random, который выводит случайные биты данных. Это может быть ненужным, если вы планируете использовать необработанный файл изображения для замены содержимого, поскольку использование dd уже скопирует неиспользуемое пространство.
Обратите внимание, что некоторые неприятные люди обманывают ничего не подозревающих пользователей при запуске этой команды на различных форумах Linux. Теперь, когда вы знаете, что делает эта команда, вы не станете жертвой этой злой шутки.
Вы можете скопировать напрямую с диска CD-ROM, если он есть на вашем компьютере. Мы ранее упоминали, что стандартный размер байта CD-ROM равен 2048. Мы установим размер байта, чтобы он соответствовал этому, чтобы избежать проблем с преобразованием, а затем добавим пару других команд.
dd if=/dev/cdrom of=space_jam_dvd.iso bs=2048 conv=noerror,sync
Позвольте нам объяснить несколько вещей. С conv = noerror любые ошибки будут игнорироваться. Программа будет продолжаться до последнего кадра без остановки. Это не остановит их.
При использовании в сочетании с «noerror», «sync» гарантирует, что любые отсутствующие блоки данных будут автоматически заполнены нулевой информацией.
Это означает, что существующие данные будут отображаться в те же местоположения, предположительно сохраняя как можно большую часть контента.
Важно убедиться, что ваши исходные и конечные файлы имеют одинаковый набор «bs» для этих операций, иначе они не будут иметь ожидаемых результатов.
Вы можете использовать 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. Есть так много разных способов, которыми вы можете использовать эту команду. Мы попытались охватить множество более полезных примеров.
Комментарии закрыты