dd
dd (англ. dataset definition — визначення набору даних) — команда Unix, призначена для низькорівневого копіювання й конвертації необроблених (raw) даних. Використовується для копіювання визначеної кількості байтів чи блоків, заміни порядку байтів "на льоту", копіювання областей файлів пристроїв, резервного копіювання завантажувального сектора жорсткого диску або читання фіксованої кількості даних зі спеціальних файлів /dev/zero
чи /dev/random
.
Команду dd жартома називають «винищувач диску» (disk destroyer), «винищувач даних» (data destroyer), чи «стерти дані» (delete data), оскільки при виконанні низькорівневих операцій навіть незначна помилка (така, як переплутати між собою параметри if
та of
) може призвести до втрати деяких (або навіть усіх) даних на диску.
Синтаксис
Синтаксис команди dd
істотно відрізняється в залежності від ОС, тому узагальнити опис використання непросто. Загалом, dd
використовує формат option=value
, тоді як більшість Unix-команд мають вигляд -option value
або --option=value
. Також dd
використовує параметри if
для задання вхідного файлу (тоді як більшість команд безпосередньо приймають ім'я файлу) та of
— для файлу виводу.
Команда має таку загальну форму (квадратні дужки […]
значать, що параметр — необов'язковий):
dd [--help] [--version] [if=файл] [of=файл] [bs=байтів] [ibs=байтів] [obs=байтів] [cbs=байтів] [count=блоків] [seek=блоків] [skip=блоків] [conv={ascii, ebcdic, ibm, block, unblock, lcase, ucase, swab, noerror, notrunc, sync}]
Параметри
- if=файл — читає дані з файла замість стандартного вводу.
- of=файл — пише дані у файл-призначення замість стандартного виводу.
- bs=байтів — встановлює розмір блоку (кількість байтів читання й запису за раз). Ця опція пересилює ibs та obs.
- ibs=байтів — задає розмір блоку (в байтах) для зчитування за раз (типово — 512)…
- obs=байтів — … і для запису за раз (типово — 512).
- cbs=байтів — вказує розмір блоків (у байтах) перетворень для фільтрів block та unblock.
- count=блоків — скільки блоків ibs-байтової довжини копіювати.
- seek=блоків — вказує, скільки блоків obs-байтової довжини пропустити у файлі-призначення перед початком копіювання.
- skip=блоків — скільки блоків ibs-байтової довжини пропустити у файлі вводу перед тим, як розпочати копіювання.
- conv=фільтр1[,фільтр2,…,фільтрN] (без прогалин між комами) — застосувати фільтр(и) для конвертації:
- ascii — конвертувати в ASCII з EBCDIC…
- ebcdic — … і навпаки.
- block — вирівнювання блоків (для кожного рядка файлу вводу виведе cbs байтів, замінюючи символ нового рядка на пробіл і доповнюючи пробілами, за необхідності).
- unblock — замінить кінцеві пробіли кожного ввідного блоку з розміром cbs символом нового рядка.
- lcase — замінить літери верхнього регістру на нижній…
- ucase — … і навпаки.
- swab — поміняє місцями кожну пару байтів вводу, останній непарний (коли є) просто скопіюється.
- noerror — ігнорувати помилки вводу-виводу.
- notrunc — не вкорочуватиме файл виводу.
- sync — доповнить кожний блок вводу хвостовими нульовими байтами до ibs-розміру.
- -- — закінчує список параметрів.
Кількість блоків і байтів може бути вказана за допомогою суфіксів множення: c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M GB =1000*1000*1000, G =1024*1024*1024, те ж саме для T, P, E, Z, Y.
Використання
Робота з CD/DVD-дисками й образами
Приклад використання команди dd
для створення образу диску з CD-ROM:
dd if=/dev/cdrom of=/home/sam/myCD.iso bs=2048 conv=sync
Створити образ CD/DVD, використовуючи розмір блоку, ігноруючи помилки:
dd if=/dev/cdrom of=backup.iso bs=65535 conv=noerror
Записати ISO-образ «image.iso» на розділ sdb1 разом із його завантажувальним сектором і форматуванням розділу в файловій системі образа (як правило, ISO 9660 або UDF):
dd if=image.iso of=/dev/sdb1
Робота з файлами
Скопіювати файл foo в файл bar:
dd if=foo of=bar
Скопіювати файл foo в файл bar, пропустивши перші 10 КБ із файлу foo:
dd if=foo of=bar bs=1k skip=10
Порізати 10-мегабайтний файл foo на два по 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
або простіше, якщо немає зайвих файлів, що підпадають під маску SMILE.*:
cat SMILE.* > SMILE
Вивести на екран (у /dev/stdout) перші 256 байт файла foo:
dd if=foo of=/dev/stdout bs=128 count=2
або, враховуючи, що типовий файл виводу якраз і є /dev/stdout:
dd if=foo bs=128 count=2
Попередня команда придатна лише для перегляду текстового файлу. Вміст бінарного файлу рекомендується дивитися, перенаправивши вивід на команду hexdump:
dd if=foo bs=1 count=10 2> /dev/null | hexdump
Резервне копіювання й видалення даних
Скопіювати один розділ жорсткого диску на інший жорсткий диск, ігноруючи помилки вводу-виводу:
dd if=/dev/sda1 of=/dev/sdb2 bs=4096 conv=noerror
Зробити копію головного завантажувального запису (MBR) першого жорсткого диску:
dd if=/dev/hda of=bootloader.mbr bs=1 count=512
Копіювати все, крім мітки, з диску на магнiтну стрічку:
(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=65535
Дізнатися статус виконання операції:
killall -USR1 dd
В останніх версіях статус виконання операції можна відобразити в консолі, ввівши команду dd з параметром status=progress
dd if=image.iso of=/dev/sdb status=progress
Посилання
- * dd(англ.): manual page from GNU coreutils.
- * dd: Команда, которая не похожа на другие(рос.)
- * http://docs.linux.org.ua/man/man1/dd.1/: Man українською на DLOU