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
: dd
Kann partielle Blöcke kopieren, so dass count
sie 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 * count
Bytes kopiert werden, es sei denn, Sie geben dies an iflag=fullblock
.
Die Standardblockgröße für dd beträgt 512 Byte. count
ist 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 dd
jedoch, 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-rescue
tun dies automatisch: Sie lesen zunächst große Blöcke, aber wenn ein Block ausfällt, lesen sie ihn mit kleineren Blockgrößen erneut. dd
wird dies nicht tun, es wird nur den ganzen Block versagen.
dd bs=4m iflag=fullblock
vs auf eine SD-Karte,dd bs=1111
und 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 vonfullblock
ist übrigens nicht zu unterschätzen, da es sich ohne esbs
nur um ein Maximum handelt und partielle Lesevorgänge zu anhaltenden nachträglichen Fehlausrichtungen führen könnten.Es gibt einen Ladungskult
dd
. Ursprünglich gab es zwei Fehlercp
, 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ürdd
ist 512. Der einzige Effekt, den Sie wahrscheinlich in den meisten modernen Situationen erzielen, besteht darin, den Kopiervorgang zu verlangsamen.quelle
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
dd
es ausschreiben.bs=
Legt sowohl festibs=
(wie viele Daten gleichzeitig eingelesen werden) als auchobs=
(wie viele Daten gleichzeitig ausgeschrieben werden). Je höher,obs=
desto mehr Iterationenibs=
sind erforderlich, bevor Sie über genügend Daten verfügen, umdd
mit 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 anibs=
) erforderlich sind, umdd
die Aufgabe als erledigt zu betrachten.quelle
dd
, Teilblöcke zu kopieren - das ist nicht immer sobs * count
.dd
ohnebs=2048
oder ein Vielfaches davon würde ein Fehler beim Lesen von einem Blockgerät-CD-ROM-Laufwerk auftreten.Durch die Verwendung der Option blocksize on wird
dd
effektiv 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 meistendd
Implementierungen 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=
undof=
eingestellt sind und welche Hardware Sie durchlaufen, wenn Sie wenig Arbeitsspeicher haben und so weiter.quelle
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,
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 change
Befehle zurücklässt, was normalerweise zu schnelleren E / A-Vorgängen führt.quelle