Warum Blockgröße angeben, wenn Geräte mit begrenzter Größe kopiert werden?

14

In Online-Tutorials wird häufig empfohlen, den folgenden Befehl zu verwenden, um eine CD-ROM in ein ISO-Image zu kopieren:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Warum muss die Bytegröße angegeben werden? Ich stelle fest, dass 2048 tatsächlich die Standard-Bytegröße für CD-ROM-Images ist, aber es scheint, dass dies ddohne Angabe von bs=oder auch count=funktioniert.

Unter welchen Umständen wäre es problematisch, nicht anzugeben bs=oder count=beim Kopieren von einem Gerät endlicher Größe?

dotancohen
quelle

Antworten:

12

Wann ist dd zum Kopieren von Daten geeignet? (oder, wenn read () und write () partiell sind) weist auf eine wichtige Einschränkung bei der Verwendung hin count: ddKann partielle Blöcke kopieren, so dass countsie nach der angegebenen Anzahl von Blöcken anhalten, selbst wenn einige der Blöcke unvollständig waren. Es kann daher vorkommen, dass weniger als bs * countBytes kopiert werden, es sei denn, Sie geben dies an iflag=fullblock.

Die Standardblockgröße für dd beträgt 512 Byte. countist eine Grenze; Wie Ihre Frage andeutet, ist es nicht erforderlich, wenn Sie ein Gerät mit endlicher Größe kopieren, sondern nur zum Kopieren eines Teils eines Geräts.

Ich denke, hier sind zwei Aspekte zu berücksichtigen: Leistung und Datenwiederherstellung.

Was die Leistung anbelangt, möchten Sie im Idealfall, dass die Blockgröße mindestens der zugrunde liegenden physischen Blockgröße entspricht und ein Vielfaches davon beträgt (daher 2048 Byte beim Lesen einer CD-ROM). Tatsächlich können Sie heutzutage auch größere Blöcke angeben, um den zugrunde liegenden Cachesystemen die Möglichkeit zu geben, Dinge für Sie zu puffern. Das Erhöhen der Blockgröße bedeutet ddjedoch, dass so viel mehr Speicher benötigt wird, und es kann kontraproduktiv sein, wenn Sie aufgrund einer Paketfragmentierung über ein Netzwerk kopieren.

Bei der Datenwiederherstellung können Sie möglicherweise mehr Daten von einer fehlerhaften Festplatte abrufen, wenn Sie kleinere Blockgrößen verwenden. Programme wie dd-rescuetun dies automatisch: Sie lesen zunächst große Blöcke, aber wenn ein Block ausfällt, lesen sie ihn mit kleineren Blockgrößen erneut. ddwird dies nicht tun, es wird nur den ganzen Block versagen.

Stephen Kitt
quelle
2
Leistung besonders; Schreiben Sie beispielsweise ein Partitionsimage mit dd bs=4m iflag=fullblockvs auf eine SD-Karte, dd bs=1111und achten Sie auf die wesentlich höheren Datenraten, die Sie durch die erstere erhalten. Dies liegt daran, dass ersteres mit den natürlichen Blockgrößen auf der SD-Karte übereinstimmt, während letzteres erfordert, dass der SD-Controller viel liest, kopiert und neu blitzt, um teilweise physikalische Blöcke zu schreiben. Die Bedeutung von fullblockist übrigens nicht zu unterschätzen, da es sich ohne es bsnur um ein Maximum handelt und partielle Lesevorgänge zu anhaltenden nachträglichen Fehlausrichtungen führen könnten.
Jason C
6

Es gibt einen Ladungskult dd. Ursprünglich gab es zwei Fehler cp, die Probleme verursachten: Dateien wurden als spärlich erkannt, wenn sie mit einer anderen Blockgröße als 512 gemeldet wurden (Linux verwendete eine Blockgröße von 1024), und leere Blöcke wurden beim Kopieren von a nicht vom Ziel gelöscht Sparse-Datei auf ein Block-Gerät.

Hinweise dazu finden Sie in den frühen Archiven der Linux-Mailinglisten .

