dd

команда в Unix-подібних операційних системах

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

Копіювати все, крім мітки, з диску на магнітну стрічку:

    (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

Див. також ред.

Посилання ред.