dd - это утилита командной строки для Unix и Unix-подобных операционных систем , основная цель которой - конвертировать и копировать файлы. [1]
Автор (ы) оригинала | Кен Томпсон ( AT&T Bell Laboratories ) |
---|---|
Разработчики) | Различные разработчики с открытым исходным кодом и коммерческие разработчики |
Первый выпуск | Июнь 1974 г . |
Репозиторий | git |
Операционная система | Unix , Unix-подобный , Plan 9 , Inferno |
Платформа | Кроссплатформенность |
Тип | Командование |
Лицензия | coreutils : GPLv3 + |
В Unix драйверы устройств для оборудования (например, жестких дисков ) и файлы специальных устройств (например, / dev / zero и / dev / random ) появляются в файловой системе, как обычные файлы; dd также может читать и / или записывать из / в эти файлы, при условии, что функция реализована в их соответствующем драйвере. В результате dd можно использовать для таких задач, как резервное копирование загрузочного сектора жесткого диска и получение фиксированного количества случайных данных. Программа dd также может выполнять преобразование данных по мере их копирования, включая замену порядка байтов и преобразование в текстовые кодировки ASCII и EBCDIC и обратно . [2]
История
Название дд это намек на заявление DD найден в IBM «s Работа Control Language (JCL), [3] [4] , в которой это аббревиатура для„Определения данных“. [5] Синтаксис команды больше похож на оператор JCL, чем на другие команды Unix, настолько, что Эрик С. Реймонд говорит, что «дизайн интерфейса был явно шуткой». [3] Интерфейс переработан в команде dd Plan 9 для использования стиля параметров командной строки. [6] dd
иногда с юмором называют «Disk Destroyer» из-за его способности стирать диск. [7]
Первоначально предназначался для преобразования между ASCII и EBCDIC , dd впервые появился в Unix версии 5 . [8]Команда dd указана с момента выпуска 2 руководства по переносимости X / Open от 1987 года. Она унаследована стандартом IEEE Std 1003.1-2008 ( POSIX ), который является частью единой спецификации UNIX . [9]
Версия, dd
входящая в состав GNU coreutils, была написана Полом Рубином, Дэвидом Маккензи и Стюартом Кемпом. [10]
Применение
Командная строка Синтаксис dd отличается от многих других программ Unix. Он использует синтаксис option = value для его параметров командной строки, а не более стандартного - стоимость опциона или - option = форматы значений . По умолчанию, dd читает из stdin и записывает в stdout , но это можно изменить с помощью если (входной файл) и параметров (выходной файл). [9]
Некоторые особенности dd будет зависеть от возможностей компьютерной системы, таких как dd может реализовать возможность прямого доступа к памяти. Отправка сигнала SIGINFO (или сигнала USR1 в Linux) на работающий Процесс dd заставляет его один раз распечатать статистику ввода-вывода до стандартной ошибки, а затем продолжить копирование. dd может читать стандартный ввод с клавиатуры. Когда достигается конец файла (EOF), dd выйдет. Сигналы и EOF определяются программным обеспечением. Например, инструменты Unix, перенесенные в Windows, различаются по EOF: Cygwin использует Ctrl+ D(обычный EOF для Unix), а MKS Toolkit использует Ctrl+ Z(обычный EOF для Windows).
Нестандартизированные части вызова dd различаются в зависимости от реализации.
Выходные сообщения
По окончании, dd выводит в поток stderr статистику передачи данных. Формат стандартизирован в POSIX. [9] ( STDERR ) Справочная страница для GNU dd не описывает этот формат, но руководства BSD описывают его.
Каждая из строк «Входящие записи» и «Выходные записи» показывают количество переданных полных блоков + количество частичных блоков, например, потому что физический носитель закончился до того, как был прочитан полный блок, или физическая ошибка помешала чтению всего блока.
Размер блока
Блок является единицей измерения количества байтов , которые считываются, написанные или преобразованы в одно время. Параметры командной строки могут указывать другой размер блока для ввода / чтения ( ibs ) по сравнению с выводом / записью ( obs ), хотя размер блока ( bs ) опция переопределит оба ibs и набл . Значение по умолчанию для размеров входных и выходных блоков составляет 512 байт (традиционный размер блока дисков и размер блока, требуемый POSIX). В счетчик для копирования измеряется в блоках, как и пропустить счет для чтения и счетчик поиска для записи. На операции преобразования также влияет «размер блока преобразования» ( cbs ). [9] ( ОПЕРАНДЫ )
Значение, указанное для параметров размера блока, интерпретируется как десятичное (с основанием 10) целое число байтов. Он также может содержать суффиксы, указывающие, что размер блока представляет собой целое число единиц, превышающих количество байтов. POSIX определяет только суффиксы b (блоки) для 512 и k ( kibibytes ) для 1024. [9] ( ОПЕРАНДЫ ) Реализация различается дополнительными суффиксами, которые они поддерживают: (Free) BSD использует строчные буквы м ( мебибайт ), g ( гибибайты ) и так далее для тебибайтов , эксбибайтов , пебибайтов , зебибайтов и йобибайтов , [11] в то время как GNU использует М и G для тех же агрегатов, с кБ , МБ и ГБ используется для их эквивалентов в единицах СИ ( килобайты ). [10] Например, для GNU дд , bs = 16M указывает размер блока 16 мебибайт (16777216 байт) и bs = 3kB определяет 3000 байт.
Кроме того, некоторые реализации понимают x в качестве оператора умножения как для размера блока, так и для параметров подсчета. Например, bs = 2x80x18b интерпретируется как 2 × 80 × 18 × 512 =1 474 560 байт , точный размер дискеты 1440 КБ . Это требуется в POSIX, но GNU, похоже, его не поддерживает. [9] ( ОПЕРАНДЫ ) В результате стало удобнее использовать арифметический синтаксис оболочки POSIX .bs=$((2*80*18))b
Размер блока влияет на производительность копирования dd команды. Выполнение большого количества небольших операций чтения или записи часто происходит медленнее, чем выполнение меньшего количества крупных операций. Использование больших блоков требует больше оперативной памяти и может усложнить восстановление после ошибок. Когда dd используется с устройствами с переменным размером блока, такими как ленточные накопители или сети, размер блока может определять размер записи на ленту или размер пакета в зависимости от используемого сетевого протокола .
Использует
В Команда dd может использоваться для различных целей. Для команд простого копирования он, как правило, медленнее, чем альтернативы для конкретного домена, но он выделяется своей уникальной способностью «перезаписывать или обрезать файл в любой точке или искать в файле», довольно низкоуровневый интерфейс для Unix. файловый API. [12]
В приведенных ниже примерах предполагается использование GNU dd, в основном в аргументе размера блока. Чтобы сделать их переносимыми, замените, например, bs=64M
арифметическим выражением оболочки bs=$((64*1024*1024))
или bs=$((64 << 20))
(написанным эквивалентно с битовым сдвигом ).
Обмен данными
dd может дублировать данные в файлах, устройствах, разделах и томах. Данные могут вводиться или выводиться в любой из них; но есть важные различия, касающиеся вывода при переходе в раздел. Также во время передачи данные могут быть изменены с помощью параметры conv в соответствии со средой. (Однако для этого dd медленнее, чем кат .) [12]
блоки = $ (isosize -d 2048 / dev / sr0) | Создает образ ISO- диска с CD-ROM , DVD или Blu-ray . [13] |
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 MiB. |
dd if = / dev / sda2 of = / 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 = 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 - это блочное устройство. [14]
В Параметр bs = 16M заставляет dd читать и писать по 16 мебибайт за раз. Для современных систем даже больший размер блока может быть быстрее. Обратите внимание, что заполнение диска случайными данными может занять больше времени, чем обнуление диска, потому что случайные данные должны создаваться процессором, а создание нулей происходит очень быстро. На современных жестких дисках обнуление диска сделает большую часть содержащихся на нем данных безвозвратной. [15] Однако с другими типами накопителей, такими как флэш-память, большая часть данных все еще может быть восстановлена за счет остаточных данных .
Современные жесткие диски содержат команду Secure Erase, предназначенную для постоянного и безопасного удаления всех доступных и недоступных частей диска. Это также может работать с некоторыми твердотельными накопителями (флешками). По состоянию на 2017 год он не работает ни на USB-накопителях, ни на флеш-памяти Secure Digital . [ Требуется цитата ] Когда доступно, это и быстрее, чем при использовании dd, и более безопасно. [ Править ] На Linux машины она доступна через HDPARM Командования Опция --security-erase-Enhanced .
Программа уничтожения предлагает несколько операций перезаписи, а также более безопасное удаление отдельных файлов.
Восстановление данных
Восстановление данных включает чтение с диска, некоторые части которого потенциально недоступны. dd хорошо подходит для этой работы благодаря гибкому пропуску ( seek ) и другие низкоуровневые настройки. Ваниль dd , однако, неудобно использовать, поскольку пользователь должен читать сообщения об ошибках и вручную вычислять области, которые могут быть прочитаны. Размер единичного блока также ограничивает степень детализации восстановления, поскольку приходится идти на компромисс: либо используйте маленький для большего количества восстановленных данных, либо используйте большой для скорости.
Программа переменного тока называется dd_rescue [16] был написан в октябре 1999 года. Он устранил функциональность преобразования dd и поддерживает два размера блоков для решения этой дилеммы. Если чтение с использованием большого размера не удается, оно возвращается к меньшему размеру, чтобы собрать как можно больше данных. Он также может бегать задом наперед. В 2003 г. Скрипт dd_rhelp был написан для автоматизации процесса использования dd_rescue , отслеживая, какие области были прочитаны самостоятельно. [17]
В 2004 году GNU написала отдельную утилиту, не имеющую отношения к дд , называется ddrescue . Он имеет более сложный алгоритм динамического размера блока и отслеживает то, что было прочитано внутри. Авторы обоих dd_rescue и dd_rhelp считает, что это лучше их реализации. [18] Чтобы отличить новую программу GNU от старого скрипта, иногда используются альтернативные имена для GNU ddrescue , включая addrescue (имя на freecode.com и freshmeat.net), gddrescue ( имя пакета Debian ) и gnu_ddrescue ( имя пакета openSUSE ).
Другая программа с открытым исходным кодом под названием 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 = filename of = filename1 conv = ucase, notrunc
Индикатор прогресса
Поскольку программа в основном разработана как фильтр, dd обычно не показывает прогресса. Это можно решить, отправив Сигнал USR1 для работающего GNU dd процесс, в результате dd выводит текущее количество переданных блоков.
Следующая однострочная строка приводит к непрерывной выдаче информации о прогрессе каждые 10 секунд до завершения передачи, когда dd-pid заменяется идентификатором процесса дд :
в то время как kill -USR1 dd-pid ; спать 10; Выполнено
Новые версии GNU dd поддержать status = progress опция, которая включает периодическую печать статистики передачи в stderr. [19]
Вилки
dcfldd
dcfldd - это форк GNU dd , это расширенная версия, разработанная Ником Харбором, который в то время работал в лаборатории компьютерной криминалистики Министерства обороны США . [20] [21] [22] По сравнению с дд , dcfldd позволяет использовать более одного выходного файла, поддерживает одновременное вычисление нескольких контрольных сумм, обеспечивает режим проверки для сопоставления файлов и может отображать процент выполнения операции. Последний выпуск был в 2020 году. [23]
dc3dd
dc3dd - еще один усовершенствованный GNU dd из Центра киберпреступлений Министерства обороны США (DC3). Его можно рассматривать как продолжение dcfldd с заявленной целью обновления всякий раз, когда обновляется восходящий поток GNU. Его последний выпуск был в 2018 году. [24]
Смотрите также
- Резервное копирование
- Клонирование диска
- Копирование с диска
- Образ диска
- .img (расширение имени файла)
- Список команд Unix
- ddrescue версия GNU, которая копирует данные из поврежденных файлов
Рекомендации
- ^ Остин Группа. «Стандарт POSIX: вызов dd» . Проверено 29 сентября 2016 .
- ^ Чессман, Сэм. "Как и когда использовать команду dd?" . CodeCoffee . Проверено 19 февраля 2008 .
- ^ а б Раймонд, Эрик С. "дд" . Проверено 19 февраля 2008 .
- ^ Ричи, Деннис (17 февраля 2004 г.). "Re: происхождение команды UNIX dd" . Группа новостей : alt.folklore.computers . Usenet: [email protected] . Проверено 10 января 2016 года .
dd всегда называли в честь карт JCL dd.
- ^ Шеин, Барри (22 апреля 1990 г.). «Re: этимология команды Unix« dd »» . Группа новостей : alt.folklore.computers . Usenet: [email protected] . Проверено 14 июля 2016 .
- ^ - Руководство программиста Plan 9 , том 1
- ^ «Как использовать dd в Linux, не разрушая диск» . Opensource.com . 2018-07-05 . Проверено 11 октября 2020 .
- ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (технический отчет). CSTR. Bell Labs. 139.
- ^ a b c d e f - Справочник по командам и утилитам, спецификация Single UNIX , выпуск 7 от Open Group
- ^ Б - Linux User в Руководство - Команды пользователя
- ^ - Руководство по основным командам FreeBSD
- ^ а б Жиль (2011). "клонирование - dd vs cat - актуален ли dd в наши дни?" . Обмен стеков Unix и Linux .
- ^ Чтение ISO-образа с CD, DVD или BD , документация ARCH linux, дата обращения: 22.01.2017.
- ^ "linux - Почему используется conv = notrunc при клонировании диска с помощью dd?" . Переполнение стека. 2013-12-11 . Проверено 24 марта 2014 .
- ^ Райт, Крейг; Клейман, Дэйв; Сундхар RS, Шьям (2008). «Перезапись данных на жестком диске: большой спор об стирании». Конспект лекций по информатике . Безопасность информационных систем. 5352 : 243–257. DOI : 10.1007 / 978-3-540-89862-7_21 . ISBN 978-3-540-89861-0.
- ^ "dd_rescue" . garloff.de .
- ^ LAB Valentin (19 сентября 2011 г.). "Репозиторий автора dd_rhelp" .
Важное примечание: в некоторых случаях dd_rhelp был единственным инструментом (AFAIK), который выполнял эту работу, но через несколько лет это больше не соответствует действительности: Антонио Диас написал идеальную замену для моего инструмента: GNU 'ddrescue'.
- ^ «Ddrescue - Проект GNU - Фонд свободного программного обеспечения (FSF)» . gnu.org .
- ^ "GNU Coreutils: вызов dd" . Операционная система GNU и движение за свободное программное обеспечение . Проверено 26 августа 2019 .
- ^ «DCFLDD в Source Forge» . Source Forge . Проверено 17 августа 2013 .
- ^ Джереми Фэйрклот, Крис Херли (2007). Набор инструментов с открытым исходным кодом для тестирования на проникновение . Syngress. С. 470–472. ISBN 9780080556079.
- ^ Джек Уайлс, Энтони Рейес (2011). Лучшая проклятая книга о киберпреступности и цифровой криминалистике . Syngress. С. 408–411. ISBN 9780080556086.
- ^ «dcfldd: Расширенная версия dd для криминалистики и безопасности» . GitHub . Проверено 19 ноября 2020 .
- ^ "dc3dd" . SourceForge .
Внешние ссылки
- : преобразование и копирование файла - Справочник по командам и служебным программам, спецификация Single UNIX , выпуск 7 из Open Group
- - Руководство программиста Plan 9 , том 1
- - Руководство по общим командам Inferno
- dd : страница руководства из GNU Core Utilities .
- - Руководство по основным командам Darwin и macOS
- dd для Windows .
- savehd7 - сохранить потенциально поврежденный раздел жесткого диска
- Softpanorama dd page .
- DD в Linux Questions Wiki .
- Криминалистика (DD) Dcfldd
- ddpt - вариант, специализирующийся на файлах, которые являются блочными устройствами
- sg_dd - специализированный вариант Linux для устройств, использующих набор команд SCSI