Dd — различия между версиями

Материал из VAAL-WIKI
Перейти к: навигация, поиск
(Новая страница: «'''dd''' ('''d'''ataset '''d'''efinition) — программа UNIX, предназначенная как для копирования, так и для ко…»)
 
Строка 44: Строка 44:
  
 
Скопировать файл foo в файл bar:
 
Скопировать файл foo в файл bar:
 
+
<source lang="bash">
 
     dd if=foo of=bar
 
     dd if=foo of=bar
 
+
</source>
 
Скопировать файл foo в файл bar, пропустив первые 10 КБ из файла foo:
 
Скопировать файл foo в файл bar, пропустив первые 10 КБ из файла foo:
 
+
<source lang="bash">
 
     dd if=foo of=bar bs=1k skip=10
 
     dd if=foo of=bar bs=1k skip=10
 
+
</source>
 
Порезать 10-мегабайтный файл foo на 2 по 5 МБ:
 
Порезать 10-мегабайтный файл foo на 2 по 5 МБ:
 
+
<source lang="bash">
 
     dd if=foo of=bar.0 bs=1M count=5
 
     dd if=foo of=bar.0 bs=1M count=5
 
     dd if=foo of=bar.1 bs=1M skip=5
 
     dd if=foo of=bar.1 bs=1M skip=5
 
+
</source>
 
Склеить четыре 100-мегабайтных файла в один:
 
Склеить четыре 100-мегабайтных файла в один:
 
+
<source lang="bash">
 
     dd if=SMILE.001 of=SMILE  bs=1M seek=0
 
     dd if=SMILE.001 of=SMILE  bs=1M seek=0
 
     dd if=SMILE.002 of=SMILE  bs=1M seek=100
 
     dd if=SMILE.002 of=SMILE  bs=1M seek=100
 
     dd if=SMILE.003 of=SMILE  bs=1M seek=200
 
     dd if=SMILE.003 of=SMILE  bs=1M seek=200
 
     dd if=SMILE.004 of=SMILE  bs=1M seek=300
 
     dd if=SMILE.004 of=SMILE  bs=1M seek=300
 
+
</source>
  
 
а можно и так:
 
а можно и так:
 
+
<source lang="bash">
 
     dd if=SMILE.001 > SMILE
 
     dd if=SMILE.001 > SMILE
 
     dd if=SMILE.002 >> SMILE
 
     dd if=SMILE.002 >> SMILE
 
     dd if=SMILE.003 >> SMILE
 
     dd if=SMILE.003 >> SMILE
 
     dd if=SMILE.004 >> SMILE
 
     dd if=SMILE.004 >> SMILE
 
+
</source>
 
или же (для сбора файла из большого количества кусков):
 
или же (для сбора файла из большого количества кусков):
 
+
<source lang="bash">
 
     for i in {1..4}; do  
 
     for i in {1..4}; do  
 
         dd if=SMILE.00$i >> SMILE
 
         dd if=SMILE.00$i >> SMILE
 
     done
 
     done
 
+
</source>
  
 
Примеры выше показывают возможности dd; на практике, обычно, используется [[cat]]:
 
Примеры выше показывают возможности dd; на практике, обычно, используется [[cat]]:
 
+
<source lang="bash">
 
     cat SMILE.00{1,2,3,4} >> SMILE
 
     cat SMILE.00{1,2,3,4} >> SMILE
 
+
</source>
 
Вывести на экран (в /dev/stdout) первые 256 байт файла foo:
 
Вывести на экран (в /dev/stdout) первые 256 байт файла foo:
 
+
<source lang="bash">
 
     dd if=foo of=/dev/stdout bs=128 count=2
 
     dd if=foo of=/dev/stdout bs=128 count=2
 
+
</source>
 
или:
 
или:
 
+
<source lang="bash">
 
     dd if=foo bs=128 count=2
 
     dd if=foo bs=128 count=2
 
+
</source>
 
Предыдущая команда годится только для просмотра текстового файла. Содержимое бинарного файла рекомендуется смотреть так:
 
