stringtranslate.com

дд (Unix)

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.

По сравнению с приведенным выше примером модификации данных, опция преобразования 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_rescuedd_rhelpddrescueaddrescuegddrescuegnu_ddrescue

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

Сравнительный анализ производительности привода

Чтобы провести бенчмарк-тест диска и проанализировать производительность последовательного (и обычно однопоточного) чтения и записи системы для блоков размером 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

dcfldd — это ответвление GNU dd , расширенная версия, разработанная Ником Харбором, который в то время работал в лаборатории компьютерной криминалистики Министерства обороны США . [25] [26] [27] По сравнению с dd , dcfldd позволяет использовать более одного выходного файла, поддерживает одновременные вычисления нескольких контрольных сумм, обеспечивает режим проверки соответствия файлов и может отображать процент выполнения операции. По состоянию на февраль 2024 г. последней версией была версия 1.9.1 от апреля 2023 г. [28]

dc3dd

dc3dd — это еще один ответвление GNU dd от Центра киберпреступности Министерства обороны США(DC3). Его можно рассматривать как продолжение dcfldd с заявленной целью обновления при каждом обновлении исходной версии GNU. По состоянию на июнь 2023 годапоследним релизом была версия 7.3.1 от апреля 2023 года. [29]

Смотрите также

Рекомендации

  1. ^ Остин Групп. «Стандарт POSIX: вызов dd». Архивировано из оригинала 10 марта 2010 г. Проверено 29 сентября 2016 г.
  2. ^ Шахматная фигура, Сэм. «Как и когда использовать команду dd?». КодКофе. Архивировано из оригинала 14 февраля 2008 года . Проверено 19 февраля 2008 г.
  3. Ричи, Деннис (17 февраля 2004 г.). «Re: происхождение команды UNIX dd». Группа новостей : alt.folklore.computers. Usenet:  [email protected]. Архивировано из оригинала 22 января 2011 года . Проверено 10 января 2016 г. dd всегда назывался в честь карт JCL dd.
  4. ^ Аб Рэймонд, Эрик С. «дд». Архивировано из оригинала 13 декабря 2018 г. Проверено 19 февраля 2008 г.
  5. ^ Страбл, Джордж (1969). Программирование на языке ассемблера: IBM System/360. Ридинг, Массачусетс, паб Addison-Wesley. Компания р. 123.
  6. Шейн, Барри (22 апреля 1990 г.). «Re: этимология команды Unix «dd»». Группа новостей : alt.folklore.computers. Usenet:  [email protected]. Архивировано из оригинала 24 октября 2023 г. Проверено 14 июля 2016 г.
  7. ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
  8. ^ abcdef dd - Справочник по оболочке и утилитам, Единая спецификация UNIX , версия 4 от The Open Group
  9. ^ «Файловые утилиты GNU, версия 1.0» . groups.google.com . Архивировано из оригинала 28 апреля 2023 г. Проверено 28 апреля 2023 г.
  10. ^ ab dd(1) -  Руководство пользователя Linux - Пользовательские команды
  11. ^ "Кто GNU" . Архивировано из оригинала 28 апреля 2023 г. Проверено 28 апреля 2023 г.
  12. ^ dd(1)  -  Руководство программиста Plan 9 , том 1
  13. ^ «Собственные порты Win32 некоторых утилит GNU» . 15 августа 2000 г. Архивировано из оригинала 15 августа 2000 г.
  14. ^ «Собственные порты Win32 некоторых утилит GNU» . unxutils.sourceforge.net . Архивировано из оригинала 9 февраля 2006 г. Проверено 23 февраля 2022 г.
  15. ^ «Как использовать dd в Linux, не разрушая диск». Opensource.com . 05.07.2018. Архивировано из оригинала 11 октября 2020 г. Проверено 11 октября 2020 г.
  16. ^ dd(1)  -  Руководство по общим командам FreeBSD.
  17. ^ аб Жиль (2011). «Клонирование — ДД против кота — ДД все еще актуален в наши дни?». Обмен стеками Unix и Linux . Архивировано из оригинала 24 октября 2023 г. Проверено 24 апреля 2020 г.
  18. ^ «Создание ISO-образа с компакт-диска, DVD или BD». АрчВики . Архивировано из оригинала 18 апреля 2022 года . Проверено 18 апреля 2022 г.
  19. ^ «Linux — Зачем использовать conv=notrunc при клонировании диска с помощью dd?». Переполнение стека. 11 декабря 2013 г. Архивировано из оригинала 24 марта 2014 г. Проверено 24 марта 2014 г.
  20. ^ Райт, Крейг С.; Клейман, Дэйв; С., Шьяам Сундхар Р. (2008). «Перезапись данных на жестком диске: большой спор об удалении». Ин Секар, Р.; Пуджари, Арун К. (ред.). Безопасность информационных систем, 4-я Международная конференция ICISS 2008, Хайдарабад, Индия, 16-20 декабря 2008 г. Материалы . Конспекты лекций по информатике. Том. 5352. Спрингер. стр. 243–257. дои : 10.1007/978-3-540-89862-7_21.
  21. ^ "dd_rescue". garloff.de . Архивировано из оригинала 16 мая 2001 г. Проверено 10 ноября 2006 г.
  22. LAB Валентин (19 сентября 2011 г.). «Авторский репозиторий dd_rhelp». Архивировано из оригинала 16 мая 2008 года . Проверено 13 мая 2008 г. Важное примечание: какое-то время dd_rhelp был единственным инструментом (AFAIK), который выполнял такую ​​работу, но через несколько лет это уже не так: Антонио Диас написал идеальную замену моему инструменту: GNU 'ddrescue'.
  23. ^ «Ddrescue - Проект GNU - Фонд свободного программного обеспечения (FSF)» . gnu.org . Архивировано из оригинала 2 июля 2021 г. Проверено 22 июля 2016 г.
  24. ^ «GNU Coreutils: вызов dd» . Операционная система GNU и движение за свободное программное обеспечение . Архивировано из оригинала 22 августа 2019 г. Проверено 26 августа 2019 г.
  25. ^ "DCFLDD в Source Forge" . Исходная кузница. Архивировано из оригинала 2 августа 2013 г. Проверено 17 августа 2013 г.
  26. ^ Джереми Фэйрклот, Крис Херли (2007). Набор инструментов с открытым исходным кодом для тестера на проникновение . Сингресс. стр. 470–472. ISBN 9780080556079.
  27. ^ Джек Уайлс, Энтони Рейес (2011). Лучшая книга периода о киберпреступности и цифровой криминалистике . Сингресс. стр. 408–411. ISBN 9780080556086.
  28. ^ «dcfldd: Расширенная версия dd для криминалистики и безопасности» . Гитхаб. Архивировано из оригинала 31 октября 2020 г. Проверено 19 ноября 2020 г.
  29. ^ "dc3dd". СоурсФордж . 25 апреля 2023 г. Архивировано из оригинала 25 февраля 2020 г. Проверено 24 апреля 2020 г.

Внешние ссылки