dd (Русский)

dd — это основная утилита, основной задачей которой является конвертация и копирование файлов.

Состояние перевода: На этой странице представлен перевод статьи dd. Дата последней синхронизации: 2 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Как и cp, по умолчанию dd делает точную копию файла, но позволяет контролировать параметры ввода-вывода на низком уровне.

Подробности можно почитать в dd(1) или полной документации.

Совет: По умолчанию dd ничего не пишет в консоль в процессе работы. Чтобы следить за процессом, можно использовать опцию status=progress.
Важно: Будьте крайне осторожны при использовании dd, так как её использование может необратимо уничтожить данные.

Установка

dd входит в состав GNU . Другие утилиты из этого пакета описаны в статье Основные утилиты.

Клонирование диска и восстановление

Команда dd — это простой, но универсальный и мощный инструмент. Она может использоваться для копирования, блок за блоком, независимо от типа файловой системы или операционной системы. Нередко dd используется в LiveCD.

Клонирование раздела

Копирование раздела 1 на диске в раздел 1 на диске :

# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress
Примечание: Проверяйте существование файла целевого устройства (в данном примере sdb1). Если он не существует, то dd создаст новый файл, который будет занимать место в вашей файловой системе.

Клонирование всего диска

Копирование физического диска в диск :

# dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress

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

  • bs= устанавливает размер блока. По умолчанию 512 байт, что является «классическим» размером блока для жёстких дисков с начала 1980-х годов, но не самым удобным. Используйте большее значение, 64K или 128K. Также прочитайте предупреждение ниже, потому что это не просто «размер блока» — это также влияет на обработку ошибок чтения. Смотрите и для получения подробной информации и определения наилучшего значения bs для вашего случая.
  • указывает dd продолжить работу, игнорируя все ошибки чтения. По умолчанию dd прекращает работу при любой ошибке.
  • заполняет входные блоки нулями, если были ошибки чтения, чтобы смещения данных оставались правильными.
  • показывает статистику передачи данных, которая позволяет оценить время завершения.

Утилита dd технически имеет «размер входного блока» (IBS) и «размер выходного блока» (OBS). Когда вы устанавливаете , вы фактически устанавливаете и IBS, и OBS. Обычно, если размер блока, скажем, 1 МиБ, dd считывает 1024×1024 байт и записывает столько же байт. Но если произойдет ошибка чтения, всё пойдет не так. Многие думают, что dd «заполнит ошибки чтения нулями», если вы используете опции , но это не так. dd, согласно документации, дополнит размер OBS до размера IBS после завершения чтения, что означает добавление нулей в конце блока. То есть, весь 1 МиБ будет испорчен из-за одной ошибки чтения в 512 байт в начале чтения: 12ERROR89 станет 128900000 вместо 120000089.

Если вы уверены, что ваш диск не содержит ошибок, вы можете использовать больший размер блока, что увеличит скорость копирования в несколько раз. Например, изменение bs с 512 до 64K изменило скорость копирования с 35 МБ/с до 120 МБ/с на простой системе Celeron 2,7 ГГц. Но имейте в виду, что ошибки чтения на исходном диске будут в конечном итоге выглядеть как ошибки блоков на целевом диске, то есть одна ошибка чтения 512 байт испортит весь выходной блок размером 64 КиБ.

Резервное копирование таблицы разделов

Смотрите fdisk (Русский)#Резервное копирование и восстановление таблицы разделов или GPT fdisk (Русский)#Резервное копирование и восстановление таблицы разделов.

Создание образа диска

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

Затем смонтируйте целевой диск и запишите на него резервную копию:

# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c  > /путь/к/копии.img.gz

При необходимости (например, если результирующие файлы будут храниться в файловой системе FAT32) можно разделить образ диска на несколько частей (смотрите также ):

# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | split -a3 -b2G - /путь/к/копии.img.gz

Если не хватает свободного места на локальном диске, можно отправить образ через ssh:

# dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | ssh user@local dd of=копия.img.gz

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

# fdisk -l /dev/sda > /путь/к/list_fdisk.info
Примечание: Вы можете использовать размер блока (bs=), равный объёму кэша на диске, с которого выполняется копирование. Например, bs=8192K подходит для кэша 8 МиБ. Упомянутые в этой статье 64 КиБ лучше, чем стандартные bs=512 байт, но при большем bs= копирование будет ещё быстрее.

Восстановление системы

Чтобы восстановиться из такой резервной копии:

# gunzip -c /путь/к/копии.img.gz | dd of=/dev/sda

Если образ был разделён на несколько частей командой split, используйте другую команду (обратите внимание на звёздочку):

# cat /путь/к/копии.img.gz* | gunzip -c | dd of=/dev/sda

Патчинг бинарных файлов

Если нужно заменить заменить три байта по смещению 0x123AB, это можно сделать с помощью такой команды:

# printf '\xff\xc0\x14' | dd seek=$((0x123AB)) conv=notrunc bs=1 of=/путь/к/файлу

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

Перед внесением изменений на диск можно создать резервную копию таблицы разделов и схемы разделов диска. Также можно использовать резервную копию для копирования одной и той же схемы разделов на несколько дисков.

MBR хранится в первых 512 байтах диска. Она состоит из 4 частей:

  1. Первые 440 байт содержат загрузочный код (загрузчик).
  2. Следующие 6 байт содержат сигнатуру диска.
  3. Следующие 64 байта содержат таблицу разделов (4 записи по 16 байт каждая, по одной записи на каждый основной раздел).
  4. Последние 2 байта содержат сигнатуру загрузки.

Сохранение MBR в :

# dd if=/dev/sdX of=/путь/к/mbr_file.img bs=512 count=1

Также можно извлечь MBR из полного образа диска dd:

# dd if=/путь/к/образу.img of=/путь/к/mbr_file.img bs=512 count=1

Для восстановления (будьте осторожны, это уничтожит существующую таблицу разделов, а вместе с ней и доступ ко всем данным на диске):

# dd if=/путь/к/mbr_file.img of=/dev/sdX bs=512 count=1

Если вы хотите восстановить только загрузчик, но не информацию о разделах, просто восстановите первые 440 байт MBR:

# dd if=/путь/к/mbr_file.img of=/dev/sdX bs=440 count=1

Восстановление только таблицы разделов без затрагивания загрузчика и сигнатуры:

# dd if=/путь/к/mbr_file.img of=/dev/sdX bs=1 skip=446 count=64

Удаление загрузчика

Чтобы стереть загрузочный код MBR (может быть полезно, если вам нужно сделать полную переустановку другой операционной системы), можно обнулить первые 440 байт:

# dd if=/dev/zero of=/dev/sdX bs=440 count=1

Решение проблем

Partial read

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

Возможно, но не гарантировано, что dd предупредит вас об этой проблеме:

dd: warning: partial read (X bytes); suggest iflag=fullblock

Решается это так, как и предлагает предупреждение: добавлением iflag=fullblock к команде dd:

$ dd if=/dev/random of=bigsecret.img bs=1K count=1 iflag=fullblock
$ dd if=/dev/urandom of=bigsecret.img bs=40M count=1 iflag=fullblock

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

$ dd if=/dev/urandom of=bigsecret.img bs=1M count=40

При чтении из pipe альтернативой для для iflag=fullblock может быть прописывние для значения , которое определено в . Например:

$ cat input.img | dd of=output.img bs=4k count=100
gollark: I'm currently """busy""".
gollark: I'm sure there would be fun edge cases if you tried to upscale to automated deliveries in bulk.
gollark: Er, did.
gollark: Yes, it was very lazy but does mostly work.
gollark: Just use nether links for long range shipping.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.