dd
dd (dataset definition) — программа UNIX, предназначенная как для копирования, так и для конвертации файлов. Название унаследовано от оператора DD (Dataset Definition) из языка JCL[1][2].
Поскольку в UNIX многие объекты (жёсткие/гибкие диски, COM/LPT-порты, оперативная память компьютера, память с кодом/данными каждого процесса) представлены в виде специальных файлов, спектр применения утилиты dd
гораздо шире, чем кажется на первый взгляд. Регулярно возникает необходимость не просто скопировать файл или несколько файлов (для чего предназначена утилита cp), а скопировать первые n байт файла, пропустить m байт от начала, прочитать файл с дефектного носителя, транслировать содержимое файла в ASCII, «развернуть» порядок байтов в файле (Little-Endian vs. Big-Endian)[3], просто скопировать очень большой файл или всё вместе взятое. Для этой цели и служит dd
.
Кроме всего прочего, данная утилита позволяет скопировать регионы из файлов «сырых» устройств, например, сделать резервную копию загрузочного сектора жёсткого диска, или прочитать фиксированные блоки данных из специальных файлов, таких, как /dev/zero или /dev/random[4].
Название утилиты dd
иногда в шутку расшифровывают, как «disk destroyer», «data destroyer», «delete data» или «добей диск», так как утилита позволяет производить низкоуровневые операции на жёстких дисках — при малейшей ошибке (такой, как реверс параметров if
и of
) можно потерять часть данных на диске (или даже все данные)[3]. Есть и более «уважительное» прозвище — «disk duplicator», потому что на практике основное её применение — это копии, образы и бэкапы разделов.
Некоторые параметры[править | править код]
При написании статьи были использованы материалы man dd, описывающие версию dd от GNU. Версии dd на других операционных системах могут отличаться.
Базовые параметры[править | править код]
dd [--help] [--version] [status] [if=файл] [of=файл] [ibs=байты] [obs=байты] [bs=байты] [cbs=байты] [skip=блоки] [seek=блоки] [count=блоки] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]
status=progress
— отображает статистику передачи, возможны 3 варианта 'none', 'noxfer', 'progress' GNU Coreutils 8.24+ (Ubuntu 16.04 and newer).if=файл
— читает данные из файла вместо стандартного ввода.of=файл
— пишет данные в файл вместо стандартного вывода.bs=n
— размер блока.ibs=nn
иobs=nn
— задаёт, сколько байтов нужно считывать или записывать за раз.count=n
— сколько блоков скопировать.seek=n
— сколько блоков пропустить от начала в выходном файле перед копированием.skip=n
— сколько блоков пропустить от начала во входном файле перед копированием.conv=фильтр,фильтр
— применить фильтры конвертации. Типы фильтров:
Примеры использования[править | править код]
Работа с CD/DVD-дисками и образами[править | править код]
Создать образ CD/DVD, используя большой размер блока. Игнорировать ошибки:
dd if=/dev/cdrom of=backup.iso bs=65536 conv=noerror
Записать ISO-образ «image.iso» на устройство sdb вместе с его загрузочным сектором и форматированием раздела в файловую систему образа (как правило, ISO 9660 или UDF):
dd if=image.iso of=/dev/sdb
Работа с файлами[править | править код]
Скопировать файл foo в файл bar:
dd if=foo of=bar
Скопировать файл foo в файл bar, пропустив первые 10 КБ из файла foo:
dd if=foo of=bar bs=1k skip=10
Порезать 10-мегабайтный файл foo на 2 по 5 МБ:
dd if=foo of=bar.0 bs=1M count=5
dd if=foo of=bar.1 bs=1M skip=5
Склеить четыре 100-мегабайтных файла в один:
dd if=SMILE.001 of=SMILE bs=1M seek=0
dd if=SMILE.002 of=SMILE bs=1M seek=100
dd if=SMILE.003 of=SMILE bs=1M seek=200
dd if=SMILE.004 of=SMILE bs=1M seek=300
а можно и так:
dd if=SMILE.001 > SMILE
dd if=SMILE.002 >> SMILE
dd if=SMILE.003 >> SMILE
dd if=SMILE.004 >> SMILE
или же (для сбора файла из большого количества кусков):
for i in {1..4}; do
dd if=SMILE.00$i >> SMILE
done
Примеры выше показывают возможности dd; на практике, обычно, используется cat:
cat SMILE.00{1,2,3,4} >> SMILE
Вывести на экран (в /dev/stdout) первые 256 байт файла foo:
dd if=foo of=/dev/stdout bs=128 count=2
или:
dd if=foo bs=128 count=2
Предыдущая команда годится только для просмотра текстового файла. Содержимое бинарного файла рекомендуется смотреть так:
dd if=foo bs=1 count=10 2>/dev/null | hexdump
Резервное копирование и удаление данных[править | править код]
В большинстве случаев следует быть внимательным, чтобы файл назначения не оказался на том же самом диске, с которого снимается образ (и, собственно, желательно его вообще размонтировать, поскольку любые случайные изменения его файловой системы могут нарушить целостность образа).
Скопировать один раздел жёсткого диска на другой жёсткий диск, игнорируя ошибки ввода-вывода:
dd if=/dev/sda1 of=/dev/sdb2 bs=4096 conv=noerror,sync
Сделать копию главной загрузочной записи (MBR) первого жёсткого диска:
dd if=/dev/hda of=bootloader.mbr bs=512 count=1
Заполнить всё свободное место в текущем разделе нулями:
dd if=/dev/zero of=zerofill
Создать сжатый образ первого жёсткого диска со всеми разделами (рекомендуется сначала заполнить свободное место нулями для лучшего сжатия):
dd if=/dev/sda | xz -9 > MyFuBu.ISO.XZ
Cоздать разбитый на отрезки по 2Gb образ первого жёсткого диска со всеми разделами (со сжатием и без):
dd if=/dev/sda | xz -9 | split -b 2G --additional-suffix=.xz - MyFuBu.iso.
dd if=/dev/sda | split -b 2G --additional-suffix=.iso - MyFuBu.
Просмотреть содержимое главной загрузочной записи (MBR) первого жёсткого диска:
dd if=/dev/sda bs=512 count=1 | hexdump -C
Копировать всё, кроме метки, с диска на магнитную ленту:
(dd bs=4k skip=1 count=0 && dd bs=512k) <$disk >$tape
Копировать всё, не перезаписывая метку, с магнитной ленты на диск:
(dd bs=4k seek=1 count=0 && dd bs=512k) <$tape >$disk
Уничтожить содержимое устройства /dev/sdg
, заполнив его «нулями» из /dev/zero
:
dd if=/dev/zero of=/dev/sdg bs=65536
Узнать статус выполнения операции:
killall -USR1 dd
В некоторых случаях статус выполнения просматривается командой:
pkill -USR1 -x dd
В последних версиях статус выполнения можно выводить в консоль, задав команду dd с параметром status=progress
dd if=image.iso of=/dev/sdb status=progress
Варианты dd, ориентированные на восстановление[править | править код]
Программы с открытым исходным кодом для восстановления включают dd_rescue[5][6][7][8] и dd_rhelp[9][10], которые работают вместе, savehd7 и GNU ddrescue.
Antonio Diaz Diaz (разработчик GNU ddrescue) сравнивает[11] варианты dd для задач восстановления:
Стандартная утилита dd осуществляет линейное чтение диска, и это может занять много времени или даже сжечь накопитель без восстановления чего-либо, если ошибки расположены в начале жёсткого диска.
dd_rescue делает то же самое, что и dd, только более эффективно.
dd_rhelp — это сложный shell-скрипт, который запускает dd_rescue много раз, стараясь стратегически копировать накопитель, но это очень неэффективно.
- dd_rhelp сначала извлекает все доступные к чтению данные и сохраняет их в файл, вставляя нули вместо байтов, которые не смог прочесть. Потом утилита пытается повторно прочитать некорректные данные и обновить этот файл.
- GNU dd_rescue может быть использована для копирования данных прямо на новый диск по необходимости, как и dd.
См. также[править | править код]
Примечания[править | править код]
- ↑ Eric S. Raymond. dd . The Jargon File. www.catb.org. Дата обращения: 19 февраля 2019.
- ↑ Dennis Ritchie (Feb 17, 2004). "Re: origin of the UNIX dd command". alt.folklore.computers. (Google Groups).
- ↑ 1 2 Sam Chessman. How and when to use the dd command? (недоступная ссылка). CodeCoffee. Дата обращения: 19 февраля 2008. Архивировано 21 января 2012 года.
- ↑ Dd - LQWiki . LinuxQuestions.org. Дата обращения: 19 февраля 2008. Архивировано 21 января 2012 года.
- ↑ dd_rescue . www.garloff.de. Дата обращения: 19 февраля 2019.
- ↑ GNU ddrescue — лучшая утилита для восстановления данных с повреждённого жёсткого диска . rus-linux.net. Дата обращения: 19 февраля 2019.
- ↑ OpenNET: статья — Восстановления данных с повреждённых носителей при помощи gddrescue (disk recover repair fs forensic linux) . www.opennet.ru. Дата обращения: 19 февраля 2019.
- ↑ Bruce Nikkel. Practical Forensic Imaging: Securing Digital Evidence with Linux Tools. — No Starch Press, 2016. — 324 с. — ISBN 9781593278007.
- ↑ Kalysto - /Utilities/dd_rhelp - (rescue hard disk helper) . www.kalysto.org. Дата обращения: 19 февраля 2019.
- ↑ Kyle Rankin. Knoppix Hacks: Tips and Tools for Hacking, Repairing, and Enjoying Your PC. — "O'Reilly Media, Inc.", 2007-11-20. — 422 с. — ISBN 9780596551759.
- ↑ Interview With GNU DDRescue's Antonio Diaz Diaz (недоступная ссылка). Blue-GNU. Дата обращения: 6 декабря 2008. Архивировано 15 апреля 2008 года.
Литература[править | править код]
- W. Curtis Preston. Backup & Recovery: Inexpensive Backup Solutions for Open Systems. — O'Reilly, 2007-01-03. — 760 с. — ISBN 9780596102463.
- Алексей Дмитриев. dd: Команда, которая не похожа на другие . MyLDP. Серия HuMan. rus-linux.net. Дата обращения: 18 февраля 2019.
- Алексей Zemond Панкратов. HOW-TO: Команда dd и ее секреты . «Хакер» (10 октября 2016). Дата обращения: 18 февраля 2019.
- Джульетта Кемп. Данные: если дело плохо (рус.) // LinuxFormat. — 2009. — Март (№ 116).
- Др. Браун. Утилиты копирования (рус.) // LinuxFormat. — 2010. — Сентябрь (№ 135).
- Пётр Семилетов. Азбука записи (рус.) // LinuxFormat. — 2002. — Февраль (№ 76).
Ссылки[править | править код]
dd(1)
— страница справки man по пользовательским командам GNU/Linux (англ.)- Реализация dd под Windows
- Дмитрий Щербаков. Команда dd и всё, что с ней связано . habr.com (11 апреля 2011). Дата обращения: 19 февраля 2019.
Для улучшения этой статьи желательно: |