/dev/rdisk vs. /dev/disk unter macOS

Unter macOS werden Festplatten, SD-Karten und ähnliches im Dateisystem unter /dev/ als Gerätedateien eingebunden. Für eine SD-Karte könnte nun beispielhaft das Gerät /dev/disk2 vorhanden sein. Das Gerät ist ebenfalls über /dev/rdisk2 ansprechbar. Obwohl beide Gerätedateien das gleiche physikalische Gerät ansprechen, unterscheiden sie sich. So könnte ein Image mittels dd auf das Gerät geschrieben werden:

dd bs=1m if=filename.img of=/dev/rdisk2

Der Prozess ist nach relativ kurzer Zeit abgeschlossen. Wird die Operation nun mit dem Gerät /dev/disk2 durchgeführt:

dd bs=1m if=filename.img of=/dev/disk2

so verlängert sich die Dauer der Operation um ein Vielfaches. Hintergrund hierfür ist die technische Anbindung der jeweiligen Gerätedateien. Die Datei /dev/rdisk2/ ist näher an dem physikalischen Gerät, so das Änderungen direkt durchgeführt werden. Aus Sicht von Programmen, welche nicht im Kontext des Kernels laufen, ist der Zugriff auf /dev/disk gepuffert. Wird auf diese Gerätedatei geschrieben, so wird der Datenstrom in 4 KiB große Blocke heruntergebrochen, im Puffer gespeichert und erst dann (oder später) geschrieben bzw. gelesen. Wird hingegen /dev/rdisk2 genutzt, so wird der Datenstrom relativ direkt auf das Gerät geschrieben. Dies wirkt sich positiv auf die Geschwindigkeit aus und ist z.B. beim Schreiben von Images auf einen Datenträger von Vorteil.

Image vom internen Speicher eines gerooteten Androidgerätes erstellen

Wenn man ein Android-Gerät gerootet hat, sind mit diesem einige Dinge möglich welche vorher nicht machbar waren. Unter anderem kann man den internen Speicher eines solchen Gerätes dumpen, das bedeutet ihn Bit für Bit in eine Image-Datei schreiben. Dazu verbindet man das gerootete Gerät mit dem Rechner und öffnet die ADB-Shell. ADB steht dabei für die Android Debug Bridge und befindet sich in den Plattform Tools des Android SDKs:

./adb remount
./adb shell

Kann die Verbindung nicht hergestellt werden, weil der ADB-Server bereits läuft, hilft es diesen vorher noch einmal zu beenden:

./adb kill-server

In der ADB-Shell gibt man nun su ein damit man auf der Root-Konsole landet. Anschließend kann man das Blockgerät welches für den internen Speicher steht auf die eingelegte SD-Karte schreiben. Dies geschieht dabei mit Hilfe des Befehls dd:

dd if=/dev/block/mmcblk0 of=/storage/extSdCard/imageInternalStorage.img

Probleme bekommt man bei diesem Prozess wenn das Image größer als 4 GiB ist. Da die SD-Karten meist standardmäßig mittels FAT32 formatiert sind, erlauben sie keine Dateien größer 4 GiB. Abhilfe schafft es hier die SD-Karte mit dem Dateisystem ext3 zu formatieren. Dieses kann von Android genutzt werden und erlaubt größere Dateien. Unter Umständen muss das ext3-Dateisystem dabei nochmals neu mit Schreibrechten eingebunden werden:

mount -t ext3 /dev/block/mmcblk1p1 /storage/extSdCard

Anschließend sollte das Image ohne Probleme geschrieben werden können. Je nach Größe und Geschwindigkeit der SD-Karte, kann der Prozess dabei einige Zeit in Anspruch nehmen. Nach der erfolgreichen Operation meldet dd-Vollzug und zeigt einige Statistiken zum Prozess an. Das Image kann nun von der SD-Karte auf den Rechner kopiert werden und dort z.B. dem FTK Imager gemountet und analysiert werden.

Festplatte mit dd löschen

Mit Hilfe des Befehls dd ist es unter Linux und vielen anderen unixoiden Systemen möglich, eine Festplatte mit Nullen zu überschreiben. Ist die Festplatte dabei z.B. als sda im System registriert, so funktioniert das Überschreiben mit folgendem Befehl:

dd if=/dev/zero of=/dev/sda

Je nach Festplattengröße kann der Vorgang dabei durchaus einige Stunden in Anspruch nehmen.

Images unter Linux anlegen und nutzen

Unter Linux ist es ohne Probleme möglich ein Image zu mounten. In diesem Fall soll ein leeres Image erstellt werden und anschließend eingebunden werden. Erstellt wird das Image unter Zuhilfenahme von „dd“:

dd if=/dev/zero of=image.img bs=1024000 count=1000

Das in diesem Fall erstellte 1 GiB große Image ist mit Nullen gefüllt. Mittels:

mkfs.ext4 image.img

wird das Image mit einem ext4 Dateisystem versehen. Dies ist notwendig um es anschließend einzubinden. Bewerkstelligt wird das durch den Befehl „mount“:

mount -o loop /home/seeseekey/image.img /home/seeseekey/ImageMountpoint/

Nach dem erfolgreichen Einbinden kann das Image genutzt werden.

Image unter Mac OS X auf eine SD Karte spielen

Möchte man unter Mac OS X eine Imagedatei auf eine SD-Karte zu spielen, benötigt man „dd“ und „diskutil“. Um her­aus­zu­fin­den, wel­ches Volume geflasht wer­den muss, kann man sich auf dem Ter­mi­nal unter Mac OS X mit­tels „df -h“ anschauen wel­ches Gerät beim Anstecken der SD-Karte dazu­kommt. Eine andere Mög­lich­keit ist es die Karte über den Namen zu iden­ti­fi­zie­ren, wel­cher bei neuen Kar­ten meist „NO NAME“ oder „Untit­led“ sein sollte. Wenn das pas­sende Gerät iden­ti­fi­ziert wurde, sollte die gemoun­tete Par­tion mittels:

diskutil unmount /dev/disk2s1

wie­der frei­ge­ge­ben wer­den. Nun wech­selt man im Ter­mi­nal in den Ord­ner in wel­chem die Image­da­tei liegt und gibt dabei fol­gen­des ein:

sudo dd bs=1m if=filename.img of=/dev/rdisk2

Zu beach­ten ist dabei das aus „disk2s1“ -> „rdisk2“ wird, womit das Gerät direkt ange­spro­chen wird. Theo­re­tisch würde auch „disk2“ funk­tio­nie­ren, aller­dings geht die Über­tra­gungs­ge­schwin­digk­eit hier­bei dras­tisch in den Kel­ler. Nach dem Flas­hen der Karte wird das Gerät mittels:

diskutil eject /dev/rdisk2

aus­ge­wor­fen und kann nun für den gewünschten Zweck genutzt werden.