Erstellen eines Image aus einem ISO (KVM)

Dieser Artikel beschreibt, wie mittels KVM und dem ISO Image eines Gast Betriebssystems das installiert werden soll, ein Root Dateiystem für Eucalyptus erstellt wird.

Voraussetzung

  • Funktionsfähige KVM Umgebung
  • Hardware Virtualisierung Unterstützung auf dem System (Hardware-assisted virtualization) ist empfehlenswert, da qemu genutzt werden sollte.


Zunächst muss ein ISO Image einer Distribution (Gastbetriebssystem), das installiert werden soll, vorhanden sein. Anschließend wird eine virtuelle Festplatte (virtual disk) z.B. mit der Größe von 4GB erstellt.

dd if=/dev/zero of=new.img bs=1M count=4096

Nun wird KVM gestartet, indem das CDROM als boot device und new.img als Festplatte verwendet wird.

kvm -cdrom iso_image -drive if=scsi,file=new.img,boot=off

Achtung!!! Es wird ein SCSI-Bus benötigt, da Eucalyptus (AWS) erwartet, dass sich die Festplatte unter /dev/sda befindet.

Nun kann die Distribution wie gewöhnlich installiert werden. Dabei sollte darauf geachtet werden, das kein lvm oder md benutzt wird und die Installation innerhalb einer einzigen Partition erfolgt. Zudem sollte man sich merken, in welcher Partition die Distribution installiert wurde.

Achtung!!! Einige Distributionen merken sich die Netzwerkschnittstelle anhand der MAC Adresse. Somit ist die Schnittstelle immer dieselbe. Innerhalb von Eucalyptus muss die Distribution dazu bewegt werden, dass sie die Netzwerkschnittstelle "vergisst", damit jede Instanz die Schnittstelle als die primäre Schnittstelle erkennt.

Im Falle von Debian / Ubuntu kann das unter /etc/udev/rules.d/*net* erfolgen. Im Falle von CentOS unter /etc/network-scripts/ifcfg-eth0. Sollten die Anpassungen nicht erfolgen, wird die Instanz keinen Netzwerkzugriff erhalten.

Nun müssen wir den Startblock und die Blockgröße des Root-Dateisystems identifizieren. Das kann mittels parted erfolgen.

parted new.img

Parted muss nun so konfiguriert werden, dass es die Blockgröße als Einheit verwendet. Erst "U" dann "b" drücken. (Damit wird die Einheit auf Blocks umgestellt.)

(parted) u
Unit? [compact]? b

Mit "p" kann die aktuelle Partitionstabelle ausgegeben werden.

Wir notieren uns den Startpunkt und die Größe der entsprechenden Partition. Für unser Beispiel nehmen wir an, dass sich der Startpunkt bei 32256 befindet und es sich bei der Größe um 1024000 handelt.

Nun extrahieren wir das Dateisystem.

dd if=new.img of=rootfs.img bs=1 skip=32256 count=1024000

Achtung!!! Um den Vorgang zu beschleunigen kann die Blockgröße z.B. auf 512 erhöht werden. Wir teilen die Partitionsgröße (count) und den Startpunkt (skip) jeweils durch die neue Blockgröße (in diesem Fall 512) und erhalten folgendes Kommando.

dd if=new.img of=rootfs.img bs=512 skip=63 count=2000

Damit haben wir das Image 'rootfs.img' erhalten, welches das Root Dateisystem beinhaltet. Es sollte nun noch sichergestellt sein, dass dieses kompatibel zu dem verwendeten Kernel und der initrd innerhalb der Cloud Umgebung ist.

Quelle