Предыдущая команда годится только для просмотра текстового файла. Содержимое бинарного файла рекомендуется смотреть так:
 
+
<source lang="bash">
 
     dd if=foo bs=1 count=10 2>/dev/null | hexdump
 
     dd if=foo bs=1 count=10 2>/dev/null | hexdump
 +
</source>
  
 
=== Резервное копирование и удаление данных ===
 
=== Резервное копирование и удаление данных ===

Версия 10:40, 6 апреля 2017

dd (dataset definition) — программа UNIX, предназначенная как для копирования, так и для конвертации файлов. Название унаследовано от оператора DD (Dataset Definition) из языка JCL.

Поскольку в UNIX очень многие объекты (жёсткие/гибкие диски, COM/LPT-порты, оперативная память компьютера, память с кодом/данными каждого процесса) представлены в виде специальных файлов, спектр применения утилиты dd гораздо шире, чем кажется на первый взгляд. Регулярно возникает необходимость не просто скопировать файл или несколько файлов (для чего предназначена утилита cp), а скопировать первые n байт файла, пропустить m байт от начала, прочитать файл с дефектного носителя, транслировать содержимое файла в ASCII, «развернуть» порядок байтов в файле, просто скопировать очень большой файл или всё вместе взятое. Для этой цели и служит dd.

Кроме всего прочего, данная утилита позволяет скопировать регионы из файлов «сырых» устройств, например, сделать резервную копию загрузочного сектора жёсткого диска, или прочитать фиксированные блоки данных из специальных файлов, таких, как /dev/zero или /dev/random.

Название утилиты dd иногда в шутку расшифровывают, как «disk destroyer», «data destroyer» или «delete data», так как утилита позволяет производить низкоуровневые операции на жёстких дисках — при малейшей ошибке (такой, как реверс параметров if и of) можно потерять часть данных на диске (или даже все данные). Есть и более «уважительное» прозвище — «disk duplicator», потому что на практике основное её применение — это копии, образы и бэкапы разделов.

Некоторые параметры

При написании статьи были использованы материалы man dd, описывающие версию dd от GNU. Версии dd на других операционных системах могут отличаться.

Базовые параметры

dd [--help] [--version] [status] [if=файл] [of=файл] [ibs=байты] [obs=байты] [bs=байты] [cbs=байты] [skip=блоки] [seek=блоки] [count=блоки] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]

  • status=progress — отображает статистику передачи, возможны 3 варианта 'none', 'noxfer', 'progress' GNU Coreutils 8.24+ (Ubuntu 16.04 and newer) .
  • if=файл — читает данные из файла вместо стандартного ввода.
  • of=файл — пишет данные в файл вместо стандартного вывода.
  • bs=n — размер блока.
  • ibs=nn и obs=nn — задаёт, сколько байтов нужно считывать или записывать за раз.
  • count=n — сколько блоков скопировать.
  • seek=n — сколько блоков пропустить от начала в выходном файле перед копированием.
  • skip=n — сколько блоков пропустить от начала во входном файле перед копированием.
  • conv=фильтр,фильтр — применить фильтры конвертации. Типы фильтров:
    • ascii — сконвертировать в ASCII из EBCDIC…
    • ebcdic — …и наоборот.
    • block — выравнивание блоков.
    • lcase — преобразовать к нижнему регистру.
    • ucase — преобразовать к верхнему регистру.
    • swab — менять местами пары байт.
    • noerror — игнорировать ошибки ввода-вывода.

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

Работа с CD/DVD-дисками и образами

Создать образ CD/DVD, используя большой размер блока. Игнорировать ошибки:

   dd if=/dev/cdrom of=backup.iso bs=65536 conv=noerror

Записать ISO-образ «image.iso» на устройство sdb вместе с его загрузочным сектором и форматированием раздела в файловую систему образа (как правило, ISO 9660 или UDF):

   dd if=image.iso of=/dev/sdb

Работа с файлами

Скопировать файл foo в файл bar:

    dd if=foo of=bar

Скопировать файл foo в файл bar, пропустив первые 10 КБ из файла foo:

    dd if=foo of=bar bs=1k skip=10

