UNIXAWESOME

Использование команды dd

Nov. 21, 2021

Очень старая команда, которая есть во всех unix системах. Предназначена она для того, чтобы что-то куда-то копировать побайтово. Может как и копировать, так и конвертировать файлы.

Синтакс dd

Обычно синтаксис состоит из трех частей:

  • if - Путь к файлу откуда будут взяты данные. Может быть как обычным файлом, так и блочным устройством.
  • of - Указывает куда будут копироваться данные.
  • Другие параметры.
    • bs – указывает сколько байт читать и записывать за один раз(размер буфера)
    • cbs – сколько байт нужно записывать за один раз
    • count – скопировать указанное количество блоков, размер одного блока указывается в параметре bs
    • conv – применить фильтры к потоку данных
    • ibs – читать указанное количество байт за раз
    • obs – записывать указанное количество байт за раз
    • seek – пропустить указанное количество байт в начале устройства для чтения
    • skip – пропустить указанное количество байт в начале устройства вывода
    • status – указывает насколько подробным нужно сделать вывод
    • iflag, oflag – позволяет задать дополнительные флаги работы для устройства ввода и вывода, основные из них: nocache, nofollow.

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

Перед тем как подставить свой диск в команду убедитесь что это точно то устройство с которого или на которое будет производится запись. Для этого можно воспользоваться командой lsblk.

  • Запись образа диска на флешку

    dd if=archlinux-2021.11.01-x86_64.iso of=/dev/sdb bs=4M status=progress oflag=sync
    
  • Заполнить диск нулями(уничтожение информации)

    dd if=/dev/zero of=/dev/sda bs=4k
    
  • Заполнить диск случайными данными(более надёжный способ уничтожения данных чем заполнение нулями)

    dd if=/dev/urandom of=/dev/sda bs=4k
    
  • Клонирование одного диска на другой диск

    dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync status=progress
    
  • Клонирование одного раздела на другой раздел

    dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync status=progress
    
  • Создание образа всего диска

    dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c  > /path/to/backup.img.gz
    

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

    dd if=/dev/sda conv=sync,noerror bs=64K | gzip -c | ssh user@local dd of=backup.img.gz
    
  • Восстановление из образа

    gunzip -c /path/to/backup.img.gz | dd of=/dev/sda
    
  • Бэкапирование и восстановление MBR

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

    Чтобы сохранить MBR как mbr_file.img:

    dd if=/dev/sdX of=/path/to/mbr_file.img bs=512 count=1
    
  • Извлечь MBR из уже сделаного образа диска

    dd if=/path/to/disk.img of=/path/to/mbr_file.img bs=512 count=1
    
  • Восстановить MBR

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

    dd if=/path/to/mbr_file.img of=/dev/sdX bs=512 count=1
    

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

    dd if=/path/to/mbr_file.img of=/dev/sdX bs=440 count=1
    
  • Восстановить только таблицу разделов

    dd if=/path/to/mbr_file.img of=/dev/sdX bs=1 skip=446 count=64
    
  • Удалить загрузчик

    Обнуляем первые 440 байт

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