DD мануалы для копирования и восстановления

Oct 28, 2015 00:00

DD

https://russianlinuxmanpages.wordpress.com/tag/dd/
ИМЯ
dd - преобразовать и копировать файл
ОБЗОР
dd[-help] [-version][if=файл][of=файл][ibs=байты][obs=байты][bs=байты][cbs=байты][skip=блоки][seek=блоки][count=блоки][conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]
ОПИСАНИЕ
dd копирует файл (по умолчанию из стандартного ввода на стандартный вывод), используя заданные размеры блоков для ввода и вывода, и в то же время, возможно, выполняя его преобразование.

dd читает по одному блоку за раз, используя заданный размер входного блока(по умолчанию 512 байт).Если задана опция bs=байты и не требуется преобразований, отличных отsync, noerror, или notrunc, тоddзаписывает прочитанные данные (которых может быть меньше, чем было запрошено)в отдельный выходной блок. Выходной блок имеет точно ту же длину, что прочитанный блок, за исключением случая, когда задано преобразованиеsync,при котором данные добиваются символами NUL (или пробелами, см. ниже).

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

За числовыми значениями опций (байты и блоки) могут следовать коэффициенты: `k’=1024, `b’=512, `w’=2, `c’=1 (коэффициенты`w’ и `c’ являются расширениями GNU; `w’ никогда не должен использоваться -он означает 2 в System V и 4 в 4.2BSD).Два или более таких числовых выражений могут быть умножены друг на друга с помощью символа `x’ между ними. Версия GNU fileutils-4.0 также разрешает при задании размеров блоков(в bs=, cbs=, ibs=, obs=) следующие коэффициенты:M=1048576, G=1073741824, и так далее для T, P, E, Z, Y.Суффикс `D’ делает значения десятичными:kD=1000, MD=1000000, GD=1000000000, и так далее.(Заметим, что для ls, df, du размер M и т. п. определяется переменными окружения, но для dd он фиксирован).
ОПЦИИ

if=файл
Читает данные из файла в место стандартного ввода.
of=файл
Пишет данные в файл в место стандартного вывода. Если только не заданconv=notrunc,dd обрезает файл до нулевого размера (или размера, заданного вseek=).
ibs=bytes
Читает поbytesбайт за раз. По умолчанию 512.
obs=bytes
Пишет по bytes байт за раз. По умолчанию 512.
bs=bytes
Читает и пишет по bytes байт за раз. Данная опция перекрывает опции ibs и obs.(Кроме того, установкаbsне эквивалентна установке обеих опций ibs и obs в то же значение, по крайней мере, когда не задано преобразований отличных отsync,noerrorиnotrunc,так как она оговаривает, что каждый входной блок будет копироваться на выход как отдельный блок без объединения коротких блоков).
cbs=байт
Задает размер блока для преобразований типаblockиunblock.
skip=blocks
Пропускает blocks блоков длины ibs байт во входном файле перед началом копирования.
seek=blocks
Пропускает в выходном файлеblocksблоков длиныobsбайт перед началом копирования.
count=blocks
Копирует лишь blocks блоков длины ibs байт из входного файла, а не весь входной файл, как обычно.
conv=ПРЕОБРАЗОВАНИЕ[,ПРЕОБРАЗОВАНИЕ]…
Преобразует файл, как задано аргументом(ами)ПРЕОБРАЗОВАНИЕ.(Вокруг запятых не должно быть пробелов).
Типы преобразований:

ascii
Преобразование EBCDIC в ASCII.
ebcdic
Преобразование ASCII в EBCDIC.
ibm
Преобразование ASCII в альтернативный EBCDIC.
block
Для каждой строки во входном файле, выводитьcbsбайт, заменяя символ новой строки на пробел и добивая пробелами при необходимости.
unblock
Заменять заключительные пробелы в каждом входном блоке размера cbsбайт на символ новой строки.
lcase
Изменять заглавные буквы на строчные.
ucase
Изменять строчные буквы на заглавные.
swab
Менять местами каждую пару входных байт.Если последний байт имеет нечетный порядковый номер, то он просто копируется (так как менять местами нечего).[POSIX 1003.2b, PASC interpretations 1003.2 #3 и #4]
noerror
Продолжать после ошибок чтения.
notrunc
Не обрезать выходной файл.
sync
Дополнять каждый входной блок до размераibsпутем добавления нулевых байт.

СТАНДАРТНЫЕ ОПЦИИ GNU

-help
Выдать подсказку на стандартный вывод и успешно завершиться.
-version
Выдать информацию о версии на стандартный вывод и успешно завершиться.
-
Служит для обозначения конца списка опций.

ОКРУЖЕНИЕ

При работе обычным образом используются значения переменных LANG,LC_ALL, LC_CTYPE и LC_MESSAGES.
СОВМЕСТИМОСТЬ

POSIX 1003.2
ПРИМЕР

Часто стример не может работать с блоками произвольного размера, иddбудет выдавать ошибку ввода/вывода для последнего фрагмента данных,который не полностью заполняет блок. Для получения всего содержимого ленты, используйте `dd if=myfile of=/dev/mytape conv=sync’. Разумеется, если прочитать теперь этот файл обратно с ленты, то он станет немного больше, потому что будет дополнен нулями.
ОШИБКИ РЕАЛИЗАЦИИ

Команды типа `dd if=myfile of=/dev/fd0 bs=1k seek=172′ завершаются неудачей на некоторых системах, потому чтоddпытается обрезать выходной файл, а обрезать блочное устройство нельзя. В таких случаях добавьте флаг `conv=notrunc’.
ЗАМЕЧАНИЯ

Данная страница описывает версиюddиз пакета fileutils-4.0;другие версии могут иметь небольшие отличия.Исправления и дополнения присылайте по адресу aeb@cwi.nl.Сообщения об ошибках в этой программе присылайте по адресуfileutils-bugs@gnu.ai.mit.edu.
ПЕРЕВОД

Перевёл с английского Виктор Вислобоков 2003
=-=-=-=-=--=-=-
http://habrahabr.ru/post/117050/
В UNIX системах есть одна очень древняя команда, которая называется dd. Она предназначена для того, чтобы что-то куда-то копировать побайтово. На первый взгляд - ничего выдающегося, но если рассмотреть все возможности этого универсального инструмента, то можно выполнять довольно сложные операции без привлечения дополнительного ПО, например: выполнять резервную копию MBR, создавать дампы данных с различных накопителей, зеркалировать носители информации, восстанавливать из резервной копии данные на носители и многое другое, а, при совмещении возможностей dd и поддержке криптографических алгоритмов ядра Linux, можно даже создавать зашифрованные файлы, содержащие в себе целую файловую систему.
Опять же, в заметке я опишу самые часто используемые примеры использования команды, которые очень облегчают работу в UNIX системах.

Начну с небольшого примера, наглядно иллюстрирующего основные параметры команды:

# dd if=/dev/urandom of=/dev/null bs=100M count=5

Параметры:
if: указывает на источник, т.е. на то, откуда копируем. Указывается файл, который может быть как обычным файлом, так и файлом устройства.
of: указывает на файл назначения. То же самое, писать можем как в обычный файл, так и напрямую в устройство.
bs: количество байт, которые будут записаны за раз. Можно представлять этот аргумент как размер куска данные, которые будут записаны или прочитаны, а количество кусков регулируется уже следующим параметром.
count: как раз то число, которое указывает: сколько кусочков будет скопировано.

Таким образом, описанная команда читает 5*100 мегабайт из устройства /dev/urandom в устройство /dev/null. Придавая этой команде смысловую нагрузку получается, что система сгенерирует 500 мегабайт случайных значений и запишет их в null устройство. Конечно, единственное, что сделает эта команда: нагрузит процессор на несколько секунд. Рассмотрим примеры из практики:

Создание образа диска:

# dd if=/dev/cdrom of=image.iso

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

# dd if=/dev/cdrom of=image.iso conv=noerror

Параметр «conv» позволяет подключать несколько фильтров, применимых к потоку данных. Фильтр «noerror» как раз отключает остановку работы программы, когда наткнется на ошибку чтения. Таким образом, некоторые данные с диска все же можно будет прочитать. Точно таким образом я спас данные со своей флешки Corsair, которую погнули: подобрал подходящее положение, когда контакт есть, и сделал дамп файловой системы.
Подключить, кстати, такие образы можно при помощи команды mount с ключем "-o loop":

# mount -o loop image.iso /mnt/image

Если что-то не получается, процесс разбивается на 2 уровня:

# losetup -e /dev/loop0 image.iso
# mount /dev/loop0 /mnt/image

Если и так не работает, значит файловая система образа полетела.

Работа с носителями информации

Очень простое, хоть и не оптимальное решение клонирования жесткого диска:

# dd if=/dev/sda of=/dev/sdb bs=4096

Все то же побайтовой копирование с размером буфера 4 Кб. Минус способа в том, что при любой заполненности разделов копироваться будут все биты, что не выгодно при копировании разделов с маленькой заполненностью. Чтобы уменьшить время копирования при манипуляции с большими объемами данных, можно просто перенести MBR на новый носитель (я ниже опишу как), перечитать таблицу разделов ядра (при помощи того же fdisk), создать файловые системы и просто скопировать файлы (не забыв сохранить права доступа к файлам).

Как вариант, можно даже по расписанию делать бекап раздела по сети. Разрулив ключи ssh будет работать такая схема:

# dd if=/dev/DEVICE | ssh user@host «dd of=/home/user/DEVICE.img».

Когда-то читал исследование, согласно которому очень большая доля жестких дисков на барахолке подвергается восстановлению данных без привлечения чего-то специализированного, и содержит конфиденциальную информацию. Чтобы на носителе ничего нельзя было восстановить - можно забить его нулями:

# dd if=/dev/zero of=/dev/DEVICE

Думаю, понятно на что нужно заменить DEVICE. После проведения лекций по Linux, я очень тщательно стал следить за тем, что пишу.
Проверить можно тем же dd, но преобразовав данные в hex:

# dd if=/dev/sda | hexdump -C

Должны посыпаться нули.

Операции с MBR

MBR расположена в первых 512 байтах жесткого диска, и состоит из таблицы разделов, загрузчика и пары доп. байт. Иногда, ее приходится бекапить, восстанавливать и т.д. Бекап выполняется так:

# dd if=/dev/sda of=mbr.img bs=512 count=1

Восстановить можно проще:

# dd if=mbr.img of=/dev/sda

Причины этих махинаций с MBR могут быть разные, однако хочу рассказать одну особенность, взятую из опыта: после восстановления давней копии MBR, где один из разделов был ext3, а позже стал FAT и использовался Windows, раздел перестал видиться виндой. Причина - ID раздела, который хранится в MBR. Если UNIX монтирует файловые системы согласно суперблоку, то винды ориентируются на ID разделов из MBR. Поэтому всегда нужно проверять ID разделов при помощи fdisk, особенно если на компьютере есть винды.

Генерация файлов

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

# dd if=/dev/zero of=image.crypted bs=1M count=1000

Создался файл размером почти в гигабайт. Теперь нужно сделать этот файл блочным устройством и, при этом, пропустить его через механизм шифрования ядра linux. Я выберу алгоритм blowfish. Подгрузка модулей:

# modprobe cryptoloop
# modprobe blowfish

Ассоциация образа с блочным устройством со включенным шифрованием:

# losetup -e blowfish /dev/loop0 image.crypted

Команда запросит ввести пароль, который и будет ключем к образу. Если ключ введен не правильно, система не смонтируется. Можно будет заново создать данные в образе, используя новый ключ, но к старым данным доступа не будет.
Создаем файловую систему и монтируем:

# mkfs.ext2 /dev/loop0
# mount /dev/loop0 /mnt/image

Образ готов к записи данных. После завершения работы с ним, нужно не забыть его отмонтировать и отключить от блочного loop устройства:

# umount /dev/loop0
# losetup -d /dev/loop0

Теперь шифрованный образ готов.

Основные идеи я расписал, однако множество задач, которые можно решить при помощи маленькой программки, имя которой состоит из двух букв, намного шире. Программа «dd» - яркий пример того, что IT'шники называют «UNIX way»: одна программа - часть механизма, выполняет исключительно свою задачу, и выполняет ее хорошо. В руках человека, который знает свое дело, которому свойственен не стандартный подход к решению задачи, такие маленькие программки помогут быстро и эффективно решать комплексные задачи, которые, на первый взгляд, должны решать крупные специализированные пакеты.

linux, programms

Previous post Next post
Up