Порезать 10-мегабайтный файл foo на 2 по 5 МБ:

    dd if=foo of=bar.0 bs=1M count=5
    dd if=foo of=bar.1 bs=1M skip=5

Склеить четыре 100-мегабайтных файла в один:

    dd if=SMILE.001 of=SMILE  bs=1M seek=0
    dd if=SMILE.002 of=SMILE  bs=1M seek=100
    dd if=SMILE.003 of=SMILE  bs=1M seek=200
    dd if=SMILE.004 of=SMILE  bs=1M seek=300

а можно и так:

    dd if=SMILE.001 > SMILE
    dd if=SMILE.002 >> SMILE
    dd if=SMILE.003 >> SMILE
    dd if=SMILE.004 >> SMILE

или же (для сбора файла из большого количества кусков):

    for i in {1..4}; do 
        dd if=SMILE.00$i >> SMILE
    done

Примеры выше показывают возможности dd; на практике, обычно, используется cat:

    cat SMILE.00{1,2,3,4} >> SMILE

Вывести на экран (в /dev/stdout) первые 256 байт файла foo:

    dd if=foo of=/dev/stdout bs=128 count=2

или:

    dd if=foo bs=128 count=2

Предыдущая команда годится только для просмотра текстового файла. Содержимое бинарного файла рекомендуется смотреть так:

    dd if=foo bs=1 count=10 2>/dev/null | hexdump

Резервное копирование и удаление данных

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

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

   dd if=/dev/sda1 of=/dev/sdb2 bs=4096 conv=noerror,sync


Сделать копию главной загрузочной записи (MBR) первого жёсткого диска:

   dd if=/dev/hda of=bootloader.mbr bs=512 count=1

Заполнить всё свободное место в текущем разделе нулями:

   dd if=/dev/zero of=zerofill

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

   dd if=/dev/sda | xz -9 > MyFuBu.ISO.XZ


Просмотреть содержимое главной загрузочной записи (MBR) первого жёсткого диска:

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

Копировать всё, кроме метки, с диска на магнитную ленту:

   (dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape

Копировать всё, не перезаписывая метку, с магнитной ленты на диск:

   (dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk

Уничтожить содержимое устройства /dev/sdg, заполнив его «нулями» из /dev/zero:

   dd if=/dev/zero of=/dev/sdg bs=65536

Узнать статус выполнения операции:

   killall -USR1 dd

В некоторых случаях статус выполнения просматривается командой:

   pkill -USR1 -x dd
В последних версиях статус выполнения можно выводить в консоль, задав команду dd с параметром status=progress
    dd if=image.iso of=/dev/sdb status=progress
 
== Варианты dd, ориентированные на восстановление ==
 
Программы с открытым исходным кодом для восстановления включают [http://www.garloff.de/kurt/linux/ddrescue/ dd_rescue] и [http://www.kalysto.org/utilities/dd_rhelp/index.en.html dd_rhelp], которые работают вместе, [http://seed7.sourceforge.net/scrshots/savehd7.htm savehd7] и [http://www.gnu.org/software/ddrescue/ddrescue.html GNU ddrescue].
 
Antonio Diaz Diaz (разработчик GNU ddrescue) сравнивает варианты dd для задач восстановления:
 
<blockquote>
Стандартная утилита '''dd''' осуществляет линейное чтение диска, и это может занять много времени или даже сжечь накопитель без восстановления чего-либо, если ошибки расположены в начале жесткого диска.
 
'''dd_rescue''' делает то же самое, что и dd, только более эффективно.
 
'''dd_rhelp''' — это сложный shell-скрипт, который запускает dd_rescue много раз, стараясь стратегически копировать накопитель, но это очень неэффективно.
</blockquote>
 
* dd_rhelp сначала извлекает все доступные к чтению данные и сохраняет их в файл, вставляя нули вместо байтов, которые не смог прочесть. Потом утилита пытается повторно прочитать некорректные данные и обновить этот файл.
* GNU dd_rescue может быть использована для копирования данных прямо на новый диск по необходимости, как и dd.