kpartx: Partition im Loop Device

22. Mai 2009 at 10:00

Ein normales Image einer Partition kann mit losetup zum Loop-Device gemacht werden und so über /dev/loopX als Gerät angesprochen und z.B. gemountet werden. Schwieriger wird es jedoch, wenn das Loop-Device eine komplette Platte inklusive Partitionen enthält.

Ein einfaches Beispiel: Ein mit „dd if=/dev/sda of=/imagefile“ erstelltes Image kann zwar mit losetup zu /dev/loop0 gemacht werden, jedoch ist ein direktes Ansprechen der Partitionen, die ehemals auf /dev/sda existierten, nicht möglich. Dazu müßte es ja ein /dev/loop0_1, /dev/loop0_2 oder /dev/loop0_3 geben.

Gut, möglich ist es schon, denn losetup kann mit –offset auch nur Teile der Image-Datei als Loop-Device nutzen, nur müßte man so auf’s Byte genau die Partitionen finden, wobei ein Irrtum möglicherweise die Daten vernichten würde.

Diese Aufgabe löst kpartx. Der Einsatz ist ganz einfach: Installieren und loslegen.

apt-get install kpartx
kpartx -av /imagefile
oder
kpartx -av /dev/loop0

Schon stehen unter /dev/mapper je Partition ein Loop-Device zur Verfügung, also zum Beispiel:

  • /dev/mapper/loop0p1 (ehemals /dev/sda1)
  • /dev/mapper/loop0p2 (ehemals /dev/sda2)
  • /dev/mapper/loop0p3 (ehemals /dev/sda3)

Der Parameter -a steht für add, das v dagegen für verbose, so dass ich gleich sehe, was er mir angelegt hat. Mit dem Parameter -l zeigt man die Mappings an, mit -d löscht man sie wieder.

Typischer Anwendungszweck:

Mit losetup kam ich noch gut klar. Als ich jedoch das erste mal ein Image erstellt habe und darin eine virtuelles Debian von einer virtuellen CD (.ISO-Datei) installierte, hat mir dieses in der Image-Datei mehrere Partitionen angelegt. Hier war kpartx meine Rettung, denn so konnte ich noch auf die Daten im Image-File zugreifen.

Loop Device Setup

14. Mai 2009 at 10:00

Mit einem Loop-Device kann man unter Linux nette Dinge machen: Man kann Dateien wie ein Gerät, z.B. eine Festplatte oder eine Partition (also ein Block Device) behandeln.

Normalerweise besteht eine Festplatte aus mehreren Partitionen. Diese werden uns dank udev im /dev Verzeichnis angezeigt und lassen sich mit Ihrem Namen /dev/sda1, /dev/sda2, … ansprechen.

Was aber, wenn nur ein Dump einer Partition in Form einer Datei vorliegt? Zum Beispiel wenn jemand eine komplette Kopie mit „dd if=/dev/sda3 of=/file“ erstellt hat. Hier hilft losetup.

Um eine Datei als sog. Loop-Device zu benutzen, muss es – sofern nicht schon vorhanden – erstmal erstellt werden:

dd if=/dev/zero of=/home/test bs=1M count=1k

Damit erstellen wir eine Datei mit eine Größe von 1 GB (1000 Blöcke [1k] zu je 1MB). Diese wird nun eingebunden.

losetup -f /home/test

Mit ‚losetup  -a‘ läßt sich jetzt herausfinden, welchen Gerätenamen unser Gerät nun erhalten hat, üblicherweise wird dies beim ersten Versuch /dev/loop0 sein. Man hätte übrigens mit ‚losetup -f‘ auch vorher schon nachsehen können, welches der nächste freie Gerätename ist – für Scripte ist dieser Weg wohl einfacher.

So, nun können wir /dev/loop0 benutzen wie eine normale Partition, z.B. so:

mkfs.ext3 /dev/loop0
mount /dev/loop0 /mnt
df -h /mnt

Nach dem entmounten läßt sich das Loop Device auch wieder entfernen:

umount /dev/loop0
losetup -d /dev/loop0

Damit ist unsere Datei auch wieder nur eine Datei.

Mit dem Parameter -e läßt sich übrigens auch ein verschlüsseltes Loop-Device erzeugen (z.B. losetup -e des -f file, siehe Manpage, doch nutze ich hier lieber LUKS, das in Kürze in einem Artikel erklärt wird.