Автор: Алексей Дмитриев
Дата: ноябрь 2008

Немного истории

Команда dd практически ровесник ОС Юникс. Днем рождения последней
считается 1 января 1970, и точно известно, что уже в 1970 году утилита
dd работала с ленточными накопителями, при помощи которых данные
переносили с одной ЭВМ на другую, а также запускали и устанавливали ОС
Юникс на популярные тогда мини-ЭВМ PDP/11.





Рисунок 1. Мини-ЭВМ PDP/11

Расшифровка названия команды тоже относится к этим давно ушедшим
временам. В языке IBM System/360 JCL был оператор DD ‘Dataset
Definition’ (Определение набора данных), имя которого и получила вновь
созданная команда.





Рисунок 2. Перфолента PDP/11

Расшифровок приходилось встречать много, в частности в рунете
популярна расшифровка Disk Dump (не то разгрузка, не то загрузка диска)
— версия слабая, так как в описываемые времена ни дисков, ни дампов
(что бы под ними не понимали) еще не было. Гораздо ближе к сути команды
шутливые расшифровки: «data destroyer» или «delete data», что можно
перевести как «Доконай Диск» или «Добей Данные», потому что при
неправильном использовании команды раздел или выходной файл мгновенно
превращаются в хлам. Поскольку dd является инструментом для создания
головных меток диска, загрузочных записей и тому подобных системных
областей диска, наверняка многие жесткие диски и файловые системы были
уничтожены неправильным применением dd.

Синтаксис, не похожий на команду Юникс

Из глубины времен
пришел и синтаксис команды dd, не похожий ни на одну команду Юникс.
Синтаксис команды dd кардинально отличается от синтаксиса большинства
остальных команд Юникс. Благодаря своей уникальности он устоял против
недавних попыток унифицировать синтаксис для всех программ командной
строки. Так dd использует формат ‘опция=значение’, в то время как
большинство команд Юникс используют формат ‘ -опция значение’. Кроме
того, ввод команды dd определяется опцией «if» (input file), в то время
как большинство команд просто используют само имя, без всяких опций.
Существует мнение, что такой синтаксис основан на языке
программирования IBM System/360 JCL, также ходят слухи, что этот
синтаксис был создан как шутка; тем не менее, не было ни одной попытки
написать замену программе dd, которая более походила бы на команду
Юникс.

Даже говоря о формате синтаксиса dd ‘опция=значение’, я допускаю
неточность. Опций в прямом смысле у этой команды всего две: —help и
—version, их применение очевидно. Все остальные элементы синтаксиса
называются операндами. Их не так уж и много, но многие столь сложно
зависят друг от друга, что, если начать приводить их по списку, то
получится очередной ман, разобраться в котором не просто. (Мне
встречались даже маны с внутренними ссылками, но сильно это не
помогало).

Поэтому в этой статье я делаю упор на примеры (не торопитесь
щелкать по ссылкам, вы доберетесь до примеров, читая статью
последовательно).

Список примеров

Пример 1. Простое копирование.

Пример 2. Создание загрузочной дискеты из файла-образа.

Пример 3. Разрезать 10 мегабайтный файл на два пяти-мегабайтных

Пример 4. Вывести на экран первые 100 байт содержимого файла

Пример 5. Создание образа оптического диска

Пример 6. Ускорениe работы некоторых Live CD

Пример 7. Увеличить размер существующего файла до 1Гб без перезаписи

Пример 8. Создание загрузочной дискеты Grub

Пример 9. Создание загрузочного образа

Пример 10. Вывести на экран MBR

Пример 11. Конвертация EBCDIC

Пример 12. Преобразование верхнего регистра в нижний

Пример 13. Создание резервной копии жесткого диска

Пример 14. Создание резервного образа жесткого диска

Пример 15. Уничтожение всех данных в разделе

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

Обычные варианты применения команды dd

Начнем знакомство с операндами команды dd:

if=filename (input file) Этот операнд задает входной файл; если
он не указан, то по умолчанию используется стандартный ввод. Этим
файлом может быть также файл (нода) устройства, например /dev/hda1, или
специфические файлы типа /dev/zero.

of=filename (output file) Задает выходной файл; если он не указан, то по умолчанию используется стандартный вывод (экран монитора).

Знакомство с этими двумя операндами уже дает нам возможность использовать программу dd для копирования файлов.

Команда dd для Windows

К читателям

Уважаемые коллеги, если вы знаете, или прочитали
про другие возможности применения команды dd, не сочтите за труд
написать мне. Только пожалуйста, не ограничивайтесь одной командной
строкой, а, по возможности, объясните что там к чему. Мой e-mail:
yakwiat@yandex.ru.

Приложения

переводе на русский В. Кравчука.

НАЗВАНИЕ

dd — преобразование и копирование файла

СИНТАКСИС
/usr/bin/dd [ операнд=значение … ]

ОПИСАНИЕ

Команда dd копирует указанный входной файл в указанный выходной,
совершая при необходимости преобразования. По умолчанию используются
стандартный входной и стандартный выходной потоки. Можно задавать
размеры блоков во входном и выходном файле, чтобы учесть особенности
физического ввода-вывода. Размер блоков задается в байтах; значение
размера может заканчиваться суффиксами k, b или w, задающими умножение
на 1024, 512 и 2, соответственно. Числа можно также разделять символами
x, интерпретируемыми как умножение.

Команда dd будет читать входной файл по одному блоку заданного
размера; затем она обрабатывает данные, формируя выдаваемые блоки
данных, которые могут быть меньше требуемого размера. Команда dd
применяет любые заданные преобразования и записывает получившиеся
данные в выходной файл блоками заданного для вывода размера.

Операнд cbs используется только если задано преобразование
ascii, asciib, unblock, ebcdic, ebcdicb, ibm, ibmb или block. В первых
двух случаях символы cbs копируются в буфер преобразования, выполняется
любое указанное преобразование символов, хвостовые пробелы удаляются и
перед посылкой строки в выходной файл добавляется символ новой строки.
В последних трех случаях символы вплоть до символа новой строки
считываются в буфер преобразования и дополняются пробелами для
получения записи указанного размера. Предполагается, что файлы ASCII
содержат символы новой строки. Если значение cbs не задано или равно 0,
опции ascii, asciib, ebcdic, ebcdicb, ibm и ibmb преобразуют набор
символов, не изменяя структуру блоков входного файла; опции unblock и
block приводят к простому копированию файла.

После завершения работы dd возвращает количество полных или частичных прочитанных и выданных блоков.

ОПЕРАНДЫ

Поддерживаются следующие операнды:

of=файл Задает выходной файл; по умолчанию используется
стандартный выходной поток. Если одновременно не задано преобразование
seek=expr, выходной файл будет усекаться перед началом копирования,
если только не указан операнд conv=notrunc. Если указан операнд
seek=expr, но не указан conv=notrunc, в результате в выходном файле
останутся только блоки, пропущенные командой dd. (Если размер
пропускаемой части плюс размер входного файла меньше, чем прежний
размер выходного файла, в результате копирования выходной файл станет
меньше.)

ibs=n Задает размер входного блока — n байтов (по умолчанию — 512).

obs=n Задает размер выходного блока — n байтов (по умолчанию — 512).

bs=n Устанавливает размеры входного и выходного блока равными n
байтов, переопределяя установки ibs= и obs=. Если не указаны никакие
изменения, кроме sync, noerror и notrunc, каждый входной блок будет
непосредственно копироваться на выход, а не собираться из меньших
блоков.

cbs=n Задает размер блока преобразования (n байтов, по
умолчанию — 0) для операндов block и unblock. Если операнд cbs= не
указан или задает значение 0, использование операндов block и unblock
дает неопределенные результаты.

