J'essaie de comprendre la sortie de la dd
commande. j'ai essayé
dd if=/dev/zero of=/dev/null bs=512 count=1
et a obtenu (comme prévu):
1+0 records in
1+0 records out
512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s
Mais quand j'ai essayé
dd if=/dev/random of=/dev/null bs=512 count=1
j'ai eu
0+1 records in
0+1 records out
128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s
Pourquoi ne copie-t-il que 128 octets?
linux
command-line
fo_x86
la source
la source
Réponses:
Vous devez utiliser
/dev/urandom
, ou la source aléatoire de "déblocage"./dev/random
utilise une sorte de pool d'entropie pour augmenter le caractère aléatoire de la source de bits. Cette méthode renvoie uniquement autant de bits / octets aléatoires que possible en fonction de l'état du pool d'entropie à ce moment-là, donc si un générateur de nombres aléatoires matériel est utilisé, cela peut parfois être une constante. Depuis la page de manuel Linux :Le
/dev/urandom
fichier continue de réutiliser le pool interne tel quel pour générer un nombre aussi longtemps que vous en avez besoin. L'effet secondaire de ceci est: ne pas utiliser/dev/urandom
à des fins cryptographiques , car il est moins aléatoire que les bits produits par/dev/random
. Voir le lien de la page de manuel ci-dessus pour plus de détails.la source
Étant donné que la lecture
/dev/random
ne renvoie que la quantité d'octets disponibles, vous devez spécifier la taille de bloc 1 . Dans votre exemple, vous définissez la taille de bloc sur 512 qui échoue après la première lecture.Par conséquent, les arguments corrects qui lisent exactement 512 octets sont les suivants:
Notez que la commande se bloquera jusqu'à ce qu'il y ait suffisamment d'entropie dans le système pour générer toutes les données. Voilà comment ça
/dev/random
marche. Si vous ne voulez pas attendre et que vous allez bien avec moins d'entropie, utilisez/dev/urandom
plutôt. Dans la grande majorité des cas, l'utilisation/dev/urandom
est préférée.la source
/dev/random
devient pratiquement inutilisable, car la commande peut prendre plusieurs minutes. De plus, même avecbs=512 count=1
il semble que l'appel bloque toujours s'il n'y a pas d' octets du tout, n'est- ce pas ? Une alternative à la commutationbs
et auxcount
valeurs est d'utiliseriflag=fullblock
; à savoirbs=512 count=1 iflag=fullblock
.