Partitionen von Festplattenimages bearbeiten
Hin und wieder will ich auf die Dateien in einem Festplattenimage zugreifen. Dieses kann zum Beispiel von einer virtuellen Maschine stammen, die Probleme beim Start hat, oder es ist das Image einer CF-Karte für einen ALIX-Rechner, das ich modifizieren will, bevor ich es auf eine Karte für ein anderes Gerät schreibe.
In einem älteren Artikel hatte ich beschrieben, wie ich einzelne Partitionen eines Festplattenimages in meinem System einhängen und bearbeiten kann.
Zur Erinnerung, das geht wie folgt.
Offset berechnen und beim Einhängen angeben
Angenommen ich habe ein Festplattenimage in der Datei disk.img und möchte von diesem die zweite Partition bei /tmp/mnt einhängen.
DISK=disk.img
PART=2
DEST=/tmp/mnt
Als erstes bestimme ich den Offset in Festplattensektoren zu je 512 Byte.
Das geht mit parted
:
UNITS=$(parted -s $FILE unit s print 2>/dev/null
| grep " $PART "
| tr -d 's'
| awk '{print $2}')
Oder mit fdisk
:
UNITS=$(fdisk -lu $FILE 2>/dev/null
| grep "$FILE$PART "
| tr -d '*'
| awk '{print $2}')
Um den Offset für mount
herauszubekommen, muss ich $UNITS
noch mit 512
multiplizieren:
OFFSET=$(expr 512 '*' $UNITS)
Mit diesem Offset kann ich die Partition einhängen.
mount -o loop,offset=$OFFSET $FILE $DEST
Der Code ist einem Skript von pixelbeat.org entnommen. Ich kann dieses Skript nehmen, oder die Berechnungen selbst machen und die Partition einhängen, mit der Gefahr, dass ich mich verrechnet habe.
Device Mapper
Einfacher geht es, wenn ich den Device Mapper des Linux Kernels zu Hilfe nehme. Der Device Mapper ist Bestandteil des Kernels seit Version 2.6 und erlaubt die Benutzung virtueller Blockgeräte. Er reicht die Daten der von ihm eingerichteten virtuellen Blockgeräte an ein anderes Blockgerät weiter. Dabei können die Daten auch modifiziert werden.
Der Logical Volume Manager (LVM2), Docker, das Festplattenverschlüsselungssystem dm-crypt, die Multipath-Tools und viele andere Anwendungen nutzen den Device Manager.
kpartx
Das Programm kpartx
als Bestandteil der Multipath-Tools erzeugt mittels des
Device Mappers Zuordnungen für die Partitionen beliebiger partitionierter
Blockgeräte.
Dabei kann ich statt eines Blockgerätes auch ein Abbild in einer Datei
verwenden.
Das geht ganz einfach, mit
kpartx -a $FILE
erzeugt das Programm Einträge für die Partitionen im Verzeichnis
/dev/mapper.
Enthalten die Partitionen Dateisysteme, kann ich sie mit mount
einhängen.
mount /dev/mapper/loop0p$PART $DEST
Dabei ist loop0 der Name des Loop-Device, welches der Device Mapper verwendet, p ist der Trenner auf den die Nummer der Partiton folgt.
Bin ich fertig, dann hänge ich das Dateisystem aus und löse die Zuordnung auf.
umount $DEST
kpartx -d $FILE
Damit habe ich bereits die beiden wichtigsten Optionen von kpartx
genannt.
Neben diesen beiden gibt es noch die Option -l
, mit der kpartx
die
Namen der Blockgeräte auflistet, die es mit -a
erzeugen würde.
Ich verwende immer nur eine der drei Optionen '-a | -d | -l'.
Diese Option kann ich mit den folgenden kombinieren:
- -r, wenn die Partitionen nur lesend verwendet werden sollen.
- -p $irgendwas, wenn ich ein anderes Trennzeichen als
p
haben will. - -g, wenn ich eine GUID Partitionstabelle (GPT) habe.
- -v, wenn ich die Namen der Partitionen beim Anlegen wissen will.
Mehr ist dazu nicht zu sagen, kpartx
ist ein nützliches Werkzeug und erspart
mir das Ausrechnen des Offsets der Partitionen, wenn ich auf ein
Festplattenimage zugreifen will.