Эта опция используется только если указано преобразование ASCII или
EBCDIC. Для преобразований ascii и asciib входные данные обрабатываются
так же, как и для операнда unblock, но символы преобразуются в ASCII
перед удалением хвостовых пробелов. Для преобразований ebcdic, ebcdicb,
ibm и ibmb входные данные обрабатываются так же, как и для операнда
block, но символы преобразуются в EBCDIC или IBM EBCDIC после
добавления хвостовых пробелов.

files=n Копирует и конкатенирует n входных файлов, прежде чем
завершить работу (имеет смысл только если входные данные берутся с
ленты или другого аналогичного устройства).

skip=n Пропускает n входных блоков (используя указанный размер
блока) перед началом копирования. Если по файлу можно перемещаться,
реализация dd прочитает или просто пропусти блоки; если же перемещаться
по файлу нельзя, блоки будут прочитаны и проигнорированы.

iseek=n Перемещается на n блоков с начала входного файла перед
копированием (походит для файлов на диске, где skip может работать
весьма медленно).

oseek=n Перемещается на n блоков от начала выходного файла перед копированием.

seek=n Пропускает n блоков (используя заданный размер выходного
блока) с начала выходного файла перед копированием. Если по файлу
нельзя перемещаться, существующие блоки будут прочитаны, а пространство
от текущего конца файла до указанного смещения (если смещение задано)
будет заполнено нулевыми байтами; если же по файлу можно перемещаться,
реализация dd пропустит данные вплоть до указанного смещения или
прочитает блоки так, как описано выше.

count=n Копирует только n входных блоков.

conv=значение[,значение…] Здесь значения берутся из следующего списка:

ascii Преобразует кодировку EBCDIC в ASCII.

asciib Преобразует кодировку EBCDIC в ASCII, используя BSD-совместимые преобразования символов.

ebcdic Преобразует кодировку ASCII в EBCDIC. При преобразовании
записей ASCII фиксированной длины, не разделенных символами новой
строки, необходимо организовать конвейер и предварительно обрабатывать
данные командой dd conv=unblock.

ebcdicb Преобразует кодировку ASCII в EBCDIC, используя
BSD-совместимые преобразования символов. При преобразовании записей
ASCII фиксированной длины, не разделенных символами новой строки,
необходимо организовать конвейер и предварительно обрабатывать данные
командой dd conv=unblock.

ibm Немного другое преобразование кодировки ASCII в EBCDIC.
При преобразовании записей ASCII фиксированной длины, не разделенных
символами новой строки, необходимо организовать конвейер и
предварительно обрабатывать данные командой dd conv=unblock.

ibmb Немного другое преобразование кодировки ASCII в EBCDIC,
использующее BSD-совместимые преобразования символов. При
преобразовании записей ASCII фиксированной длины, не разделенных
символами новой строки, необходимо организовать конвейер и
предварительно обрабатывать данные командой dd conv=unblock.

Значения ascii (или asciib), ebcdic (или ebcdicb) и ibm (или ibmb) — взаимоисключающие.

block Рассматривает входной файл как последовательность записей
переменной длины, завершаемых символами новой строки или символом конца
файла (EOF), независимо от размера входного блока. Каждая запись
преобразуется в запись фиксированной длины, задаваемой размером блока
преобразования. Все символы новой строки из входной строки удаляются; к
строкам при необходимости добавляются пробелы, чтобы заполнить блок.
Строки, длина которых превышает размер блока преобразования, усекаются
до этого размера; утилита сообщает о количестве усеченных строк.

unblock Преобразует записи фиксированной длины в записи
переменной длины. Читает количество байтов, равное размеру блока
преобразования (или оставшиеся байты входного файла, если их меньше,
чем байтов в блоке преобразования), удаляет все хвостовые пробелы и
добавляет символ новой строки.

Значения block и unblock — взаимоисключающие.

lcase Преобразует все символы верхнего регистра, в соответствии
со значением LC_CTYPE, в нижний регистр. Символы, для которых
преобразование в локали не задано, не изменяются.

ucase

Значения lcase и ucase — взаимоисключающие.

