Perché dd copia solo 128 byte da / dev / random quando ne richiedo altri?


10

Sto cercando di capire l'output del ddcomando. Provai

dd if=/dev/zero of=/dev/null bs=512 count=1

e ottenuto (come previsto):

 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s

Tuttavia, quando ho provato

dd if=/dev/random of=/dev/null bs=512 count=1

ho ottenuto

 0+1 records in
 0+1 records out
 128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s

Perché sta copiando solo 128 byte?


Vedi superuser.com/questions/359599/… per una discussione più completa su / dev / random e urandom
BobT

Risposte:


8

È necessario utilizzare /dev/urandomla fonte casuale di "sblocco".

/dev/randomutilizza una specie di pool di entropia per aumentare la casualità della sorgente di bit. Questo metodo restituirà solo quanti bit / byte casuali quanti possono essere restituiti in base allo stato del pool di entropia al momento, quindi se viene utilizzato un generatore di numeri casuali hardware, questo può talvolta essere una costante. Dalla manpage di Linux :

Il generatore mantiene anche una stima del numero di bit di rumore nel pool di entropia. Da questo pool di entropia vengono creati numeri casuali.

Il /dev/urandomfile continua a riutilizzare il pool interno così com'è per generare un numero per tutto il tempo necessario. L'effetto collaterale di questo è: non usare /dev/urandomper scopi crittografici , in quanto è meno casuale dei bit prodotti da /dev/random. Vedere il link alla pagina man sopra per i dettagli.



3

Poiché la lettura /dev/randomrestituisce solo la quantità di byte disponibili, è necessario specificare la dimensione del blocco 1 . Nel tuo esempio, imposti la dimensione del blocco su 512 che non riesce dopo la prima lettura.

Pertanto, l'argomento corretto che legge esattamente 512 byte è:

dd if=/dev/random of=filename bs=1 count=512

Nota che il comando si bloccherà fino a quando non ci sarà abbastanza entropia nel sistema per generare tutti i dati. /dev/randomFunziona così . Se non vuoi aspettare e stai bene con meno entropia, usa /dev/urandominvece. Nella stragrande maggioranza dei casi /dev/urandomsi preferisce l'uso.


+1 per la spiegazione, sebbene si debba dire che con un numero di byte pari a 512 l'utilizzo /dev/randomdiventa praticamente inutilizzabile, poiché il completamento del comando può richiedere molti minuti. Inoltre, anche bs=512 count=1se sembra che la chiamata si blocchi ancora se non ci sono byte disponibili, giusto? Un'alternativa alla commutazione bse ai countvalori è usare iflag=fullblock; Per esempio, bs=512 count=1 iflag=fullblock.
mklement0,

IMHO, questa risposta dovrebbe essere unita a quella di @ Breakthrough. (Era la risposta al mio problema mentre non lo era Breakthrough).
superbob,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.