dd — это утилита командной строки для Unix , Plan 9 , Inferno и Unix-подобных операционных систем и более поздних версий, основной целью которой является преобразование и копирование файлов. [1] В Unix драйверы устройств для оборудования (например, жестких дисков ) и специальные файлы устройств (например, /dev/zero и /dev/random ) появляются в файловой системе так же, как обычные файлы; dd также может читать и/или записывать в/из этих файлов, при условии, что эта функция реализована в соответствующем драйвере. В результате dd можно использовать для таких задач, как резервное копирование загрузочного сектора жесткого диска и получение фиксированного объема случайных данных. Программа dd также может выполнять преобразования данных по мере их копирования, включая изменение порядка байтов и преобразование в текстовые кодировки ASCII и EBCDIC и обратно . [2]
В 1974 году команда dd появилась как часть версии 5 Unix . По словам Денниса Ритчи , это название является намеком на оператор DD , найденный в языке IBM Job Control Language (JCL), [3] [4] , в котором оно является аббревиатурой от «Определение данных». [5] [6] По словам Дугласа Макилроя , dd «изначально предназначался для преобразования файлов между ASCII , миром байтовых потоков с прямым порядком байтов компьютеров DEC , и EBCDIC , блокированным миром с прямым порядком байтов IBM »; таким образом, объясняя культурный контекст его синтаксиса. [7] Эрик С. Рэймонд считает, что «дизайн интерфейса был явно шуткой», поскольку синтаксис команды больше напоминает оператор JCL, чем другие команды Unix. [4]
В 1987 году команда dd указана в выпуске 2 X/Open Portability Guide от 1987 года. Она унаследована стандартом IEEE Std 1003.1-2008 ( POSIX ), который является частью Единой спецификации UNIX . [8]
В 1990 году Дэвид Маккензи анонсирует GNU fileutils (теперь часть coreutils ), который включает dd
команду; [9] его написали Пол Рубин, Дэвид Маккензи и Стюарт Кемп. [10] С 1991 года его сопровождающим является Джим Мейеринг. [11]
В 1995 году выпущено 2-е издание Plan 9 ; его командный интерфейс dd переработан и теперь использует традиционный стиль параметров командной строки вместо стиля операторов JCL. [12]
По крайней мере, с 1999 года [13] существует UnxUtils , собственный порт Win32 для Microsoft Windows с использованием GNU fileutils. [14]
dd
иногда с юмором называют «Уничтожителем дисков» из-за его способности стирать данные с диска, включая опечатки. [15]
Синтаксис командной строки dd отличается от многих других программ Unix. Он использует синтаксис параметров командной строки, а не более стандартные форматы . По умолчанию dd читает со стандартного ввода и записывает на стандартный вывод , но это можно изменить с помощью параметров if (входной файл) и of (выходной файл). [8]option=value
-option value
--option=value
Некоторые функции dd будут зависеть от возможностей компьютерной системы, например, от способности dd реализовать опцию прямого доступа к памяти. Отправка сигнала SIGINFO (или сигнала USR1 в Linux) работающему процессу dd заставляет его один раз распечатать статистику ввода-вывода для стандартной ошибки , а затем продолжить копирование. dd может читать стандартный ввод с клавиатуры. Когда будет достигнут конец файла (EOF), dd завершит работу. Сигналы и EOF определяются программным обеспечением. Например, инструменты Unix, перенесенные в Windows , различаются по EOF: Cygwin использует + (обычный EOF Unix), а MKS Toolkit использует + (обычный EOF Windows).CtrlDCtrlZ
Нестандартизированные части вызова dd различаются в зависимости от реализации.
По завершении dd выводит в поток stderr статистику передачи данных. Формат стандартизирован в POSIX. [8] : STDERR На странице руководства GNU dd этот формат не описан, но в руководствах BSD он описан.
Каждая из строк «Входящие записи» и «Выходящие записи» показывает количество переданных полных блоков + количество частичных блоков, например, потому, что физический носитель закончился до того, как был прочитан полный блок, или из-за физической ошибки, не позволившей прочитать полный блок.
Блок — это единица измерения количества байтов , которые читаются, записываются или преобразуются за один раз. Параметры командной строки могут указывать другой размер блока для ввода/чтения ( ibs ) по сравнению с размером блока вывода/записи ( obs ), хотя параметр размера блока ( bs ) переопределяет как ibs , так и obs . Значение по умолчанию для размеров входного и выходного блока составляет 512 байт (традиционный размер блока дисков и размер «блока», установленный POSIX). Опция подсчета при копировании измеряется в блоках, как и счетчик пропуска при чтении и счетчик поиска при записи. На операции преобразования также влияет «размер блока преобразования» ( cbs ). [8] : ОПЕРАНДЫ
Значение, указанное для параметров размера блока, интерпретируется как десятичное (по основанию 10) целое число байтов. Он также может содержать суффиксы, указывающие, что размер блока представляет собой целое число единиц, превышающих байты. POSIX определяет только суффиксы b (блоки) для 512 и k ( кибибайты ) для 1024. [8] : ОПЕРАНДЫ Реализация различается по дополнительным суффиксам, которые они поддерживают: (бесплатно) BSD использует строчные буквы m ( мебибайты ), g ( гибибайты ) и и так далее для тебибайтов , эксбибайтов , пебибайтов , зебибайтов и йобибайтов , [16] в то время как GNU использует M и G для тех же единиц, а kB , MB и GB используются для их аналогов единиц SI ( килобайтов ). [10] Например, для GNU dd bs =16M указывает размер блока 16 мегабайт (16777216 байт), а bs=3kB указывает 3000 байт.
Кроме того, некоторые реализации понимают символ x как оператор умножения как для размера блока, так и для параметров количества. Например, bs=2x80x18b интерпретируется как 2 × 80 × 18 × 512 =1 474 560 байт , точный размер дискеты емкостью 1 440 КиБ . Это требуется в POSIX. [8] : ОПЕРАНДЫ Для реализаций, которые не поддерживают эту функцию, может использоваться арифметический синтаксис оболочки POSIX .bs=$((2*80*18))b
Размер блока влияет на производительность копирования команд dd . Выполнение большого количества небольших операций чтения или записи часто выполняется медленнее, чем выполнение меньшего количества крупных операций. Использование больших блоков требует больше оперативной памяти и может затруднить восстановление ошибок. Когда dd используется с устройствами с переменным размером блока, такими как ленточные накопители или сети, размер блока может определять размер записи на ленте или размер пакета , в зависимости от используемого сетевого протокола .
Команда dd может использоваться для различных целей. Для команд простого копирования он, как правило, медленнее, чем альтернативы, специфичные для предметной области, но он выделяется своей уникальной способностью «перезаписывать или усекать файл в любой точке или искать в файле», довольно низкоуровневый интерфейс для Unix. файловый API. [17]
В приведенных ниже примерах предполагается использование GNU dd, в основном в аргументе размера блока. Чтобы сделать их переносимыми, замените, например, bs=64M
арифметическим выражением оболочки или (написанным эквивалентно с битовым сдвигом ).bs=$((64*1024*1024))
bs=$((64 << 20))
dd может дублировать данные в файлах, устройствах, разделах и томах. Данные могут вводиться или выводиться в любой из них; но есть важные различия, касающиеся вывода при переходе к разделу. Кроме того, во время передачи данные можно изменить с помощью параметров преобразования в соответствии с средой передачи. (Однако для этой цели dd работает медленнее, чем cat .) [17]
Опция noerror означает продолжение работы в случае ошибки, а опция sync вызывает заполнение выходных блоков.
dd может изменять данные на месте. Например, это перезаписывает первые 512 байт файла нулевыми байтами:
dd if= /dev/zero of=path/to/file bs=512 count=1 conv=notrunc
Опция преобразования notrunc означает, что выходной файл не усекается — то есть, если выходной файл уже существует, просто замените указанные байты и оставьте остальную часть выходного файла в покое. Без этой опции dd создал бы выходной файл длиной 512 байт.
Приведенный выше пример также можно использовать для резервного копирования и восстановления любой области устройства в файл, например основную загрузочную запись .
Чтобы дублировать первые два сектора дискеты:
dd if=/dev/fd0 of=MBRboot .img bs=512 count=2
По соображениям безопасности иногда необходимо выполнить очистку диска выброшенного устройства. Этого можно добиться путем «переноса данных» из специальных файлов Unix.
dd if=/dev/zero of=/dev/sda bs=16M
dd if=/dev/urandom of=/dev/sda bs=16M
По сравнению с приведенным выше примером модификации данных, опция преобразования notrunc не требуется, поскольку она не оказывает никакого эффекта, если выходной файл dd является блочным устройством. [19]
Опция bs=16M позволяет dd читать и записывать по 16 мегабайт за раз. Для современных систем даже больший размер блока может быть быстрее. Обратите внимание, что заполнение диска случайными данными может занять больше времени, чем обнуление диска, поскольку случайные данные должны создаваться процессором, а создание нулей происходит очень быстро. На современных жестких дисках обнуление диска приведет к тому, что большую часть содержащихся на нем данных невозможно будет восстановить. [20] Однако при использовании других типов накопителей, таких как флэш-память, большую часть данных все же можно восстановить за счет остаточной намагниченности данных .
Современные жесткие диски содержат команду безопасного стирания , предназначенную для окончательного и безопасного стирания всех доступных и недоступных частей диска. Это также может работать для некоторых твердотельных накопителей (флэш-накопителей). По состоянию на 2017 год он не работает ни на USB-накопителях, ни на флэш-памяти Secure Digital . [ нужна цитация ] Если это возможно, это быстрее, чем использование dd, и более безопасно. [ нужна цитация ] На машинах Linux он доступен через параметр --security-erase-enhanced команды hdparm .
Программа уничтожения предлагает несколько перезаписей, а также более безопасное удаление отдельных файлов.
Восстановление данных предполагает чтение с диска, некоторые части которого потенциально недоступны. dd
хорошо подходит для этой задачи благодаря гибкому пропуску ( seek
) и другим низкоуровневым настройкам. Однако vanilla dd
использовать неуклюже, поскольку пользователю приходится читать сообщения об ошибках и вручную рассчитывать области, которые можно прочитать. Размер одного блока также ограничивает степень детализации восстановления, поскольку приходится идти на компромисс: либо использовать маленький блок для восстановления большего количества данных, либо использовать большой блок для увеличения скорости.
Программа AC под названием dd_rescue
[21] была написана в октябре 1999 года. Она отказалась от функции преобразования dd
и поддерживает два размера блоков для решения этой дилеммы. Если чтение с использованием большого размера завершается неудачно, оно возвращается к меньшему размеру, чтобы собрать как можно больше данных. Он также может бежать назад. В 2003 году dd_rhelp
был написан скрипт для автоматизации процесса использования dd_rescue
, отслеживающий, какие области были прочитаны самостоятельно. [22]
В 2004 году GNU написала отдельную утилиту, не связанную dd
с ddrescue . Он имеет более сложный алгоритм динамического размера блока и отслеживает то, что было прочитано внутри. Авторы того и другого считают их реализацию превосходной. [23] Чтобы отличить новую программу GNU от старого сценария, для GNU иногда используются альтернативные имена , в том числе (имя на freecode.com и Freshmeat.net), ( имя пакета Debian ) и ( имя пакета openSUSE ).dd_rescue
dd_rhelp
ddrescue
addrescue
gddrescue
gnu_ddrescue
Другая программа с открытым исходным кодом под названием savehd7
использует сложный алгоритм, но также требует установки собственного интерпретатора языка программирования .
Чтобы провести бенчмарк-тест диска и проанализировать производительность последовательного (и обычно однопоточного) чтения и записи системы для блоков размером 1024 байта:
dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
dd if=1GB_file_to_read of=/dev/null bs=1024
Чтобы создать файл из 100 случайных байтов с помощью драйвера случайных чисел ядра:
dd if= /dev/urandom of=myrandom bs=100 count=1
Чтобы преобразовать файл в верхний регистр:
dd if=имя_файла of=имя_файла1 conv=ucase,notrunc
Будучи программой, созданной в основном как фильтр, dd обычно не отображает никакой индикации хода выполнения. Это можно преодолеть, отправив сигнал USR1 работающему процессу GNU dd ( INFO в системах BSD), в результате чего dd печатает текущее количество переданных блоков.
Следующая однострочная строка приводит к непрерывному выводу прогресса каждые 10 секунд до завершения передачи, когда dd-pid заменяется идентификатором процесса dd :
while kill -USR1
dd-pid; do sleep 10 ; done
Более новые версии GNU dd поддерживают опцию status=progress , которая включает периодическую печать статистики передачи в stderr. [24]
dcfldd — это ответвление GNU dd , расширенная версия, разработанная Ником Харбором, который в то время работал в лаборатории компьютерной криминалистики Министерства обороны США . [25] [26] [27] По сравнению с dd , dcfldd позволяет использовать более одного выходного файла, поддерживает одновременные вычисления нескольких контрольных сумм, обеспечивает режим проверки соответствия файлов и может отображать процент выполнения операции. По состоянию на февраль 2024 г. последней версией была версия 1.9.1 от апреля 2023 г. [28]
dc3dd — это еще один ответвление GNU dd от Центра киберпреступности Министерства обороны США(DC3). Его можно рассматривать как продолжение dcfldd с заявленной целью обновления при каждом обновлении исходной версии GNU. По состоянию на июнь 2023 годапоследним релизом была версия 7.3.1 от апреля 2023 года. [29][обновлять]
dd всегда назывался в честь карт JCL dd.
Важное примечание: какое-то время dd_rhelp был единственным инструментом (AFAIK), который выполнял такую работу, но через несколько лет это уже не так: Антонио Диас написал идеальную замену моему инструменту: GNU 'ddrescue'.