Kürzlich musste ich ein Image von einer SD-Karte erstellen und diese dann auf andere SD-Karten kopieren. Um dies zu bewerkstelligen, benutzte ich das Unix-Bordmittel “dd”.
Beim kopieren des Images auf eine leere SD-Karte ist mir aufgefallen, dass die Schreibgeschwindigkeit bei knapp 1MB/s lag, dies macht für die 8GB ca. 136min. Da dies viel zu langsam ist, habe ich mich mal mit dem Problem beschäftigt und mit der Blocksize von dd herumgespielt. Mit dem Parameter bs=4m (Linux: bs=4M) kann man die Default-Blocksize von 512kB auf 4MB setzen.
Bevor man das Kopieren starten kann, muss man den Datenträger jedoch unmouten:
diskutil list /dev/disk2 #: TYPE NAME SIZE IDENTIFIER 0: FDisk_partition_scheme *8.0 GB disk2 diskutil unmountDisk /dev/disk2 Unmount of all volumes on disk2 was successful
Danach kann der Kopiervorgang gestartet werden:
dd if=test.img of=/dev/disk2 bs=4m 15661056+0 records in 15661056+0 records out 8018460672 bytes transferred in 8318.960235 secs (963878 bytes/sec)
Dies hat jedoch nicht viel genützt, damit lag ich immernoch unter einem MB/s.
Nach weiterer Suche im Internet habe ich folgendes gefunden: OSX hat für dieselben Datenträger jeweils zwei Einträge in /dev/, hier ein Beispiel:
1. /dev/disk2
2. /dev/rdisk2
Kurz und knapp erklärt ist /dev/disk2 durch einen Buffer des OS angebunden (Blockorientiert), hingegen ist /dev/rdisk2 ein “raw” Laufwerk und direkt ohne Umweg angebunden (Zeichenorientiert). Dies führt zu weniger “overhead” und ist damit auch schneller. (Wiki)
Ein erneuter Test mit dd if=test.img of=/dev/rdisk2 bs=4m hat folgendes Resultat erbracht:
dd if=test.img of=/dev/rdisk2 bs=4m 1911+1 records in 1911+1 records out 8018460672 bytes transferred in 588.066864 secs (13635287 bytes/sec)
13MB/s Durchsatz. Damit habe ich meine 8GB in ein bisschen mehr als 10min kopiert. Einiges besser oder?
Mit pv sieht man dann auch noch den Status und die Durchsatzrate (sudo port install pv).
sudo dd if=test.img | pv | sudo dd of=/dev/rdisk2 bs=4m 280MiB 0:00:31 [12,94MiB/s]
aktueller status: strg+t
Ja, wenn du nicht wie im Beispiel ‘pv’ verwenden willst, ist es möglich mit strg+t den Status anzuzeigen. Danke für den Hinweis.