Главная >> Команды >> Команда dd Linux

Команда dd Linux

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

Для решения всех этих задач используется утилита dd linux, которая просто выполняет копирование данных из одного места в другое на двоичном уровне. Она может скопировать CD/DVD диск, раздел на диске или даже целый жесткий диск. В этой статье мы рассмотрим что из себя представляет команда dd linux, основные ее опции и параметры, а также как ею пользоваться.


Содержание статьи

Как работает команда dd?

Сначала нужно понять как работает команда dd и что она делает. Фактически, это аналог утилиты копирования файлов cp только для блочных данных. Утилита просто переносит по одному блоку данных указанного размера с одного места в другое. Поскольку в Linux все, в том числе, устройства, считается файлами, вы можете переносить устройства в файлы и наоборот.

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

Команда dd

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

$ dd if=источник_копирования of=место_назначения параметры

С помощью параметра if вам нужно указать источник, откуда будут копироваться блоки, это может быть устройство, например, /dev/sda или файл - disk.img. Дальше, с помощью параметра of необходимо задать устройство или файл назначения. Другие параметры имеют такой же синтаксис, как if и of.

Теперь давайте рассмотрим дополнительные параметры:

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

Это были все основные опции, которые вам могут понадобиться. Теперь перейдем ближе к практике и рассмотрим несколько примеров как пользоваться утилитой dd linux.

Как пользоваться dd?

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

sudo dd if=/dev/sr0 of=~/CD.iso bs=2048 conv=noerror

 

Фильтр noerror позволяет отключить реагирование на ошибки. Дальше, вы можете создать образ жесткого диска или раздела на нем и сохранить этот образ на диск. Только смотрите не сохраните на тот же жесткий диск или раздел, чтобы не вызвать рекурсию:

dd if=/dev/sda of=~/disk.img

 

В вашей домашней папке будет создан файл с именем disk1.img, который в будущем можно будет развернуть и восстановить испорченную систему. Чтобы записать образ на жесткий диск или раздел достаточно поменять местами адреса устройств:

dd if=~/disk.img of=/dev/sda

Очень важная и полезная опция - это bs. Она позволяет очень сильно влиять на скорость работы утилиты. Этот параметр позволяет установить размер одного блока при передаче данных. Здесь нужно задать цифровое значение с одним из таких модификаторов формата:

  • с - один символ;
  • b - 512 байт;
  • kB - 1000 байт;
  • K - 1024 байт;
  • MB - 1000 килобайт;
  • M - 1024 килобайт;
  • GB - 1000 мегабайт;
  • G - 1024 мегабайт.

Команда dd linux использует именно такую систему, она сложная, но от этого никуда не деться. Ее придется понять и запомнить. Например, 2b - это 1 килобайт, и 1k, это тоже 1 килобайт, 1М - 1 мегабайт. По умолчанию утилита использует размер блока - 512 байт. Например, чтобы ускорить копирование диска можно брать блоки размером по 5 мегабайт. Для этого применяется такая команда:

 dd if=/dev/sda of=~/disk.img bs=5M

Следующий параметр - это count. С помощью него можно указать сколько блоков необходимо скопировать. Например, мы можем создать файл размером 512 мегабайт, заполнив его нулями из /dev/zero или случайными цифрами из /dev/random:

sudo dd if=/dev/zero of=file.img bs=1M count=512

Обратите внимание, что этот параметр указывает не размер в мегабайтах, а всего лишь количество блоков. Поэтому, если вы укажите размер блока 1b, то для создания файла размером 1Кб нужно взять только два блока. С помощью этого параметра также можно сделать резервную копию таблицы разделов MBR. Для этого скопируем в файл первые 512 байт жесткого диска:

sudo dd if=/dev/sda of=mbr.img bs=1b count=1

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

Если образ диска слишком большой, можно перенаправить весь вывод нестандартный поток вывода утилиты gzip:

dd if =/dev/sda2 | bzip2 disk.img.bz2

Также можно использовать утилиту dd linux для копирования файлов, хотя это и не является ее прямым предназначением:

dd if=/home/sergiy/test.txt of=/home/sergiy/test1.txt

Как вы знаете, команда dd linux пишет данные на диск непосредственно в двоичном виде, это значит, что записываются нули и единицы. Они переопределяют то, что было раньше размещено на устройстве для записи. Поэтому чтобы стереть диск вы можете просто забить его нулями из /dev/zero.

sudo dd if=/dev/zero of=/dev/sdb

Такое использование dd приводит к тому что весь диск будет полностью стерт.

Выводы

В этой статье мы рассмотрели как пользоваться dd linux, для чего можно применять эту утилиту и насколько она может быть полезной. Это почти незаменимый инструмент системного администратора, поскольку с помощью нее можно делать резервные копии целой системы. И теперь вы знаете как. Если у вас остались вопросы, спрашивайте в комментариях!

