GNU/Linux >> Znalost Linux >  >> Linux

Proč dd z /dev/random dává různé velikosti souborů?

Pozorujete kombinaci zvláštního chování dd se zvláštním chováním linuxového /dev/random . Obojí je mimochodem jen zřídka tím správným nástrojem pro tuto práci.

Linux /dev/random vrací data střídmě. Vychází z předpokladu, že entropie v generátoru pseudonáhodných čísel velmi rychle uhasíná. Protože shromažďování nové entropie je pomalé, /dev/random obvykle se vzdává pouze několika bajtů najednou.

dd je starý, výstřední program původně určený k provozu na páskových zařízeních. Když mu řeknete, aby přečetl jeden blok o velikosti 1 kB, pokusí se přečíst jeden blok. Pokud čtení vrátí méně než 1024 bajtů, těžké, to je vše, co dostanete. Takže dd if=/dev/random bs=1K count=2 vytvoří dvě read(2) hovory. Protože se čte z /dev/random , dvě read volání obvykle vracejí pouze několik bajtů, v různém počtu v závislosti na dostupné entropii. Viz také Kdy je dd vhodné pro kopírování dat? (nebo, když jsou read() a write() částečné)

Pokud nenavrhujete instalační program nebo klonovač OS, nikdy byste neměli používat /dev/random pod Linuxem vždy /dev/urandom . urandom manuálová stránka je poněkud zavádějící; /dev/urandom je ve skutečnosti vhodný pro kryptografii, dokonce i pro generování klíčů s dlouhou životností. Jediné omezení s /dev/urandom je, že musí mít dostatečnou entropii; Linuxové distribuce obvykle šetří entropii mezi restarty, takže jediný případ, kdy možná nebudete mít dostatek entropie, je nová instalace. Entropie se prakticky nevytrácí. Další informace najdete v článku Je rand z /dev/urandom bezpečný pro přihlašovací klíč? and Feeding /dev/random entropy pool?.

Většina použití dd jsou lépe vyjádřeny nástroji jako head nebo tail . Pokud chcete 2 kB náhodných bytů, spusťte

head -c 2k </dev/urandom >rand

Se staršími linuxovými jádry byste si mohli vystačit s

dd if=/dev/urandom of=rand bs=1k count=2

protože /dev/urandom šťastně vrátil tolik bajtů, kolik bylo požadováno. Ale to už od jádra 3.16 neplatí, nyní je to omezeno na 32 MB.

Obecně, když potřebujete použít dd Chcete-li extrahovat pevný počet bajtů a jeho vstup nepochází z běžného souborového nebo blokového zařízení, musíte číst bajt po bajtu:dd bs=1 count=2048 .


Od man 4 random na krabici RHEL 5:

Při čtení zařízení /dev/random vrátí pouze náhodné bajty v rámci odhadovaného počtu bitů šumu ve fondu entropie.

Na tomto počítači dostávám soubory o velikosti 213 bajtů. Zpět k muži 4 náhodně:

Při čtení /dev/urandom zařízení vrátí tolik bajtů, kolik je požadováno.

Dostanu 2048 bajtů z každého vyvolání dd if=/dev/urandom of=rand bs=1K count=2

Došel jsem k závěru, že rozdíl je způsoben tím, kolik entropie váš počítač generuje mezi vyvoláním dd if=/dev/random ...


Proč dd vypustit data? ... Gilles položil tuto zajímavou otázku o dd :
Kdy je dd vhodné pro kopírování dat? (nebo, když jsou read() a write() částečné)
Zde je úryvek z této otázky:

*...není těžké dát na vinu dd; zkuste například tento kód:**
yes | dd of=out bs=1024k count=10
a zkontrolujte velikost výstupního souboru (pravděpodobně bude výrazně pod 10 MB).

Kromě mého komentáře (na konci vaší otázky) je zajímavé něco takového sledovat... Zachycuje vaše bajty v souboru $trnd . Pololibovolně jsem zvolil bs=8

Pohybujte myší a sledujte, jak se zrychluje.
Při nečinnosti počítače (AFK a žádná síťová aktivita) a po vyčerpání fondu entropie to trvalo 2 hodiny 12 minut nasbírat pouze 1192 bajtů, v tu chvíli jsem to zrušil.

Když jsem pak neustále pohyboval myší, trvalo to relativně mnohem kratší 1 minutu 15 sekund shromáždit stejný počet bajtů.

To docela jasně ukazuje, že shromažďování entropie není založeno na rychlosti CPU, ale spíše jde o náhodné události založené a že můj systém Ubuntu používá myš jako jednu ze svých významných náhodné faktory.

get=2048
trnd=/tmp/$USER.rnd; >"$trnd"
while (( $(wc -c <"$trnd") < $get )) ;do
    dd if=/dev/random bs=8 count=1 2>/dev/null >>"$trnd"
    echo -n "itt: $((i+=1))  ct: "; wc -c <"$trnd"
done
truncate -s $get "$trnd"
echo -e "\nfinal count: "; wc -c <"$trnd"

Linux
  1. Linux:Rozdíl mezi /dev/console, /dev/tty a /dev/tty0?

  2. Jak přenosné jsou /dev/stdin, /dev/stdout a /dev/stderr?

  3. Jak namapovat zařízení /dev/sdX a /dev/mapper/mpathY ze zařízení /dev/dm-Z

  1. Co jsou soubory /dev/zero a /dev/null v Linuxu

  2. DD z /dev/zero do /dev/null...co se vlastně stane

  3. Proč zápis do /dev/random neurychluje paralelní čtení z /dev/random?

  1. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  2. echo nebo print /dev/stdin /dev/stdout /dev/stderr

  3. Proč jsou < nebo > vyžadovány pro použití /dev/tcp