Dd

dd (dataset definition) — праграма UNIX, прызначаная як для капіравання, так і для канвертацыі файлаў. Назва ўспадкавана ад аператара DD (Dataset Definition) з мовы JCL.

 Уводзіны 
Паколькі ў UNIX шматлікія аб’екты з’яўляюцца файламі, спектр ужывання dd значна шырэй, чым падаецца на першы погляд. Стала ўзнікае неабходнасць не проста скапіраваць файл ці некалькі файлаў (для чаго прызначана ўтыліта cp), а скапіраваць першыя n байтаў файла, прапусціць m байтаў ад пачатку, прачытаць файл з дэфектыўнага носьбіта, трансляваць змест файла ў ASCII, «павярнуць» парадак байтаў у файле (Little-Endian vs. Big-Endian), проста скапіраваць вельмі вялікі файл ці ўсё разам узятае. Для гэтай мэты і належыць dd.

Акрамя ўсяго іншага, дадзеная ўтыліта дазваляе скапіраваць рэгіёны з файлаў «сырых» прылад, напрыклад зрабіць рэзервовую копію загрузачнага сектара цвёрдага дыска, ці прачытаць фіксаваныя блокі даных з спецыяльных файлаў, такіх як /dev/zero ці /dev/random.

Назву ўтыліты dd іншы раз у жарт расшыфроўваюць як «disk destroyer», «data destroyer» альбо «delete data», таму што ўтыліта дазваляе праводзіць нізкаўзроўневыя аперацыі на цвёрдых дысках — пры найменшай памылцы, такой як рэверс параметраў if і of, можна страціць частку даных на дыску (ці нават усе даныя).

 Некаторыя параметры 
Пры напісанні артыкула былі ўжыты матэрыялы man dd, якія апісваюць версію dd ад GNU. Версіі 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}]

 if=файл — чытае даныя з файла замест стандартнага ўводу.
 of=файл — піша даныя ў файл замест стандартнага вываду.
 bs=n — памер блока.
 ibs=nn и obs=nn — задае, колькі байтаў трэба счытваць ці запісваць за раз.
 count=n — колькі блокаў скапіраваць.
 seek=n — колькі блокаў прапусціць ад пачатку ў выніковым файле.
 skip=n — колькі блокаў ад пачатку файла прапусціць перад пачаткам капіравання.
 conv=фільтр,фільтр — ужыць фільтры канвертацыі.
 ascii — сканвертаваць у ASCII з EBCDIC…
 ebcdic — …і наадварот.
 block — выраўноўванне блокаў.
 lcase — пераўтварыць да ніжняга рэгістра.
 ucase — пераўтварыць да верхняга рэгістра.
 swab — мяняць месцамі пары байтаў.
 noerror — ігнараваць памылкі ўводу-вываду.

 Прыклады ўжывання 
 Работа з 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

Зрабіць копію галоўнага загрузачнага запісу (MBR) першага цвёрдага дыска:

    dd if=/dev/hda of=bootloader.mbr bs=512 count=1

Перагледзець змест галоўнага загрузачнага запісу (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=65535

Даведацца статус выканання аперацыі:

    killall -USR1 dd

 Варыянты dd, арыентаваныя на аднаўленне 
Праграмы з адкрытым крынічным кодам для ўзнаўлення ўключаюць dd_rescue і dd_rhelp, што працуюць разам, savehd7 і GNU ddrescue.

Antonio Diaz Diaz (распрацоўшчык GNU ddrescue) параўноўвае  варыянты dd для задач аднаўлення:

Стандартная ўтыліта dd ажыццяўляе лінейнае чытанне дыска, і гэта можа заняць шмат часу ці нават спаліць носьбіт без аднаўлення нечага, калі памылкі размешчаны ў пачатку цвёрдага дыску.

dd_rescue робіць тое ж самае, што і dd, толькі больш эфектыўна.

dd_rhelp — гэта складаны shell-скрыпт, які выконвае  dd_rescue шмат разоў, імкнучыся стратэгічна капіраваць носьбіт, але гэта вельмі неэфектыўна.

 dd_rhelp спачатку здабывае ўсе даступныя для чытання даныя і захоўвае іх у файл, устаўляючы нулі замест байтаў, якія немагчыма было прачытаць. Потым утыліта спрабуе паўторна прачытаць некарэктныя даныя і аднавіць гэты файл.
 GNU ddrescue можа быць ужыта для капіравання даных наўпрост на новы дыск па неабходнасці, як і dd.

 Гл. таксама 
 cp
 cat
 GNU
 Unix
 dcfldd

 Спасылкі 

 dd: Каманда, якая не падобна на іншыя
 Рэалізацыя dd для Windows

Катэгорыя:Сістэмнае праграмнае забеспячэнне
Катэгорыя:Аптычныя дыскі
Катэгорыя:Утыліты UNIX