Команда dd в Unix/Linux
Утилита dd
— это программа Unix, утилита командной строки, которую в Linux используют для низкоуровневого копирования и конвертации файлов. Первый прототип программы создан еще в 1974 году, а на Unix она работает с 1984 года. Функции утилиты на самом деле значительно шире и об этом мы более детально расскажем в статье ниже.
На самом деле, команда dd
— не единственный инструмент, ведь большинство задач на Linux можно решить в несколько способов. Мы же попытаемся рассказать, почему утилита dd
до сих пор популярна среди разработчиков, хоть ее и называют иногда data destroyer
.
Содержание статьи:
1. Вступление, назначение утилиты dd
2. Безопасный режим работы с dd
3. Стандартный синтаксис и основные параметры
4. Параметры для iflag, oflag
5. Примеры использования dd
6. В заключение
Назначение команды dd
Мы упоминали, что основная задача dd
— обработка файлов. Но в Linux все устройства, порты, оперативная память и память с кодом процессов отображаются как файлы, а это значит, что над ними можно проводить операции в dd
. Еще утилита позволяет осуществлять выборочное копирование файлов с диска. Например, переместить фрагмент файла определенного размера или пропустить несколько гигабайт. Эта функция также помогает считать файлы с поврежденного носителя, изменить расположение байтов в файле, создавать файлы фиксированного размера. Кроме этого в dd
можно создать дополнительную копию загрузочного сектора жесткого диска или прочитать блоки из системных файлов.
Дисклеймер: работайте осторожно
Разработчики задумывали, что название dd
должно отсылать к аббревиатуре языка Job Control Language (JCL), который использовала IBM. В этом языке оператор dd
расшифровывался как «Доступ к данным» (Data Access).
Работая с утилитой, помните, что при передаче некорректных аргументов, часть или все данные диска могут быть потеряны. Поэтому крайне важно корректно указывать адреса и имена целевых файлов. В связи с этим dd
имеет несколько ироничных расшифровок-прозвищ, таких как data destroyer
, «добей диск
» и delete data
. Но инструмент продолжают применять из-за его мощности, надежности и простоты в использовании.
При работе с dd
рекомендуется использовать Live-режим Linux, то есть запускать систему без установки на компьютер, например с USB-носителя. Live-режим работает медленнее из-за копирования каждого байта, даже с неиспользуемого пространства.
Обратите внимание, что dd
не отличает занятое и свободное дисковое пространство и копирует все. Поэтому жесткий диск, на который переносятся данные должен быть не меньшим, чем клонируемый.
Стандартный синтаксис команды dd
Обычно синтаксис кода состоит из трех команд:
- Команда
if
;
Обозначает путь к файлу откуда будут взяты данные. Может быть как обычным файлом, так и файлом устройства.
- Команда
of
;
Указывает куда будут копироваться данные. Сохранять файлы также можно как в обычные, так и в системные файлы.
- Другие параметры использования.
Параметры для работы с командой dd
В dd
довольно большой набор дополнительных параметров для конфигурации настроек. Мы рассмотрим основные из них:
bs
— Установить размер блока (block size
), который система будет считывать. Оптимально использовать 4–8 MB;cbs
— Установить, сколько байт нужно записывать за один раз;count
— Выбрать определенное число блоков для копирования. А чтобы обозначить их размер, подключаютbs
-опцию.ibs
— обозначить сколько байт нужно считать за раз. По умолчанию — 512 байт.obs
— Обозначить сколько байт нужно записать за раз. По умолчанию — 512 байт.seek
— Пропустить определенное количество байт в начале вывода;skip
— Пропустить определенное количество байт в начале ввода;conv
— Параметр, чтобы преобразовать файл. Параметрconv
имеет собственные параметры. С их помощью, например, можно конвертировать систему кодов ASCII в EBCDIC и наоборот. В таблице указаны основные способы конвертации файлов.
Параметр | Действие |
lcase |
Заменить буквы верхнего регистра на нижний |
uncase |
Заменить буквы нижнего регистра на верхний |
nocreate |
Не создавать выходной файл |
noeror |
Игнорировать ошибки ввода-вывода |
swab |
Поменять местами каждую пару байтов ввода |
fdatasync |
Записывает данные выходного файла до окончания процесса |
fsync |
Аналогично fdatasync , но еще записываются метаданные |
notrunc |
Не обрезать выходной файл |
Параметры для iflag, oflag:
Также отдельно стоит рассмотреть параметры iflag
и oflag
. Они позволяют задать дополнительные флаги: iflag
— для устройств ввода, а oflag
— для вывода.
Наиболее популярные флаги:
append
— режим дописывания данных в файл.Append
применяют только для вывода. Когда вы объедините этот флаг с конструкцией “of=файл
”, нужно еще указать параметр “conv=notrunc
”, чтобы выходной файл не был обрезан из-за добавления новых данных.direct
— режим обработки данных в обход кэша. Этот флаг повышает скорость.dsync
— запись данных с синхронизацией. Этот флаг повышает надежность.sync
— так же как иdsync
, но и с метаданными.directory
— выдавать ошибку, при использовании каталога.fullblock
— чтение только полных блоков. Применяется только дляiflag
.noatime
— не обновляет время доступа к элементам файловой системы. Флаг повышает скорость.nofollow
— запрет на переход по символическим ссылкам.
Примеры использования dd
Передача образа Linux на флешку
Для записи образа диска на флешку, сначала нужно узнать, как она называется в системе. Для этого ее необходимо отключить и выполнить команду sudo fdisk -l
. Флешки и жесткие диски находятся в каталоге /dev
. Они подключаются по алфавиту sda
, sdb
, sdc
… Имя sda
обозначает жесткий диск, поэтому флешка будет называться sdb
или sdc
. Далее с помощью команды mount
добавляем внешний USB-накопитель в систему Linux.
sudo mount /dev/sdc1 /mnt/usb
Дальше нужно определить куда записывать данные: на раздел флешки или на саму флешку. В случае ISO-образа нужно писать на раздел. Если образ диска типа img
, то непосредственно на флешку.
Обычно это выглядит так:
sudo dd if=~/путь/к/образу/диска.iso of=/dev/sdb1
В случае записи Linux на флешку, а не на раздел, единицу после имени указывать не нужно. Также после этого этапа обязательно нужно выполнить команду sync
, чтобы не потерять часть данных, так как dd
завершает работу раньше чем данные записаны на флешку.
Клонирование диска
Скопировать данные можно как и с всего устройства, так и с отдельного диска. Примерный код перемещения жесткого диска (sda
) на внешнее устройство sdb1
будет выглядеть так:
sudo dd if=/dev/sda of=/dev/sdb1 bs=64K conv=noerror,sync
То есть здесь мы вначале установили размер блока, командой noeror
дали инструкцию продолжать запись и при этом не замечать ошибки при чтении, а sync
указывает на заполнения блоков нулями при ошибках чтения.
Обычно dd
не отображает изменений в ходе исполнения. Но можно передать инструменту опцию status=progress
. Тогда система будет отображать информацию о количестве скопированных данных в режиме реального времени.
Передача файла образа диска на другой компьютер
Назовем другой компьютер именем newcomputer
. Тогда команда для передачи файла будет выглядеть так:
# dd if=/dev/sdb | ssh root@newcomputer "(cat >backup.img)"
Архивация образа диска
Часто полезно записать сжатый образ диска, например, чтобы сделать бэкап данных. Архивацию можно реализовать несколькими способами. Наиболее популярные — утилитами bzip2
и gzip
.
Вот пример кода с bzip2
сжатием:
# dd if =/dev/disk2 | bzip2 disk2.img.gz
Или применять gzip
:
$ sudo dd if=/dev/disk3 | gzip -c > /Users/captain/raspberrypi.img.gz
Разные алгоритмы сжатия отличаются по производительности и дают разный размер архива. Также можно добавить дополнительные опции, например, размер блоков (bs
), наблюдение за статусом (status=progress
) и запись данных выходного файла (conv=fsync
).
Извлечение данных из резервной копии
Когда утилита dd
завершает работу с клонирования диска, вы получаете образ диска с названием backup_image.img.gz
. Чтобы его открыть, сначала нужно получить права суперпользователя.
Например, Ubuntu
это выполняется командой sudo su
+ пароль компьютера. В других дистрибутивах алгоритм действий аналогичный, но применяете команду su
. Такую же команду нужно повторить если восстановления из образа данных жесткого диска:
Синтаксис команды:
gunzip/+ Путь кореневой директории диска/ /backup_image.img.gz | dd of=/dev/sda
Создать образ оптического диска формата ISO
Для решения этой задачи фактически нужно прочитать «по блокам» информацию с диска и сохранить их в файле. Код для решения задачи будет выглядеть вот так:
# dd if=/dev/sr0 of=image.iso bs=4096
Восстановить файл с поврежденного устройства или создать образ этого носителя
В ситуации, когда вы потеряли доступ к документам или фотографиям из-за поврежденного диска, можно попробовать перенести информацию утилитой dd
. Производим перезапись файлов, указав команду пропускать поврежденные блоки.
Вот пример кода:
# dd if=picture.png of=/home/user1/picture.png conv=noerror,sync
Другой вариант — создать файл образа поврежденного диска и попробовать вытащить данные из него.
# dd if=/dev/sdb of=/home/user1/picture.png bs=4096 conv=noerror,sync
Анализ содержания жесткого диска
Часто нужно отыскать информацию в определенной части диска. Для этого система может пропустить считывание ненужной части блоков. Например, вы хотите узнать содержимое диска начиная с 2000-го блока (в примере произвольное число). Чтобы это сделать, достаточно выполнить такую команду:
# dd if=/dev/sdc1 count=1 skip=2000
Тестирование скорости чтения и записи дисков
В утилите dd
можно проверить насколько быстро жесткие диски и съемные устройства, например флешки, считывают и записывают информацию. Для этого мы создаем файл с блоками фиксированного размера. А потом считываем файл, используя тот же размер блока.
Так будет выглядеть синтаксис команд:
dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks
При записи мы можем считывать диск /dev/zero
, он будет источником бесконечных байтов, а отправляем его по адресу dev/null
. Этот раздел нигде физически не существует. Во время передачи dd
просто отслеживает скорость передачи файлов и отображает сведения об операции.
Чтобы определить скорость чтения кэшированных файлов, можно задать программе такие команды:
sudo dd if=tempfile of=/dev/null bs=1M count=1024 1024+0 records in 1024+0 records out
Файлы с кэша обычно считываются быстрее, поэтому, чтобы протестировать скорость чтения именно из диска, лучше очистить кэш:
sudo /sbin/sysctl -w vm.drop_caches=3 vm.drop_caches = 3 sudo dd if=tempfile of=/dev/null bs=1M count=1024 1024+0 records in 1024+0 records out
Чтобы узнать, насколько быстро проходит запись, выполните следующую команду:
sudo dd if=/dev/zero of=tempfile bs=1M count=1024 1024+0 records in 1024+0 records out
Чтобы узнать производительность внешних жестких дисков, флешек или других устройств, нужно сначала их монтировать, а затем повторить вышеуказанные команды. Альтернативный вариант — заменить tempfile на путь к точке монтирования:
sudo dd if=/dev/zero of=/media/user1/Flashcard/tempfile bs=1M count=1024
Максимальная скорость съемных устройств, которые имеют подключение USB 2.0, — 480 Мбит или 60 МВ в секунду. Но из-за различных ограничений максимальная пропускная способность ограничена на уровне примерно в 35 МВ/с.
Копирование файлов
Также утилиту dd
можно применять и для простого копирования файлов. Для этого, на самом деле, лучше использовать специальную утилиту cp
. Но иногда нет необходимости переключаться. Сделать копию данных можно с помощью такого кода:
$ dd if=/home/user1/article.txt /home/user1/article_copy.txt
В заключение
Утилита dd
предназначена для форматирования, обработки и конвертации файлов. Она работает на «низком» уровне, то есть позволяет взаимодействовать с секторами дисков. Поэтому во время работы важно помнить о соответствии размеров дисков и использовать флаг sync
для синхронизации данных. В остальном это быстрый и удобный инструмент для модерации данных на устройствах и его применение ограничивается лишь фантазией пользователя.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: