Všechny následující příkazy jsou ekvivalentní. Čtou bajty CD /dev/sr0
a zapište je do souboru s názvem image.iso
.
cat /dev/sr0 >image.iso
cat </dev/sr0 >image.iso
tee </dev/sr0 >image.iso
dd </dev/sr0 >image.iso
dd if=/dev/cdrom of=image.iso
pv </dev/sr0 >image.iso
cp /dev/sr0 image.iso
tail -c +1 /dev/sr0 >image.iso
Proč byste měli používat jedno přes druhé?
-
Jednoduchost. Například pokud již znáte
cat
nebocp
, nemusíte se učit další příkaz. -
Robustnost. Tohle je tak trochu varianta jednoduchosti. Jak velké je riziko, že změna příkazu změní to, co dělá? Podívejme se na několik příkladů:
- Cokoli s přesměrováním:Mohli byste omylem zadat přesměrování špatně nebo na něj zapomenout. Protože cílem má být neexistující soubor,
set -o noclobber
by měl zajistit, že nic nepřepíšete; pokud však omylem zapíšete>/dev/sda
, můžete zařízení přepsat (u CD, které je pouze pro čtení, samozřejmě žádné riziko nehrozí). To hovoří ve prospěchcat /dev/sr0 >image.iso
(těžko se pokazit špatně) oproti alternativám jakotee </dev/sr0 >image.iso
(pokud převrátíte přesměrování nebo zapomenete vstupní,tee
zapíše do/dev/sr0
). cat
:můžete omylem zřetězit dva soubory. Data tak lze snadno zachránit.dd
:i
ao
jsou blízko na klávesnici a poněkud neobvyklé. Neexistuje žádný ekvivalentnoclobber
,of=
s radostí cokoliv přepíše. Syntaxe přesměrování je méně náchylná k chybám.cp
:pokud omylem zaměníte zdroj a cíl, zařízení bude přepsáno (opět za předpokladu, že zařízení není pouze pro čtení). Pokudcp
se vyvolává s některými možnostmi, jako je-R
nebo-a
který někteří lidé přidají prostřednictvím aliasu, zkopíruje uzel zařízení spíše než obsah zařízení.
- Cokoli s přesměrováním:Mohli byste omylem zadat přesměrování špatně nebo na něj zapomenout. Protože cílem má být neexistující soubor,
-
Další funkce. Jediným nástrojem, který má užitečné doplňkové funkce, je
pv
s výkonnými možnostmi vytváření přehledů.
Zde však můžete zkontrolovat, kolik toho bylo zkopírováno, a to tak, že se podíváte na velikost výstupního souboru. -
Výkon. Toto je I/O-vázaný proces; hlavní vliv na výkon má velikost vyrovnávací paměti:nástroj načte blok ze zdroje, zapíše blok do cíle, opakuje. Pokud je blok příliš malý, počítač tráví čas přepínáním mezi úkoly. Pokud je blok příliš velký, nelze operace čtení a zápisu paralelizovat. Optimální velikost bloku na PC je obvykle kolem několika megabajtů, ale to samozřejmě velmi závisí na operačním systému, hardwaru a na tom, co ještě počítač dělá. Před chvílí jsem v Linuxu provedl benchmarky pro kopie z pevného disku na pevný disk, což ukázalo, že pro kopie na stejném disku je
dd
s velkou velikostí vyrovnávací paměti má výhodu, ale pro kopie mezi diskycat
vyhrál nad jakýmkolidd
velikost vyrovnávací paměti.
Existuje několik důvodů, proč najdete dd
tak často zmiňovaný. Kromě výkonu to nejsou zvlášť dobré důvody.
- Ve velmi starých unixových systémech si některé nástroje pro zpracování textu nedokázaly poradit s binárními daty (interně používaly řetězce zakončené nulou, takže měly tendenci mít problémy s nulovými bajty; některé nástroje také předpokládaly, že znaky používají pouze 7 bitů a nezpracoval správně 8bitové znakové sady). Nejsem si jistý, jestli to někdy byl problém s
cat
(Bylo to s více linkově orientovanými nástroji, jako jehead
,sed
, atd.), ale lidé měli tendenci se mu vyhýbat na binárních datech kvůli jeho spojení se zpracováním textu. To není problém na moderních systémech, jako je Linux, OSX, *BSD nebo cokoli, co je kompatibilní s POSIX. - Existuje jakýsi mýtus, že
dd
je poněkud „nižší úroveň“ než jiné nástroje, jako jecat
a přistupuje přímo k zařízením. Toto je zcela nesprávné:dd
acat
atee
a ostatní všichni čtou bajty ze svého vstupu a zapisují je na svůj výstup. Skutečné kouzlo je v/dev/sr0
. dd
má neobvyklou syntaxi příkazového řádku, takže vysvětlení, jak to funguje, dává větší příležitost zazářit vysvětlením něčeho, co stačí napsatcat /dev/sr0
.- Pomocí
dd
s velkou velikostí vyrovnávací paměti může mít lepší výkon, ale není tomu tak vždy (viz některé benchmarky na Linuxu).
Velké riziko s dd
je, že může tiše přeskočit některá data . Myslím, že dd
je bezpečný, dokud skip
nebo count
nejsou předány, ale nejsem si jistý, zda je tomu tak na všech platformách. Ale nemá žádnou výhodu kromě výkonu.
Stačí tedy použít pv
pokud chcete jeho efektní zprávu o průběhu, nebo cat
pokud ne.
Namísto použití obecných nástrojů jako cat
nebo dd
, měli byste preferovat nástroje, které jsou spolehlivější při chybách čtení, jako je
- ddrescue
- readcd (který má vestavěné mechanismy pro opravy chyb/opakování pro jednotky CD/DVD)
Navíc jejich výchozí nastavení je vhodnější než např. dd
's.
V tomto případě jsou zajímavé skutečnosti, zejména tyto:
- Právě jsem zkontroloval výstup, který jsem dostal a poskytl (tentokrát jsem použil jiný disk, přesně, instalační disk Xubuntu 15.04 x64), a s oběma postupy (
dd
apv
) kontrolní součty jsou identické . - Napadlo mě to po provedení
dd
otevřete jednotku a zavřete ji stejným diskem a poté dokončete test pomocípv
postup. Díky tomu jsem získal identické kopie s oběma postupy. - Myslím Poprvé jsem dostal jiné kontrolní součty, protože z nějakého důvodu se zdá, že data shromážděná z jednotky CD/DVD byla nějakou dobu „zaznamenána“ pro jiné účely (jako mezipaměť) – takže byly provedeny další operace, jako jsou kontrolní součty. mnohem rychlejší než převod. Pokud znáte přesnou příčinu, napište komentář.
- Další skutečností je, že
dd
bezcount=X
parametr se zastaví správně na konci disku a poskytne stejný obraz disku jako upv
(kontrolní součty jsou identické), takže je pro mě lepší použítdd
bez parametrů nebo jenpv
.
Zatím to tedy vypadá pv
a dd
může provést kopii CD/DVD se stejnými výsledky.