Wenn ich weiß, dass die Hardware eigentlich deutlich mehr hergeben sollte, gehört Geduld nicht unbedingt zu meinen großen Stärken.

Konkret bestand die Aufgabe darin, eine Raspbian-Installation von einer SD-Karte auf zwei andere zu transferieren. Da mein Mac nur (oder immerhin noch) einen SD-Kartenslot hat und kein externer Kartenleser zur Verfügung stand, musste der Umweg über das Ziehen eines Images von der Originalkarte und anschließendes Schreiben desselbigen auf die neuen Karten her. Das altbekannte dd ist hierfür das perfekte Werkzeug.

Vorher wird die Karte aber erst mal ausgehängt. In meinem Fall ist das /dev/disk2:

diskutil umountDisk /dev/disk2

Dann geht es mit dd weiter:

dd if=/dev/disk2 of=Image.dd

Da dd von Haus aus keine Fortschrittsanzeige mitbringt, kann man sich unter anderem durch Drücken von “CTRL+t” einen Zwischenstand ausgeben lassen. Die Ausgabe umfasst die aktuelle Systemlast, den Namen und die PID des aktuell im Vordergrund laufenden Prozesses, sowie seine Kernel- und User-Zeiten und im Falle von dd eben auch den aktuellen Fortschritt.

Das sieht dann zum Beispiel so aus:

load: 1.69 cmd: dd 69334 uninterruptible 0.00u 1.97s
13+0 records in
13+0 records out
109051904 bytes transferred in 17.182351 secs (6346739 bytes/sec)

Circa 6 MB/s von einer Class10-SD-Karte? Das muss doch schneller gehen.

Aus der Linuxwelt kommend versuchte ich also als Erstes, per Angabe der Blockgröße (bs=8M) mehr Durchsatz zu erzwingen. Der Lerneffekt hierbei war, dass die BSD-Version von dd unter Mac OS X die Angabe der Einheit nur kleingeschrieben schluckt. Also:

dd if=/dev/disk2 of=raspiImage.dd bs=8m

Damit änderte sich am Tempo aber so gut wie nichts. Bei einer zum Vergleich hergenommenen Class6-Karte macht der Parameter aber doch einen wesentlichen Unterschied. Also wird er beibehalten und fix noch mal das globale Wissen angezapft,  wo sich der Tip findet, anstelle von /dev/diskX doch besser /dev/rdiskX zu verwenden.

dd if=/dev/rdisk2 of=test.dd bs=8m

Kontrolle mit CTRL+t:

load: 1.77  cmd: dd 70036 uninterruptible 0.00u 7.38s
886+0 records in
886+0 records out
7432306688 bytes transferred in 166.815176 secs (44554140 bytes/sec)

Etwas mehr als 42 MB/s. Das ist schon eher die Antwort, die ich suchte 😉

Da das häufige Drücken von CTRL+t und anschließende Umrechnen der Byteangaben in eine menschenverständliche grobe Abschätzung der zu erwartenden Dauer eine Sache ist, die der Computer viel besser und schneller machen kann, bietet sich hierfür das Kommando “pv” an.
Zum Lesen von einer Karte (-s 16g an die Größe der Karte anpassen):

dd if=/dev/rdisk2 bs=8m | pv -petra -s 16g > Image.dd

Um das Image auf eine Karte zurückzuschreiben:

pv -tpreb Image.dd | dd of=/dev/rdisk2 bs=8m

Natürlich gelten die hier gemachten Vorschläge nicht nur für SD-Karten und gegebenenfalls mit Abwandlungen auch für Linuxer 🙂

Quellen:

Solution: dd too slow on Mac OS X

Progress while copying an img file to/from an SD card with OSX/Linux

http://hints.macworld.com/article.php?story=20110810112318227

Cornelius Wachinger

Autor: Cornelius Wachinger

Cornelius ist für uns als Teil des Managed Service-Teams, mit der Mission unsere Kunden glücklich zu machen, bei uns. In seiner Freizeit ist er eher musikalisch unterwegs: Als Gitarrist einer Metalband und Spross eines Clans von Musikussen, kann er von gelungener musikalischer Früherziehung ein ganzes Medley singen. Wenn er nicht gerade Konzertsäle beschallt oder in Nürnberg für unsere Kunden zwei offene Ohren hat, verausgabt er sich sportlich beim Radfahren, Bouldern, Bergsteigen und beim Yoga. Die Erzeugnisse seiner heimischen Brot- und Muffinmanufaktur stehen, aufgrund ihres Suchtpotenzials, schon lange auf der Liste der verbotenen Substanzen.