So gewöhnten sich die Leute daran, mit Disk-Images richtig umzugehen, und CP blieb auf der Strecke. Und da dd eine Standardblockgröße von 512 verwendet, ist es langsam (langsamer als cp auf modernen Systemen). Es ist jedoch nicht klar, welche Blockgröße Sie verwenden sollten. Wahrscheinlich hat in Ihrem Fall jemand gelesen, dass 2048 die "natürliche" Blockgröße für eine CD-ROM ist (CD-ROMs sind in 2.352 Byte-Sektoren unterteilt, die 2.048 Byte Daten sowie fehlerkorrigierende Informationen enthalten), und hat dies entschieden ist die "richtige" Größe für dd, wenn Sie in der Tat wahrscheinlich schnellere Ergebnisse erzielen würden, wenn Sie eine (mäßig) größere Blockgröße verwenden. Tatsächlich verwendet GNU cp aus diesem Grund eine Standardblockgröße von 64 KB.

tl; dr: cp /dev/dvd foobar.iso sollte gut funktionieren. Die Standardblockgröße für ddist 512. Der einzige Effekt, den Sie wahrscheinlich in den meisten modernen Situationen erzielen, besteht darin, den Kopiervorgang zu verlangsamen.

Random832
quelle
es könnte sich geändert haben, trotzdem verwendet GNU cp standardmäßig eine Blockgröße von 128k (nicht 64k), siehe eklitzke.org/efficient-file-copying-on-linux
apurkrt
5

Das Ändern der Blockgröße ist eine gute Möglichkeit, um zu ändern, wie viel gepuffert oder gleichzeitig gelesen / geschrieben wird.

Bezieht sich nicht wirklich darauf, ob es sich um ein reales Blockgerät oder ein unendliches / virtuelles Gerät handelt. Es geht darum, wie viel Sie im Speicher speichern möchten, bevor Sie ddes ausschreiben. bs=Legt sowohl fest ibs=(wie viele Daten gleichzeitig eingelesen werden) als auch obs=(wie viele Daten gleichzeitig ausgeschrieben werden). Je höher, obs=desto mehr Iterationen ibs=sind erforderlich, bevor Sie über genügend Daten verfügen, um ddmit dem Schreiben an das Ziel zu beginnen.

count=ist auch nicht abhängig von etwas anderem als dem, was Sie tun möchten. Es steuert, wie viele "Blöcke" (gemessen an ibs=) erforderlich sind, um dddie Aufgabe als erledigt zu betrachten.

Bratchley
quelle
Beachten Sie Stephens Standpunkt dd, Teilblöcke zu kopieren - das ist nicht immer so bs * count.
Drav Sloan
Beachten Sie, dass Sie auf einigen Unix-Systemen ein Vielfaches der nativen Blockgröße lesen müssen . ddohne bs=2048oder ein Vielfaches davon würde ein Fehler beim Lesen von einem Blockgerät-CD-ROM-Laufwerk auftreten.
Wurtel
2

Durch die Verwendung der Option blocksize on wird ddeffektiv festgelegt, wie viele Daten vom Eingabe-E / A-Subsystem in den Speicher kopiert werden, bevor versucht wird, in das Ausgabe-E / A-Subsystem zurückzuschreiben. Die Ausgabe ist dieselbe (während die gesamte Festplatte kopiert wird), die Chunks werden nur mit der von Ihnen angegebenen Größe gelesen (die meisten ddImplementierungen verwenden eine Standardblockgröße von 512 Byte).

Wenn Sie über viel freien Speicher verfügen und die Blockgröße erhöhen, können mehr größere Datenblöcke nacheinander gelesen, gepuffert und an das Ausgabeziel übertragen werden. Eine geringere Blockgröße erfordert mehr Overhead in Bezug auf jeden einzelnen Suchvorgang, Memset usw.

Ihre Laufleistung kann variieren, je nachdem, wo Sie if=und of=eingestellt sind und welche Hardware Sie durchlaufen, wenn Sie wenig Arbeitsspeicher haben und so weiter.

Drav Sloan
quelle
1

Das bs = repräsentiert die zu lesende oder zu schreibende Blockgröße. Wenn Sie das Feld intakt lassen oder es nicht angeben, wird es möglicherweise genauso kopiert, aber die Verwendung ist verborgen. Beispielsweise,

  • Mit 1000000000000000 Dateien mit jeweils nur 1 ~ 10 kb.
  • Eine einzige Datei für 10 GB haben

Im ersten Fall wurde festgestellt, dass die Verwendung einer geringeren Blockgröße die Kopiergeschwindigkeit erhöht. In letzterem Fall war eine höhere Blockgröße die bessere Option, da sie die Sektorgröße vergrößert und weniger sector changeBefehle zurücklässt, was normalerweise zu schnelleren E / A-Vorgängen führt.

Snazzy Sanoj
quelle