dd (Unix) - dd (Unix)

dd
Původní autoři Ken Thompson
( AT&T Bell Laboratories )
Vývojáři Různí open-source a komerční vývojáři
První vydání Červen 1974 ; Před 47 lety ( 1974-06 )
Úložiště git .savannah .gnu .org /cgit /coreutils .git /
Operační systém Unix , podobný Unixu , Plan 9 , Inferno
Plošina Cross-platform
Typ Příkaz
Licence jádro : GPLv3+

dd je nástroj příkazového řádku pro operační systémy Unix a Unix , jehož primárním účelem je převádět a kopírovat soubory.

V systému Unix se ovladače zařízení pro hardware (například jednotky pevných disků ) a speciální soubory zařízení (jako /dev /zero a /dev /random ) v systému souborů zobrazují stejně jako běžné soubory; dd může také číst a/nebo zapisovat z/do těchto souborů za předpokladu, že je funkce implementována v jejich příslušném ovladači. Výsledkem je, že dd lze použít pro úkoly, jako je zálohování zaváděcího sektoru pevného disku a získání fixního množství náhodných dat. Program dd může také provádět převody dat při kopírování, včetně výměny pořadí bajtů a převodu do az kódování textu ASCII a EBCDIC .

Dějiny

Jméno dd je narážka na prohlášení DD nalezený v IBM ‚s Job Control Language (JCL), ve které je zkratkou pro‚Data Definition‘. Syntaxe příkazu se více podobá příkazu JCL než jiné unixové příkazy, natolik, že Eric S. Raymond říká, že „design rozhraní byl zjevně hříčkou“. Rozhraní je přepracováno v příkazu dd Plan 9, aby používalo styl možností příkazového řádku. ddje někdy vtipně nazýván "Disk Destroyer", kvůli jeho schopnostem vymazání disku.

Původně zamýšlel převádět mezi ASCII a EBCDIC , dd se poprvé objevil ve verzi 5 Unix . Příkaz dd je zadán od vydání X/Open Portability Guide vydání 2 z roku 1987. Toto je zděděno IEEE Std 1003.1-2008 ( POSIX ), který je součástí jednotné specifikace UNIX .

Verzi ddbalíčku v GNU coreutils napsali Paul Rubin, David MacKenzie a Stuart Kemp.

Používání

Příkazového řádku Syntaxe dd liší od mnoha jiných programů Unix. Pro své možnosti příkazového řádku používá spíše syntaxi option = value než standardnější formáty - option value nebo - option = value . Ve výchozím nastavení dd čte ze standardního vstupu a zapisuje na standardní výstup , ale to lze změnit pomocí if (vstupní soubor) a z (výstupních souborů) možností.

Některé funkce dd budou záviset na schopnostech počítačového systému, například schopnost dd implementovat možnost přímého přístupu do paměti. Odeslání SIGINFO signál (nebo signál USR1 na Linuxu) k zapnutému dd proces umožňuje tisk I / O statistiky standardní chyby jednou a pak pokračovat v kopírování. dd umí číst standardní vstup z klávesnice. Když je dosaženo konce souboru (EOF), dd se ukončí. Signály a EOF jsou určeny softwarem. Například unixové nástroje portované do Windows se liší podle EOF: Cygwin používá Ctrl+ D(obvyklý Unix EOF) a MKS Toolkit používá Ctrl+ Z(obvyklý Windows EOF).

Nestandardizované části vyvolání dd se mezi implementacemi liší.

Výstupní zprávy

Po dokončení dd vytiskne do proudu stderr statistiky přenosu dat. Formát je standardizován v POSIX. Stránka manuálu pro GNU dd tento formát nepopisuje, ale příručky BSD ano.

Každý z řádků „Záznamy do“ a „Záznamy ven“ zobrazuje počet přenesených úplných bloků + počet dílčích bloků, např. Proto, že fyzické médium skončilo dříve, než byl přečten celý blok, nebo čtení celého bloku zabránila fyzická chyba.

Velikost bloku

Blok je jednotka měření počtu bytů , které se čtou, písemných nebo převedeny najednou. Možnosti příkazového řádku mohou určit jinou velikost bloku pro vstup/čtení ( ibs ) ve srovnání s výstupem/zápisem ( obs ), i když volba velikosti bloku ( bs ) přepíše ibs i obs . Výchozí hodnota pro velikost vstupního i výstupního bloku je 512 bajtů (tradiční velikost bloku disků a velikost „bloku“ nařízená POSIX). Možnost počítání pro kopírování se měří v blocích, stejně jako počet přeskočení pro čtení a počet hledání pro zápis. Operace převodu jsou také ovlivněny „velikostí bloku převodu“ ( cbs ).

