Sat, 30 Aug 2014 00:00:00 +0200
kpartx, linux, mount, sysadmin, troubleshoot

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.