Dann liest und schreibt dd immer 1MB "am Stück", andernfalls nur sehr kleine Blöcke (512 Byte, also ein Sektor). Und viele kleine Blöcke dauern länger als wenige große.
Warum dann nur 1MB und nicht z.B. 10MB oder 100MB das wäre doch dann noch schneller.
So simpel ist das nicht.
Ich versuche mal eine sehr volkstümliche Erklärung.
Der Festplattencontroller (Bei Spartcards und USB-Sticks findet das [teilweise] nur woanders statt) will die Daten blockweise schreiben. Diese Blöcke haben eine feste Größe, welche von den Chips auf der Platte und deren Firmware abhängt.
Kommen jetzt die Daten in Blöcken, die zu groß sind, dann muss er diese aufteilen, hat also damit Arbeit. Kommen die Daten in Blöcken, die zu klein sind, dann trifft das ebenfalls zu, denn er muss entweder auf den oder die nächsten Blöcke warten und die Daten zusammenfügen oder diesen auffüllen (Dateiende). Der Worst Case ist, wenn die logische Blockgröße des Mediums mit der, die gesendet wird überhaupt nicht in Übereinstimmung zu bringen ist, so dass die Blöcke geteilt und zusammengefügt werden müssen. Ideal sind also Blockgrößen, die der Controller ohne weitere als unbedingt notwendige Aktionen verarbeiten kann.
dd* verwendet per Default mit 512Bytes, das ist der "kleinste gemeinsame Nenner" und vermeidet das Teilen der Blöcke.
Welche Blockgröße die richtige ist hängt insbesondere von dem Gerät ab, welches zu beschreiben ist (Ausnahme ist natürlich wenn man z.B. genau 446 Bytes lesen will). Außerdem kann es derzeit als gesetzt gelten, dass eine der folgende Blockgrößen Verwendung findet:
512, 1024, 2048, 4096, 8192, 16384, 32768 (also immer das Doppelte)
Faustregel: Größere und modernere Platten haben größere Blockgrößen. Am einfachsten probiert man das, in dem man sich mit
dd if=/dev/urandom of=bigfile bs=1024 count=102400
auf einem ausreichend schnellem Dateisystem eine große Datei anlegt, diese dann mit dd* auf das Gerät kopiert und mal schaut, wie lange das dauert. Es werden hierfür Zufallsdaten benutzt.
Beispiele: (Werte bei anderen Konstellationen werden sehr(!) stark(!) abweichen)
dd if=bigfile of=outfile bs=512
204800+0 Datensätze ein
204800+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 6,58058 s, 15,9 MB/s
dd if=bigfile of=outfile bs=1024
102400+0 Datensätze ein
102400+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 3,37245 s, 31,1 MB/s
dd if=bigfile of=outfile bs=2048
51200+0 Datensätze ein
51200+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 1,77845 s, 59,0 MB/s
dd if=bigfile of=outfile bs=4096
25600+0 Datensätze ein
25600+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 0,963437 s, 109 MB/s
dd if=bigfile of=outfile bs=8192
12800+0 Datensätze ein
12800+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 0,936332 s, 112 MB/s
dd if=bigfile of=outfile bs=16384
6400+0 Datensätze ein
6400+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 0,928353 s, 113 MB/s
dd if=bigfile of=outfile bs=32768
3200+0 Datensätze ein
3200+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 0,913329 s, 115 MB/s ***
dd if=bigfile of=outfile bs=65536
1600+0 Datensätze ein
1600+0 Datensätze aus
104857600 Bytes (105 MB) kopiert, 0,910148 s, 115 MB/s
rm bigfile outfile
Der Gewinner ist die Blockgröße ab welcher der Datendurchsatz nicht mehr ansteigt oder sogar abfällt. Hier also 32768 Bytes. Zu beachten ist, ich bei den Tests zweimal in das gleiche Dateisystem geschrieben habe und das die Datei hierbei auch ent- und und vor allem verschlüsselt wurde. Und dass der Dateisystem-eigene Cache wirkte. Die Aussage ist also nicht allgemeingültig.
Dennoch ein Tipp: Bei modernen Platten würde ich mit einer Blockgröße von 8192 Byte testen, dann halbieren, dann verdoppeln.
Also sollte der Test realitätsnäher stattfinden. Wenn man also nicht eine Datei (in ein Dateisystem) schreibt sondern Rohdaten direkt auf die Platte, dann können diese Werte ebenfalls stark abweichen. Sogar von denen, die gemessen werden wenn auf die gleiche Platte in ein Dateisystem geschrieben wird.
Hat man das vor, dann sollte man das auch o testen. Aber Achtung: dd if=bigfole of=/dev/sda wird, wenn man es mit root-Rechten ausführt, hemmumgslos Partitionen und Daten zerstören...
Man macht das also VOR dem Partitionieren.