Hallo,

in der folgenden Artikelreihe wird es darum gehen auf einem Hostsystem mehrere virtuelle Maschinen mittels KVM und der Administrationsschnittstelle LibVirt auf einem Linux Host (hier Debian Wheezy) zu erstellen.

Inhalt

Installation der Komponenten

Mein Setup geht davon aus, dass jede VM ein LogicalVolume als HDD zugewiesen bekommt, da ich mir davon mehr Performance verspreche als bei einem herkömmlichen Diskfile, da hier ein Dateisystemlayer auf dem Host wegfällt.

Somit sind die zu installierenden Komponenten:

  • libvirt-bin - LibVirt
  • kvm - KVM
  • lvm2 - LVM (Optional, wenn LVM gewünscht ist)
Auf der Shell wird also als root folgender Befehl ausgeführt:
aptitude install libvirt-bin kvm lvm2

Vorbereitungen

Nach der Installation der benötigten Komponenten müssen nun ein paar Vorbereitungen getroffen werden. Je nachdem welche Art Festplatte man für die VMs zur Verfügung stellen möchte muss man eine der beiden Schritte ausführen:

Einrichten des LVMs

Wählt man so wie ich die LVM-Methode muss man zunächst eine VolumeGroup erstellen und ein Volume für die VM anlegen. Hierzu wird (mindestens) eine leere Partition auf der Festplatte benötigt. In meinem Fall ist dies das Raid-Array md3. Zuerst müssen wir also /dev/md3 als physikalisches LVM-Volume markieren, dies tun wir mit:
pvcreate /dev/md3
Nun können wir /dev/md3 mit lvm verwenden. Als nächstes müssen wir eine VolumeGroup erstellen (eine Gruppe von ein oder mehreren physikalischen Volumes, die zusammen einen Container für logische Volumes bilden). Dies geschieht mittels:
vgcreate KVM /dev/md3
Wie man erkennen kann, habe ich unsere VolumeGroup treffender Weise KVM genannt. Möchte man mehrere physikalische Volumes verwenden, werden diese einfach an den Befehl angehängt.

Zuletzt wird dann noch ein logisches Volume für unsere VM erstellt. Dies geht ganz einfach mit:

lvcreate -nName -LSize 
In meinem Fall also:
lvcreate -nmeinevm.disk -L10G KVM
Hiermit habe ich das Volume /dev/KVM/meinevm.disk mit einer Größe von 10 GB erstellt. An diesem Punkt können wir mit der erstellung eines Netzwerkinterfaces fortfahren.

Erstellen eined Diskfiles

Wer anstelle eines LVMs nur ein Diskfile erstellen möchte kann dies mittels “dd” tun. Bedenken muss man hierbei nur, dass der Benutzer “libvirt-qemu” Lese- und Schreibrechte für diese Datei haben muss. Am besten erstellt man ein eigenes Verzeichnis, in welchen nur die Diskfiles enthalten sind, z.B. /kvm-disks. Kommen wir nun zum eigentlichen Teil, nämlich dem Erstellen der Disk. Dies geht mit “dd” sehr leicht indem man folgenden Befehl ausführt:
dd if=/dev/zero of=/kvm-disks/meinevm.disk bs=1M count=10240
Hiermit sollten wir nun eine ca. 10 GB große Datei mit dem Namen meinevm.disk im Ordner /kvm-disks erstellt haben. Möchte man eine andere Diskgröße erstellen, passt man einfach den Wert bei count= an (count gibt in diesem Fall die Größe in MB an). Wie eingangs erwähnt muss der Benutzer libvirt-qemu Lese- und Schreibrechte auf /kvm-disks/meinevm.disk haben. Die kann einfach erreicht werden, indem man Ihn zum Besitzer der Datei macht:
chown libvirt-qemu /kvm-disks/meinevm.disk
Und schon sind wir mit dem Erstellen einer Festplatte für unsere VM fertig.  

Netzwerkinterface für die VM