swab Переставляет байты в каждой входной паре. Если в текущей
входной записи нечетное количество байтов, последний байт игнорируется.

noerror Не останавливать обработку в случае ошибки чтения. При
возникновении ошибки чтения в стандартный поток ошибок выдается
диагностическое сообщение, а затем — текущий входной и выходной блок в
том же формате, что и при завершении работы. Если задано преобразование
sync, недостающие входные данные будут заменены нулевыми байтами; в
противном случае, сбойный входной блок просто не попадает в выходной
файл.

notrunc Не усекать выходной файл. Сохраняет блоки выходного
файла, не перезаписываемые явно при этом вызове dd. (См. также
предшествующий операнд of=файл.)

sync Дополнять каждый входной блок до размера буфера,
задаваемого операндом ibs=, добавляя нулевые байты. (Если указан также
операнд block или unblock, добавляются пробелы, а не нулевые байты.)

Если операнды (кроме conv=) указаны более одного раза, будет использоваться значение из последней пары операнд=значение.

Для операндов bs=, cbs=, ibs= и obs= необходимо указать выражение, задающее размер в байтах. Это выражение может быть:

положительным целым десятичным числом
положительным целым десятичным числом с суффиксом k, задающим умножение
на 1024
положительным целым десятичным числом с суффиксом b, задающим умножение
на 512
двумя или более положительными десятичными числами (с или без суффиксов
k или b), разделенными символом x, задающим произведение
соответствующих значений.

Все операнды обрабатываются до начала чтения входных данных.

ИСПОЛЬЗОВАНИЕ

Описание работы утилиты dd с файлами, размер которых
превосходит 2 Гбайта (2**31 байтов) см. на странице справочного
руководства largefile(5).

ПРИМЕРЫ

Пример 1: Копирование с одного стримера на другой:

В следующем примере выполняется копирование со стримера 0 на
стример 1 с использованием стандартных имен соответствующих устройств.

example% dd if=/dev/rmt/0h of=/dev/rmt/1h

Пример 2: Отсечение первых 10 байтов стандартного входного потока

В следующем примере удаляются первые 10 байтов стандартного входного потока.

example% dd ibs=10 skip=1

Пример 3: Чтение ленты в текстовый (ASCII) файл

В следующем примере читается лента с данными в кодировке EBCDIC, сблокированными по десять 80-байтовых образов, в ASCII-файл x:

example% dd if=/dev/tape of=x ibs=800 cbs=80 conv=ascii,lcase

Пример 4: Использование conv=sync для записи на ленту

В следующем примере используется синхронизация (conv=sync) при записи на ленту:

example% tar cvf — . | compress | dd obs=1024k of=/dev/rmt/0 conv=sync

ПЕРЕМЕННЫЕ СРЕДЫ

Описание переменных среды LC_CTYPE, LC_MESSAGES и NLSPATH,
влияющих на работу dd, см. на странице справочного руководства
environ(5).

СТАТУС ВЫХОДА

Программа завершается со следующими значениями статуса выхода:

0 Входной файл успешно скопирован.
>0 Произошла ошибка.

Если при чтении произошла ошибка и не указано преобразование
noerror, частично сформированный выходной блок будет записан в выходной
файл, будет выдано диагностическое сообщение и копирование будет
прекращено. При возникновении любой другой ошибки будет выдано
диагностическое сообщение и копирование будет прекращено.

ССЫЛКИ

cp(1), sed(1), tr(1), attributes(5), environ(5), largefile(5)

ДИАГНОСТИКА

f+p records in(out)
количество полностью и частично прочитанных (записанных) блоков

ПРИМЕЧАНИЯ

Не используйте dd для копирования файлов
из одной файловой системы в другую, если в этих файловых системах
разные размеры блоков.

При использовании блочного устройства для копирования файлов последний блок будет дополнен нулевыми байтами до границы блока.

Когда утилита dd читает из программного канала и заданы
операнды ibs=X и obs=Y, рез

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34