Hodnota poskytovaná pro možnosti velikosti bloku je interpretována jako desetinný (základ 10) celočíselný počet bajtů. Může také obsahovat přípony označující, že velikost bloku je celočíselný počet větších jednotek než bajtů. POSIX specifikuje pouze přípony b (bloky) pro 512 a k ( kibibytes ) pro 1024. Implementace se liší v dalších příponách, které podporují: (Free) BSD používá malá písmena m ( megabajty ), g ( gibibytes ) atd. Pro tebibytes , exbibytes , pebibytes , zebibytes a yobibytes , zatímco GNU používá M a G pro stejné jednotky, přičemž jejich protějšky v jednotkách SI ( kilobajty ) jsou použity kB , MB a GB . Například pro GNU dd , bs = 16M indikuje velikost bloku 16 mebibytes (16777216 bajtů) a bs = 3kB Určuje 3000 bajtů.

Některé implementace navíc chápou znak x jako multiplikační operátor pro parametry velikosti bloku i počtu. Například bs = 2x80x18b je interpretováno jako 2 × 80 × 18 × 512 =1 474 560  bajtů , přesná velikost diskety 1440 KiB . Toto je vyžadováno v POSIXu, ale zdá se, že GNU to nepodporuje. V důsledku toho je přenosnější používat aritmetickou syntaxi POSIX shellu . bs=$((2*80*18))b

Velikost bloku má vliv na výkon kopírování příkazů dd . Dělat mnoho malých čtení nebo zápisů je často pomalejší než méně velkých. Použití velkých bloků vyžaduje více paměti RAM a může komplikovat obnovu chyb. Když je dd používán se zařízeními s proměnnou velikostí bloku, jako jsou páskové jednotky nebo sítě, může velikost bloku určovat velikost páskového záznamu nebo velikost paketu v závislosti na použitém síťovém protokolu .

Využití

Příkaz dd lze použít k mnoha účelům. U příkazů pro prosté kopírování bývá pomalejší než alternativy specifické pro doménu, ale vyniká svou jedinečnou schopností „přepsat nebo zkrátit soubor v libovolném bodě nebo hledat v souboru“, což je poměrně nízké rozhraní pro Unix. souborové API.

Níže uvedené příklady předpokládají použití GNU dd, hlavně v argumentu velikosti bloku. Aby byly přenosné, nahraďte je např. bs=64MSkořepinovým aritmetickým výrazem bs=$((64*1024*1024))nebo bs=$((64 << 20))(psáno ekvivalentně s bitovým posunem ).

Přenos dat

dd může duplikovat data napříč soubory, zařízeními, oddíly a svazky. Data mohou být vstupem nebo výstupem do az nich; ale existují důležité rozdíly týkající se výstupu při přechodu na oddíl. Během přenosu lze také data upravit pomocí možností konvence tak, aby vyhovovaly médiu. (Za tímto účelem je však dd pomalejší než kat .)

Formy přenosu dat z dd
bloky = $ (isosize -d 2048/dev/sr0) 
dd if =/dev/sr0 of = isoimage.iso bs = 2048 count = $ block status = progress
Vytvoří ISO obraz disku z CD-ROM , DVD nebo Blu-ray disk.
dd if = system.img of = /dev /sdc bs = 64M conv = noerror
Obnoví jednotku pevného disku (nebo například kartu SD) z dříve vytvořeného obrazu.
dd if =/dev/sdb2 of = partition.image bs = 64M conv = noerror
Vytvořte bitovou kopii oddílu sdb2 pomocí velikosti bloku 64 MiB.
dd if =/dev/sda2 of =/dev/sdb2 bs = 64M conv = noerror
Klonuje jeden oddíl do druhého.
dd if =/dev/ad0 of =/dev/ad1 bs = 64M conv = noerror
Klonuje jednotku pevného disku "ad0" na "ad1".

Možnost noerror znamená pokračovat, pokud dojde k chybě, zatímco možnost synchronizace způsobí, že výstupní bloky budou vyplněny.

Úpravy na místě

dd může upravovat data na místě. Toto například přepíše prvních 512 bajtů souboru nulovými bajty:

dd if = /dev/nula z = cesta/do/souboru bs = počet 512 = 1 konv = nezprovozněno

Možnost převodu notrunc znamená nezkracovat výstupní soubor - to znamená, že pokud výstupní soubor již existuje, stačí nahradit zadané bajty a zbytek výstupního souboru nechat být. Bez této možnosti by dd vytvořil výstupní soubor dlouhý 512 bajtů.

Zálohování a obnovení hlavního spouštěcího záznamu

Výše uvedený příklad lze také použít k zálohování a obnovení jakékoli oblasti zařízení do souboru, jako je hlavní spouštěcí záznam .

Chcete -li duplikovat první dva sektory diskety:

dd if =/dev/fd0 of = MBRboot .img bs = 512 count = 2

Vymazání disku

Z bezpečnostních důvodů je někdy nutné nechat vymazat disk z vyřazeného zařízení. Toho lze dosáhnout „přenosem dat“ ze speciálních souborů Unixu.

Ve srovnání s příkladem změny dat výše , notrunc možnost konverze není nutné, protože nemá žádný vliv na DD je výstupní soubor je blokové zařízení.

Volba bs = 16M umožňuje dd číst a zapisovat 16  megabajtů najednou. U moderních systémů může být ještě větší velikost bloku rychlejší. Pamatujte, že naplnění disku náhodnými daty může trvat déle než jeho vynulování, protože náhodná data musí být vytvořena procesorem, zatímco vytváření nul je velmi rychlé. U moderních pevných disků vynulování jednotky způsobí, že většina dat, která obsahuje, bude trvale neobnovitelná. U jiných typů disků, jako jsou flash paměti, však lze velkou část dat stále obnovit pomocí remanence dat .

Moderní pevné disky obsahují příkaz Secure Erase určený k trvalému a bezpečnému vymazání každé přístupné i nepřístupné části jednotky. Může také fungovat pro některé jednotky SSD (flash disky). Od roku 2017 nefunguje na USB flash discích ani na flash paměti Secure Digital . Když je k dispozici, je to rychlejší než použití dd, a také bezpečnější. Na počítačích se systémem Linux je k dispozici prostřednictvím možnosti příkazu hdparm --security-erase-enhanced .

Tyto Skartovat program nabízí více přepisuje, stejně jako bezpečnější mazání jednotlivých souborů.

Obnova dat

Obnova dat zahrnuje čtení z jednotky s některými potenciálně nepřístupnými částmi. dd se k této práci dobře hodí díky flexibilnímu přeskakování ( hledání ) a dalším nastavením na nízké úrovni. Vanilla dd je však neohrabané, protože uživatel musí číst chybové zprávy a ručně vypočítat oblasti, které lze přečíst. Velikost jednoho bloku také omezuje granuaritu obnovy, protože je třeba provést kompromis: buď použijte malý pro obnovu obnovených dat, nebo použijte velký pro rychlost.

Program AC nazvaný dd_rescue byl napsán v říjnu 1999. Zbavil se funkce převodu dd a podporuje dvě velikosti bloků, které řeší toto dilema. Pokud čtení pomocí velké velikosti selže, přejde zpět na menší velikost, aby shromáždilo co nejvíce dat. Může běžet i dozadu. V roce 2003 byl napsán skript dd_rhelp, který automatizuje proces používání dd_rescue a sleduje, jaké oblasti byly přečteny samostatně.

V roce 2004 napsal GNU samostatný nástroj, který nesouvisí s dd , nazvaný ddrescue . Má propracovanější algoritmus dynamické velikosti bloku a sleduje, co bylo interně přečteno. Autoři dd_rescue i dd_rhelp to považují za lepší než jejich implementace. Aby bylo možné odlišit novější program GNU od staršího skriptu, někdy se pro ddrescue GNU používají alternativní názvy , včetně addrescue (název na freecode.com a freshmeat.net), gddrescue ( název balíčku Debianu ) a gnu_ddrescue ( název balíčku openSUSE ) .

Další open-source program s názvem savehd7 používá důmyslný algoritmus, ale také vyžaduje instalaci vlastního tlumočníka programovacího jazyka .

Srovnávací výkon disku

Chcete-li provést test benchmarku jednotky a analyzovat sekvenční (a obvykle jednovláknový) výkon systému pro čtení a zápis pro bloky 1024 bajtů:

  • Výkon zápisu: dd if=/dev/zero bs=1024 count=1000000 of=1GB_file_to_write
  • Číst výkon: dd if=1GB_file_to_read of=/dev/null bs=1024

Generování souboru s náhodnými daty

Vytvoření souboru 100 náhodných bajtů pomocí náhodného ovladače jádra:

dd if = /dev /urandom of = myrandom bs = 100 count = 1

Převod souboru na velká písmena

Chcete -li převést soubor na velká písmena:

dd if = název_souboru = název_souboru1 conv = ucase, notrunc

Indikátor průběhu

Jelikož je program určen hlavně jako filtr, dd obvykle neposkytuje žádnou indikaci postupu. To lze překonat odesláním signálu USR1 do běžícího procesu GNU dd , což má za následek dd tisk aktuálního počtu přenesených bloků.

Následující jednořádková linka má za následek nepřetržitý výstup postupu každých 10 sekund, dokud není přenos dokončen, když je dd-pid nahrazeno id-procesu dd :

zatímco zabít -USR1 dd -pid  ; spát 10; Hotovo

Novější verze GNU dd podporují volbu status = progress , která umožňuje periodický tisk statistik přenosu na stderr.

Vidlice

dcfldd

dcfldd je vidlička GNU dd, což je vylepšená verze vyvinutá Nickem Harbourem, který v té době pracoval pro americké ministerstvo obrany Počítačové forenzní laboratoře . Ve srovnání s DD , dcfldd umožňuje více než jednoho výstupního souboru, podporuje simultánní vícenásobné výpočty kontrolních součtů, poskytuje režim ověřování pro porovnávání souborů, a může zobrazovat procentuální průběh operace. Poslední vydání bylo v roce 2020.

dc3dd

dc3dd je další vylepšený GNU dd z centra obrany proti počítačové kriminalitě amerického ministerstva obrany (DC3). Lze jej považovat za pokračování dcfldd se stanoveným cílem aktualizace, kdykoli se aktualizuje GNU upstream. Jeho poslední vydání bylo v roce 2018.

Viz také

Reference

externí odkazy