Оригинальный автор(ы) | Кен Томпсон ( AT&T Bell Laboratories ) |
---|---|
Разработчик(и) | Различные разработчики открытого и коммерческого ПО |
Первоначальный выпуск | Июнь 1974 г ( 1974-06 ) |
Репозиторий | coreutils: git.savannah.gnu.org/cgit/coreutils.git/ |
Написано в | План 9: С |
Операционная система | Unix , Unix-подобный , Plan 9 , Inferno , Windows |
Платформа | Кроссплатформенный |
Тип | Команда |
Лицензия | coreutils : GPLv3+, план 9: лицензия MIT |
dd — это утилита командной строки для Unix , Plan 9 , Inferno и Unix-подобных операционных систем и выше, основной целью которой является преобразование и копирование файлов. [1] В Unix драйверы устройств для оборудования (например, жесткие диски ) и специальные файлы устройств (например, /dev/zero и /dev/random ) появляются в файловой системе так же, как и обычные файлы; dd также может читать и/или записывать данные из этих файлов, при условии, что эта функция реализована в соответствующем драйвере. В результате dd можно использовать для таких задач, как резервное копирование загрузочного сектора жесткого диска и получение фиксированного объема случайных данных. Программа dd также может выполнять преобразования данных по мере их копирования, включая замену порядка байтов и преобразование в текстовые кодировки ASCII и EBCDIC и обратно . [2]
В 1974 году команда dd появилась как часть версии 5 Unix . По словам Денниса Ритчи , название является намеком на оператор DD, найденный в языке управления заданиями IBM (JCL), [3] [4] , в котором это сокращение от «определения данных». [5] [6] По словам Дугласа Макилроя , dd была «изначально предназначена для преобразования файлов между ASCII , little-endian, байтовым потоком компьютеров DEC и EBCDIC , big-endian, блочным миром IBM »; таким образом, объясняя культурный контекст ее синтаксиса. [7] Эрик С. Рэймонд считает, что «дизайн интерфейса был явно шуткой», из-за того, что синтаксис команды больше похож на оператор JCL, чем на другие команды Unix. [4]
В 1987 году команда dd была определена в выпуске 2 руководства по переносимости X/Open за 1987 год. Она унаследована стандартом IEEE Std 1003.1-2008 ( POSIX ), который является частью единой спецификации UNIX . [8]
В 1990 году Дэвид Маккензи анонсировал GNU fileutils (теперь часть coreutils ), которая включает в себя dd
команду; [9] она была написана Полом Рубином, Дэвидом Маккензи и Стюартом Кемпом. [10] С 1991 года Джим Мейеринг является ее сопровождающим. [11]
В 1995 году было выпущено второе издание Plan 9 ; его интерфейс команды dd был переработан для использования традиционного стиля параметров командной строки вместо стиля операторов JCL. [12]
По крайней мере с 1999 года [13] существует собственный порт Win32 для Microsoft Windows под названием UnxUtils . [ 14]
dd
иногда в шутку называют «Уничтожителем дисков» из-за его возможностей стирания данных с диска, включая опечатки. [15]
Синтаксис командной строки dd отличается от многих других программ Unix. Он использует синтаксис для своих параметров командной строки, а не более стандартные форматы или . По умолчанию dd читает из stdin и пишет в stdout , но это можно изменить с помощью параметров 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] : ОПЕРАНДЫ Реализации различаются по дополнительным суффиксам, которые они поддерживают: (Free) BSD использует строчные буквы m ( мебибайты ), g ( гибибайты ) и т. д. для тебибайтов , эксбибайтов , пебибайтов , зебибайтов и йобибайтов , [16] в то время как GNU использует M и G для тех же единиц, а кБ , МБ и ГБ используются для их аналогов в системе СИ ( килобайты ). [10] Например, для GNU dd bs =16M указывает размер блока 16 мебибайт (16777216 байт), а bs=3kB указывает 3000 байт.
Кроме того, некоторые реализации понимают символ x как оператор умножения для параметров размера блока и количества. Например, bs=2x80x18b интерпретируется как 2 × 80 × 18 × 512 =1 474 560 байт , точный размер дискеты объемом 1440 КиБ . Это требуется в POSIX. [8] : ОПЕРАНДЫ Для реализаций, которые не поддерживают эту функцию, может использоваться арифметический синтаксис оболочки POSIX .bs=$((2*80*18))b
Размер блока влияет на производительность копирования команд dd . Выполнение большого количества небольших чтений или записей часто происходит медленнее, чем выполнение меньшего количества крупных. Использование больших блоков требует больше оперативной памяти и может усложнить восстановление после ошибок. Когда dd используется с устройствами с переменным размером блока, такими как ленточные накопители или сети, размер блока может определять размер записи на ленту или размер пакета в зависимости от используемого сетевого протокола .
Команда dd может использоваться для различных целей. Для простых команд копирования она, как правило, медленнее, чем доменно-специфичные альтернативы, но она выделяется своей уникальной способностью «перезаписывать или обрезать файл в любой точке или искать в файле», довольно низкоуровневый интерфейс к файловому API Unix. [17]
Примеры ниже предполагают использование GNU dd, в основном в аргументе размера блока. Чтобы сделать их переносимыми, замените eg bs=64M
на арифметическое выражение оболочки или (записанное эквивалентно с битовым сдвигом ).bs=$((64*1024*1024))
bs=$((64 << 20))
dd может дублировать данные по файлам, устройствам, разделам и томам. Данные могут быть входными или выходными для любого из них; но есть важные различия относительно выходных данных при переходе на раздел. Кроме того, во время передачи данные могут быть изменены с помощью параметров conv в соответствии с носителем. (Однако для этой цели dd медленнее, чем cat .) [17]
| Создает образ диска ISO с CD-ROM , DVD или Blu-ray диска. [18] |
dd if=system.img of= /dev/sdc bs=64M conv=noerror | Восстанавливает жесткий диск (или, например, SD-карту) из ранее созданного образа. |
dd if=/dev/sdb2 of=partition.image bs=64M conv=noerror | Создайте образ раздела sdb2, используя размер блока 64 МБ. |
dd если=/dev/sda2 из=/dev/sdb2 bs=64M conv=noerror | Клонирует один раздел в другой. |
dd if=/dev/ad0 of=/dev/ad1 bs=64M conv=noerror | Клонирует жесткий диск «ad0» в «ad1». |
Параметр noerror означает продолжение работы в случае возникновения ошибки, а параметр sync приводит к заполнению выходных блоков.
dd может изменять данные на месте. Например, это перезаписывает первые 512 байт файла нулевыми байтами:
dd if= /dev/zero of=путь/к/файлу 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] Однако с другими типами дисков, такими как флэш-память, многие данные все еще могут быть восстановлены с помощью остаточной намагниченности данных .
Современные жесткие диски содержат команду Secure Erase, предназначенную для постоянного и безопасного стирания всех доступных и недоступных частей диска. Она также может работать для некоторых твердотельных накопителей (флэш-накопителей). По состоянию на 2017 год она не работает на USB-флэш-накопителях и флэш-памяти Secure Digital . [ требуется цитата ] Когда она доступна, она и быстрее, чем использование dd, и более безопасна. [ требуется цитата ] На компьютерах Linux она доступна через опцию --security-erase-enhanced команды hdparm .
Программа уничтожения предлагает возможность многократной перезаписи, а также более безопасного удаления отдельных файлов.
Восстановление данных включает чтение с диска, некоторые части которого потенциально недоступны. dd
хорошо подходит для этой работы благодаря гибкому пропуску ( seek
) и другим низкоуровневым настройкам. 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=имя_файла из=имя_файла1 conv=ucase,notrunc
Будучи программой, в основном разработанной как фильтр, dd обычно не предоставляет никаких индикаторов прогресса. Это можно обойти, отправив сигнал USR1 запущенному процессу GNU dd ( INFO в системах BSD), в результате чего dd распечатает текущее количество переданных блоков.
Следующий однострочный код обеспечивает непрерывный вывод прогресса каждые 10 секунд до завершения передачи, когда dd-pid заменяется на идентификатор процесса dd :
while kill -USR1
dd-пид; 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 upstream. По состоянию на июнь 2023 годапоследним релизом был 7.3.1 от апреля 2023 года. [29][обновлять]
dd всегда назывался в честь карт JCL dd.
Важное примечание: некоторое время dd_rhelp был единственным инструментом (AFAIK), который выполнял такую работу, но несколько лет спустя это уже не так: Антонио Диас написал идеальную замену для моего инструмента: GNU 'ddrescue'.