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:
Progress while copying an img file to/from an SD card with OSX/Linux
0 Comments