Перайсці да зместу

dd

З Вікіпедыі, свабоднай энцыклапедыі

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

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

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

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

Некаторыя параметры

[правіць | правіць зыходнік]

Пры напісанні артыкула былі ўжыты матэрыялы 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) параўноўвае [3] варыянты dd для задач аднаўлення:

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

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

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

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

Зноскі

  1. а б 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.