26 комментариев к “Команда dd Linux”

  1. Мне вот что интересно, когда я на флешку записываю с помощью команды dd скачаный с интернета диск с дистрибутивом линукс, флешка при этом загрузочная становится и если да, то и для BIOS и UEFI ?

    Ответить
    • Загрузочная для BIOS и UEFI - зависит от образа, а если точнее: и BIOS, и UEFI распознают загрузочную метку (ибо она одна и стандартизирована для всех видов ФС) и попытаются с неё загрузиться (если не включён иной диск для загрузки), а вот загрузится или нет - зависит от содержимого. По сути, Вы с помощью dd вливаете образ диска вместе с его разметкой/заголовком, т.е. теоретически: берём загрузочный DVD и dd-офим его на флэху, теперь у нас не флэха, а DVD-болванка со всей её разметкой и файловой системой (в BIOS должна распозноваться как CD-USB).

      Ответить
  2. Остаётся только добавить, что dd не только может передавать данные в стандартный поток вывода, но и принимать его со стандартного потока, т.е. конструкция dd if=in_file 2>/dev/null | dd of=out_file будет замечательно работать и 2>/dev/null я здесь добавил не зря, т.к. dd по умолчанию выводит свой лог-вывод в std_error и он не уместно добавится в конец out_file, если вместо | будет использован какой-нибудь канал; dd of=out_file, по сути - это cat > out_file

    Ответить
  3. Подскажите пожалуйста, как можно посмотреть прогресс выполнения операции, например при форматирование видеть сколько отформатировано?

    Ответить
  4. Перепутаны описания параметров seek и skip.
    Правильно:
    seek - пропустить указанное количество байт в начале устройства вывода;
    skip - пропустить указанное количество байт в начале устройства для чтения;

    Ответить
  5. Хорошо бы пример создания образа диска по сети по SSH, На локальном диске места нет тупо для создания образа. Пишу SSH root/ip "dd if=/dev/sda bs=64k" of=~/test/test.iso выдает ошибку no such file or directory, ssh на хосте открыт, на локальном компе нет.

    Ответить
    • Можно примонтировать файловую систему удаленной машины с помощью sshfs или cifs и работать с ней как с обычным каталогом

      Ответить
  6. Подскажите пож-та!
    Переношу впс на другого хостера полным копированием диска 20гб командой
    ssh root@78.34.11.87 "dd if=/dev/vda " | dd of=vps.img (промежуточный сервер используется для резервной копии старого впс и восстановления на новый впс)
    но почему то при создании .img создание архива обрывается на 15 гб

    1) Можно ли .img как то на меньшие файлы нарезать при создании копии старого впс?
    2) можно ли после восстановить на новый впс эти нарезанные файлы образа?

    Ответить
  7. если надо пожатый образ сделать
    из директории с файлом:
    sudo dd if=afile.txt | bzip2 -c > "/run/media/liveuser/certain_hard_disk/Backup/backup_afile.img.bz2"
    backup_afile.img после этого нормально открывается текстовым редактором.
    если надо раздел, то через fdisk -l найти его и потом поставить вместо afile.txt

    Ответить
  8. Не дает покоя вопрос, можно ли использовать dd для бережного поблочного копирования огромной папки с программами, играми и видео на USB-HDD?

    Ответить
  9. sudo dd if=/dev/zero of=/dev/sdb
    Если диск большой, то команда будет выполняться очень долго. При этом не будет отображаться ничего, как будто ничего не происходит. Например, диск размером терабайт может забиваться нулями чуть ли не сутки. Вот так будет уже не так скучно наблюдать:
    sudo dd if=/dev/zero of=/dev/sdb status=progress.

    Ответить
  10. !!!!!!!!!
    seek - пропустить указанное количество байт в начале устройства для чтения;
    skip - пропустить указанное количество байт в начале устройства вывода;

    - это не верно!!! Как раз всё с точностью наоборот!!!

    Ответить
  11. Два идентичных диска.
    На одном живу, на другой время от времени накатываю бэкап копию.
    В этот раз input/output error при копировании диска на диск,
    случилось примерно на половине,
    я в курсе, что у таргет-диска есть несколько сбойных секторов (менее 20),
    ошибка, скорее всего, выпала на какое-нибудь видео, да и плевать, еще скачаю,
    жаль, что не говорит, на каком именно файле споткнулся.

    меня интересует - есть ли способ обойти?

    При этом, если на сбойный диск ставить систему и переносить файлы, то диск работает отлично - видимо, сбойные сектора игнорятся.
    Проблема в том, что ставить и переносить у меня уйдет полных три дня,
    а на копирование - часов 5 при моем отсутствии.
    Хотелось бы сэкономить время.

    Ответить
    • И еще вопрос:
      когда dd копирует, после счетчика байтов идут цифры в скобках, типа
      180457885696 bytes (180 GB, 168 GB) copied
      Что они означают?

      Ответить
  12. Имею диск = 100 Гб
    На диске раздел = 1Гб
    В разделе файлов = 500Мб
    Делаю архив диска DD
    dd if=/dev/sdc of=/mnt/test1.img bs=4M status=progress
    test1.img = 100Гб, а полезной инфы там 500мб
    Можно сжать как-то? ( по типу acronis )

    Как пример: dd if=/dev/sdc of=/mnt/test1.img bs=5M count=501 status=progress
    test1.img = 501Мб

    Ответить

Оставьте комментарий