# Команда dd

Стандартный синтаксис команды выглядит следующим образом:

```
dd if=<имя исходного файла> of=<имя целевого файла> [параметры]
```

Несложно заметить, что для передачи параметров утилите используется формат записи <имя параметра>=<значение параметра>. Утилита может читать исходные данные из стандартного потока ввода и выводить результирующие данные с помощью стандартного потока вывода в случае отказа от использования параметров if и of, но в подавляющем большинстве случаев данные параметры являются необходимыми для указания имен файлов с соответствующими данными. Утилита читает и записиывает данные блоками, причем размер блока может изменяться с помощью параметра bs (по умолчанию используются блоки размером в 512 Кб). Существуют отдельные параметры для задания размеров читаемых и записываемых блоков, а именно, ibs и obs. Количество читаемых блоков может ограничиваться в помощью параметра count. Для пропуска заданного количества блоков исходного файла может использоваться параметр skip, целевого файла — параметр seek. Для указания флагов чтения и записи через запятую может использоваться параметр iflag. Наиболее часто используемыми флагами являются:

* append — активация режима дописывания данных в целевой файл.
* direct — режим обработки данных в обход кэша файловых систем (повышает скорость).
* dsync — режим записи данных с синхронизацией (повышает надежность).
* sync — режим записи данных и метаданных с синхронизацией (повышает надежность).
* fullblock — чтение лишь полных блоков.
* nonblock — активация режима неблокируемого ввода/вывода (повышает скорость).
* noatime — отключение механизма обновления меток времени элементов файловой системы (повышает скорость).
* nofollow — отказ от перехода по символьным ссылкам.

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

* lcase — перевод символов строки в кодировке ASCII в нижний регистр.
* ucase — перевод символов строки в кодировке ASCII в верхний регистр.
* nocreat — вывод сообщения об ошибке в случае отсутствия целевого файла.
* excl — вывод сообщения об ошибке в случае существования целевого файла.
* notrunc — отказ от урезания целевого файла.
* swab — смена мест каждых двух байтов из исходного файла.
* noerror — продолжение работы даже в случае возникновения ошибок.
* fdatasync — активация режима записи данных в целевой файл перед завершением работы утилиты.
* fsync — активация режима записи данных и метаданных в целевой файл перед завершением работы утилиты.

### Примеры использования

#### **Создание резервной копии данных дискового накопителя**

Предположим, мы используем жесткий диск, представленный файлом устройства /dev/sda, и нам нужно создать посекторную резервную копию всех размещенных на нем данных, сохранив ее в файле в разделе съемного диска с интерфейсом USB, представленном файлом устройства /dev/sdb1 и смонтированным в директорию /mnt/sdb1. Обычно такие файлы резервных копий называются дампами или образами дисков. Наш файл образа диска будет носить имя backup.img. Это команда, с помощью которой его можно создать:

```
dd if=/dev/sda of=/mnt/sdb1/backup.img
```

В данной команде с помощью параметра if задается путь к исходному файлу, а с помощью параметра of — к целевому.

#### **Восстановление данных из резервной копии**

Для восстановления данных из созданной резервной копии следует загрузить систему с установочного диска дистрибутива и выполнить обратную команду.

```
dd if=/mnt/sdb1/backup1.img of=/dev/sda
```

*Предупреждение: при выполнении данной команды будет перезаписано все содержимое указанного жесткого диска, поэтому стоит относиться к подобным командам с особым вниманием.*

#### **Клонирование жесткого диска**

Перед клонированием жесткого диска вы должны убедиться в том, что у вас имеется жесткий диск того же объема, что и исходный. Эта же операция может выполняться и в случае флеш-накопителей с интерфейсом USB аналогичных объемов. Предположим, что исходный флеш-накопитель представлен файлом устройства /dev/sdb, а целевой — файлом устройства /dev/sdc. В этом случае вы можете клонировать исходный накопитель с помощью следующей команды:

```
dd if=/dev/sdb of=/dev/sdc
```

Даже в том случае, если целевой накопитель имеет больший объем, вам будет доступен лишь объем исходного флеш-накопителя, сохраненный на уровне файловой системы.

#### **Передача файла образа диска на другой компьютер**

Для передачи файла образа диска по сети на другой компьютер с именем target может использоваться следующая команда:

```
dd if=/dev/sdb | ssh root@target "(cat >backup.img)"
```

#### **Сжатие файла образа диска**

Для того, чтобы резервная копия раздела диска занимала меньше места, вы можете сжать ее с помощью компрессора, такого, как [bzip2](https://linux-faq.ru/page/komanda-bzip2):

```
dd if=/dev/sdb | bzip2 backup.img.bz2
```

С помощью gzip

```
dd if=dev/sda1 | gzip - | dd of=/path_to_backups/fs.img.gz
```

С помощью xz

```
dd if=/dev/sda1 | xz -z -9 -e -k --threads=0 > file
```

#### Развертывание из сжатого образа

```
dd if=fs.img.gz | gunzip - | dd of=/dev/sda1
```

```
xz -dc --threads=0 file | dd of=file status=progress
```

#### **Создание образа оптического диска формата ISO**

Для создания образа оптического диска CD, DVD или BD достаточно поблочно прочитать его содержимое и сохранить это содержимое в файле:

```
dd if=/dev/sr0 of=image.iso bs=2048
```

#### **Сохранение файла с поврежденного носителя или создание образа такого носителя**

Если ваш любимый фильм или музыкальный трек больше не читается из-за повреждения носителя, вы можете попробовать скопировать его с помощью утилиты dd, игнорируя поврежденные блоки:

```
dd if=movie.avi of=/home/alex/movie.avi conv=noerror,sync
```

Вы также можете создать файл образа поврежденного носителя и попытаться извлечь файлы из него:

```
dd if=/dev/sdb of=/home/alex/movie.iso bs=2048 conv=noerror,sync

```

#### **Запись образа установочного диска на флеш-накопитель с интерфейсом USB**

Для установки дистрибутива Linux с флеш-накопителя с интерфейсом USB необходимо записать на этот флеш-накопитель образ установочного диска формата ISO. Для этой цели может использоваться аналогичная команда:

```
dd if=/home/alex/Fedora-Workstation-Live-x86_64-26_Alpha-1.7.iso of=/dev/sdc
```

Важно помнить, что даже в случае наличия на флеш-накопителе разделов следует указывать не путь к файлу устройства одного из разделов, а путь к файлу устройства самого накопителя, в нашем случае это /dev/sdc.

#### **Анализ содержимого жесткого диска**

Утилита dd является отличным инструментом для исследования файловых систем. Для анализа содержимого жесткого диска с выводом данных из отдельных блоков, в нашем случае, блока 1001 на разделе, представленном файлом устройства /dev/sdc1, достаточно использовать следующую команду:

```
dd if=/dev/sdc1 count=1 skip=1000
```

Для того, чтобы увидеть первые 40 байт вашего жесткого диска в шестнадцатеричном представлении следует использовать команду:

```
dd if=/dev/sda bs=1 count=40 | hexdump -C

```

В данном случае с помощью параметра bs задается размер блока диска.
