GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum gibt dd von /dev/random unterschiedliche Dateigrößen an?

Sie beobachten eine Kombination des eigentümlichen Verhaltens von dd mit dem eigentümlichen Verhalten von /dev/random von Linux . Beides ist übrigens selten das richtige Werkzeug für den Job.

/dev/random von Linux gibt Daten sparsam zurück. Es basiert auf der Annahme, dass die Entropie im Pseudozufallszahlengenerator sehr schnell gelöscht wird. Da das Sammeln neuer Entropie langsam ist, /dev/random gibt normalerweise nur wenige Bytes auf einmal ab.

dd ist ein altes, verschrobenes Programm, das ursprünglich für den Betrieb auf Bandgeräten gedacht war. Wenn Sie ihm sagen, dass er einen Block von 1 KB lesen soll, versucht er, einen Block zu lesen. Wenn der Lesevorgang weniger als 1024 Bytes zurückgibt, ist das alles, was Sie bekommen. Also dd if=/dev/random bs=1K count=2 macht zwei read(2) Anrufe. Da es von /dev/random liest , die beiden read Aufrufe geben normalerweise nur wenige Bytes zurück, je nach verfügbarer Entropie in unterschiedlicher Anzahl. Siehe auch Wann eignet sich dd zum Kopieren von Daten? (oder wenn read() und write() partiell sind)

Wenn Sie keinen OS-Installer oder -Kloner entwerfen, sollten Sie niemals /dev/random verwenden unter Linux immer /dev/urandom . Die urandom Manpage ist etwas irreführend; /dev/urandom ist nämlich für die Kryptografie geeignet, sogar um langlebige Schlüssel zu erzeugen. Einzige Einschränkung bei /dev/urandom ist, dass es mit ausreichend Entropie versorgt werden muss; Linux-Distributionen speichern normalerweise die Entropie zwischen Neustarts, sodass Sie möglicherweise nur bei einer Neuinstallation nicht genügend Entropie haben. Entropie nutzt sich praktisch nicht ab. Weitere Informationen finden Sie unter Ist ein Rand von /dev/urandom sicher für einen Anmeldeschlüssel? und Feeding /dev/random entropy pool?.

Die meisten Verwendungen von dd lassen sich besser mit Tools wie head ausdrücken oder tail . Wenn Sie 2 KB zufällige Bytes möchten, führen Sie

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

Mit älteren Linux-Kerneln könnten Sie mit

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

weil /dev/urandom gerne so viele Bytes wie angefordert zurückgegeben. Dies gilt jedoch seit Kernel 3.16 nicht mehr, es ist jetzt auf 32 MB begrenzt.

Im Allgemeinen, wenn Sie dd verwenden müssen Um eine feste Anzahl von Bytes zu extrahieren und deren Eingabe nicht von einer regulären Datei oder einem Blockgerät kommt, müssen Sie Byte für Byte lesen:dd bs=1 count=2048 .


Ab man 4 random auf einer RHEL 5-Box:

Beim Lesen gibt das Gerät /dev/random nur zufällige Bytes innerhalb der geschätzten Anzahl von Rauschbits im Entropiepool zurück.

Ich bekomme Dateien mit einer Größe von 213 Bytes auf dieser Maschine. Zurück zu zufälligem Mann 4:

Beim Lesen gibt das /dev/urandom-Gerät so viele Bytes wie angefordert zurück.

Ich bekomme 2048 Bytes von jedem Aufruf von dd if=/dev/urandom of=rand bs=1K count=2

Ich schließe daraus, dass der Unterschied darauf zurückzuführen ist, wie viel Entropie Ihre Maschine zwischen den Aufrufen von dd if=/dev/random ... erzeugt


Warum wird dd Daten löschen? ... Gilles hat diese fesselnde Frage zu dd gestellt :
Wann eignet sich dd zum Kopieren von Daten? (oder wenn read() und write() partiell sind)
Hier ist ein Auszug aus dieser Frage:

*...es ist nicht schwer, dd die Schuld zu geben; Versuchen Sie zum Beispiel diesen Code:**
yes | dd of=out bs=1024k count=10
und überprüfen Sie die Größe der Ausgabedatei (sie liegt wahrscheinlich weit unter 10 MB).

Abgesehen von meinem Kommentar (am Ende Ihrer Frage) ist so etwas interessant anzusehen ... Es fängt Ihre Bytes in der Datei $trnd ab . Ich habe halb willkürlich bs=8

gewählt

Bewegen Sie Ihre Maus und beobachten Sie, wie sie schneller wird.
Mit meinem Computer im Leerlauf (AFK und keine Netzwerkaktivität) und nachdem der Entropiepool erschöpft war, dauerte es 2 Stunden 12 Minuten um nur 1192 zu sammeln Bytes, an welcher Stelle ich es abgebrochen habe.

Wenn ich dann die Maus kontinuierlich bewegte, dauerte es relativ viel kürzere 1 Minute 15 Sekunden um die gleiche Anzahl von Bytes zu sammeln.

Dies zeigt ziemlich deutlich, dass das Sammeln von Entropie nicht auf der CPU-Geschwindigkeit basiert, sondern auf zufälligen Ereignissen basiert und dass mein Ubuntu-System die Maus als eine seiner wesentlichen verwendet Zufallsfaktoren.

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. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

  3. Wann sollte /dev/random vs. /dev/urandom verwendet werden?

  4. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  5. DD von /dev/zero nach /dev/null ... was eigentlich passiert

Was sind /dev/zero- und /dev/null-Dateien in Linux

Wie kann /dev/random oder /dev/urandom mit base64 codiert werden?

Warum macht `cat /dev/urandom` Ihr Terminal kaputt?

Warum listet Linux NVMe-Laufwerke als /dev/nvme0 anstelle von /dev/sda auf?

RdRand von /dev/random

Warum wird auf einigen Linux-Systemen das Root-Dateisystem als /dev/root statt als /dev/<realer Geräteknoten> in mtab angezeigt?