Für virtuelle Netzwerkinterface der VM habe ich mich entschieden ein tap-Device zu nehmen. Warum ich mich dafür entschieden habe, werde ich in Teil 2 dieser Artikelreihe näher erläutern. Um ein tap-Device zu erstellen kann man OpenVPN zur Hilfe nehmen. Dies bedeutet allerdings auch, dass wir zuerst OpenVPN installieren müssen. Das ist jedoch nicht sonderlich schwer:
aptitude install openvpn
Nach der Installation von OpenVPN können wir damit ein tap-Device erstellen. Ich nenne das Device hier einfach mal tap1:
openvpn –mktun –dev tap1
Anschließend sollten wir das tap-Device noch hochfahren (wir weisen ihm hierbei allerdings noch keine IP-Adresse zu):
ifconfig tap1 0.0.0.0

 

Konfigurieren von LibVirt

Wer, so wie ich, vorher bereits mit KVM oder Qemu herum gespielt hat, den wird es sicher freuen zu hören, dass es ein Wrapper-Script gibt, mit dem man einen KVM/Qemu Startbefehl in eine LibVirt XML konvertieren kann. Mehr dazu ist hier zu finden.   Generell ist es empfehlenswert, sich erstmal mit KVM oder Qemu seine Wunschmaschine zusammen zu basteln und diese hinterher mittels des Wrapperscriptes zu migrieren, wenn man sich nicht durch die komplette Dokumentation von LibVirt lesen möchte.   Wer selbst dazu keine Zeit hat, kann sich folgendes Beispiel nehmen:

<domain type='kvm'>
  <name>beispiel</name> <!-- Name der VM  -->
  <memory>3600000</memory> <!-- Max Memory in MB -->
  <currentMemory>1024000</currentMemory> <!-- Base Memory in MB -->
  <vcpu>2</vcpu> <!-- number of cpu cores -->
  <os>
    <type arch='x86_64' machine='pc-1.0'>hvm</type>
    <boot dev='hd'/> <!-- boot device -->
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/kvm</emulator>
    <disk type='block' device='disk' cache='none'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/KVM/meinevm.disk'/>  <!-- disk device -->
      <target dev='vda' bus='virtio'/>
    </disk>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/images/debian-6.0.4-amd64-netinst.iso'/> <!-- CD iso -->
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <controller type='ide' index='0'>
    </controller>
    <interface type='ethernet'>
      <target dev='tap1'/> <!-- Netzwerkinterface -->
    </interface>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='5901' autoport='no' listen='10.10.0.1' keymap='de'><!-- VNC dings -->
      <listen type='address' address='10.10.0.1'/>
    </graphics>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
    </video>
    <memballoon model='virtio'>
    </memballoon>
  </devices>
</domain>

Um seine VM bei LibVirt zu registrieren muss man folgenden Befehl ausführen:

virsh define /path/to/vm.xml

Wichtig, ist die VM erst einmal bei LibVirt registriert werden alle Änderungen an der xml-Datei ignoriert. Möchte man seine VM bearbeiten muss man hierzu virsh edit ausführen, also z.B.:

virsh edit meinevm
Wobei “meinevm” der name ist, welcher unter dem Schlüssel “name” in der XML eingetragen worden ist.

Testen der VM

Um einen Teilerfolg sichtbar zu machen, können wir nun einmal testen, ob das, was wir bisher eingerichtet haben schon funktioniert. Hierzu können wir dem interface tap1 einmal spontan die IP 172.16.0.1 /24 geben.
ifconfig tap1 172.16.0.1 /24
Anschließend laden wir ein knoppix-Image herunter und legen dies in das CD-Laufwerk unserer VM ein.
virsh edit meinevm
Und darin den disk-Block für das Device “cdrom” bearbeiten. Nachdem das ISO eingelegt ist starten wir unsere VM:
virsh start meinevm
Zum schluss verbinden wir uns per VNC auf die im graphics-Block eingestellte Adresse und richten in dem gebooteten Knoppix die IP 172.16.0.2 /24 ein. Wenn wir jetzt innerhalb des Knoppix die 172.16.0.1 pingen können haben wir eine funktionstüchtige VM und können uns nun mit der Einrichtung eines richtigen Netzwerkzugangs beschäftigen. Siehe dazu Teil 2 der Artikelreihe.