Was ist der Unterschied zwischen den Befehlsoptionen von dd bs=1024 count=1 und bs=1 count=1024

Was ist der Unterschied zwischen den Befehlsoptionen von dd bs=1024 count=1 und bs=1 count=1024

Betrachten Sie die folgenden beiden Befehle, die beide eine einfache 1-KB-Datei erstellen

dd if=/dev/urandom of=test.file bs=1024 count=1

dd if=/dev/urandom of=test.file bs=1 count=1024

Der erste Befehl verwendet eine Blockgröße von 1024 Bytes und eine Blockanzahl von 1, der zweite macht es umgekehrt.

Ich vermute, dass es keinen Unterschied gibt und die Blockgrößenbeschränkung ein RAM-bezogenes Problem ist: Die Blockgröße kann nicht größer sein als der verfügbare Speicher.

Gibt es besondere Fälle, in denen ich den ersten Fall dem zweiten vorziehen möchte oder muss? Und umgekehrt?

Antwort1

Wie Sie im Grunde verstanden zu haben scheinen, liest die erste Version einmal 1024 Bytes und schreibt dann die Anzahl der Bytes, die beim Lesen zurückgekommen sind, während die zweite Version 1024 Lese- und Schreibvorgänge von jeweils einem Byte durchführt. Beim Kopieren normaler Dateien kann die größere Blockgröße (die zu einer geringeren Anzahl von E/A-Vorgängen führt) geringfügig effizienter sein. Dies gilt wahrscheinlich /dev/urandomauch für.

ddBei der Verwendung auf speziellen Dateien (also Geräten) müssen Sie jedoch vorsichtig sein . Zum Beispiel:

dd wenn=(unabhängig von der Eingabe)  von=(ein Magnetbandgerät)  bs=1024 Anzahl=1

schreibt einen Bandblock mit 1024 Bytes; dd … bs=1 count=1024schreibt 1024 Blöcke mit jeweils einem Byte. Das ist nicht dasselbe; die 1024 kleinen Blöcke nehmen aufgrund von Lücken zwischen den Datensätzen mehr Platz auf dem Band ein als der große Block und können beim Lesen des Bandes Probleme verursachen. Relevanter für Ihre Frage ist, dass wenn Sie if=von lesen () /dev/randomnur so viele Bytes mit hoher Entropie zurückgeben, wie verfügbar sind. In der ersten Version erhalten Sie also möglicherweise weniger als 1024 Bytes. Wenn Sie jedoch versuchen, ein Byte zu lesen, und der Entropiepool leer ist, wird der Lesevorgang blockiert (d. h. warten), bis Daten verfügbar sind, sodass die zweite Version Ihnen garantiert 1024 Bytes liefert (obwohl dies beliebig lange dauern kann).

Um noch näher auf den Punkt zum Bandlaufwerk einzugehen:

dd wenn=(entsprechende Eingabe)  von=(ein Magnetbandgerät)  bs=512 Anzahl=2

werden zwei Bandblöcke von 512 Bytes geschrieben. Ein nachfolgender

dd wenn=(Magnetbandgerät)  von=(was auch immer)  bs=1024 Anzahl=1

liest möglicherweise nur den ersten Block, also die ersten 512 Bytes.

Und (benannte) Pipes können das gleiche Problem aufweisen: /dev/randomEin großer Lesevorgang gibt nur so viele Bytes zurück, wie verfügbar sind. In der ersten Version erhalten Sie also möglicherweise weniger als 1024 Bytes. Wenn Sie jedoch versuchen, jeweils ein Byte zu lesen, wartet der Lesevorgang, bis Daten verfügbar sind. In der zweiten Version erhalten Sie also garantiert 1024 Bytes (oder zumindest Lesevorgänge bis zum EOF).

verwandte Informationen