**dd** (**d**ataset **d**efinition) — праграма UNIX, прызначаная як для капіравання, так і для канвертацыі файлаў. Назва ўспадкавана ад аператара DD (**D**ataset **D**efinition) з мовы 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

Зноскі
------

1. 1 2  *Sam Chessman*. How and when to use the dd command? **(нявызн.)**(недаступная спасылка).  CodeCoffee. Архівавана з першакрыніцы 14 лютага 2008. Праверана 19 лютага 2008.
2. ↑  Dd - LQWiki **(нявызн.)**(недаступная спасылка).  LinuxQuestions.org. Архівавана з першакрыніцы 18 студзеня 2012. Праверана 19 лютага 2008.
3. ↑  Interview With GNU DDRescue's Antonio Diaz Diaz **(нявызн.)**.  Blue-GNU. Архівавана з першакрыніцы 15 красавіка 2008. Праверана 6 снежня 2008.

Спасылкі
--------

* `dd(1)` — старонка даведкі man па карыстальніцкіх камандах GNU/Linux (англ.)
* dd: Каманда, якая не падобна на іншыя
* Рэалізацыя dd для Windows

| ⛭Стандартныя праграмы UNIX (усе праграмы) |
| --- |
| Файлавыя сістэмы | chroot · dd · df · fdisk · fsck · mkisofs · mkswap · mount · umount · rehash |
| Файлы і каталогі | cat · chattr · cd · chmod · chown · chgrp · cksum · cmp · cp · diff · du · file · fuser · ln · ls · lsof · mkdir · mv · od · pwd · rm · rmdir · split · touch |
| Працэсы | at · cron · exit · kill · killall · nice · nohup · pgrep · pidof · pkill · ps · renice · sleep · time · top · wait · watch |
| Карыстальнікі | env · finger · id · last · logname · mesg · passwd · su · sudo · uptime · w · wall · who · whoami · write |
| Сетка | ftp · host · ifconfig · netcat · netstat · nmap · nslookup · ping · rlogin · SSH · traceroute · wget |
| Тэксты | AWK · comm · cut · ed · ex · expand · unexpand · fmt · head · iconv · join · less · more · paste · pr · sed · sort · tac · tail · tr · uniq · wc · xargs |
| Камандны радок | alias · basename · bash · bind · dirname · echo · expr · false · printf · test · true · unset |
| Пошук | find · grep · strings · whereis · which |
| Рознае | banner · bc · cal · date · help · lp · man · Xhistory · size · tee · uname · yes · reboot |