KVM Virtualisierung

Da die XEN Entwickler schon längere Zeit keine Anpassungen für aktuelle Linux Kernel mehr vornehmen, wurde bei Canonical entschieden, in Zukunft auf KVM als Virtualisierungslösung zu setzen. Dem zu Folge ist KVM auch besser in Ubuntu integriert und es ist davon auszugehen, dass in Zukunft XEN eher stiefmütterlich behandelt wird. Höchste Zeit also, sich mit KVM auseinander zu setzen.
Ab Ubuntu 8.10 sind zusätzliche Scripts hinzugekommen, welche die Erstellung und Verwaltung noch einfacher machen. Da ich aber beabsichtige, noch eine Weile auf 8.04 LTS (Hardy) zu setzen, habe ich hier den Weg für Hardy beschrieben. In späteren Versionen sollte das auch klappen, wenn es auch einfachere Wege geben wird.

Vorbereitungen

Um virtuelle Gäste laufen zu lassen, benötigen diese eigene Partitionen. Diese können physikalisch vorhanden sein oder mittels einer Imagedatei zur Verfügung gestellt werden. Wobei die Imagedateien im produktiven Einsatz zu hoher CPU Last führen. Als Zwischenlösung bietet sich LVM an. Mit einer LVM-Partition lassen im laufenden Betrieb virtuelle Partitionen erzeugen, vergrössern oder verkleinern. Damit ist man wesentlich flexibler als mit physikalischen Partitionen.

LVM

Falls mehr als eine Festplatte zur Verfügung steht kann auch noch ein Software RAID als Basis verwendet werden. Zum Thema RAID gibt es einen Artikel in der ct 1/09 Seite 188.

apt-get install lvm2 mdadm

Raidpartitionen müssen dem Typ 0xFD angehören. Mit folgendem Befehl werden 2 Partitionen zu einem Raid0 zusammengefasst.

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sda3 /dev/sdb3

Um LVM verwenden zu können, muss zuerst einmal eine physikalische Partition als ‘Physical Volume’ markiert werden

pvcreate /dev/sda3

Nun erstellen wir eine ‘Volume Group’ mit einem frei definierbaren Namen. So wie ich das sehe, ist dieser Schritt hauptsächlich für die bessere strukturierbarkeit nützlich, aber nötig.

vgcreate kvm /dev/sda3

Jetzt können wir die vom System mountbare Partition erstellen.

lvcreate -n test -L 10G kvm

Falls lvcreate mit der Fehlermeldung “/proc/misc: No entry for device-mapper found” abbricht, dann muss man das device-mapper Modul manuell nachladen. Ab dem nächsten Booten sollte es automatisch geladen werden.

modprobe dm-mod

Damit haben wir jetzt die Partition test in der Volume Group kvm zur Verfügung welche formatiert werden kann. (Das Formatieren ist aber für KVM nicht nötig)

mke2fs -j -L kvm1 /dev/kvm/test

Mit den Befehlen

pvdisplay
vgdisplay
lvdisplay

kann man sich einen Überblick verschaffen. Im Allgemeinen beginnen alle LVM Befehle mit pv,vg oder lv.

LVM rekonstruieren

Nach einem Absturz oder bei einer Neuinstallation kann mit wenigen Befehlen wieder auf ein LVN/Raid zugegriffen werden.
Die nötigen Pakete installieren und Kernelmodul laden:

apt-get install lvm2 mdadm
modprobe dm-mod

Das RAID und die Volumegroup wieder aktivieren:

mdadm --assemble --scan
vgchange -ay

Zur Überprüfung ob alles geklappt hat:

lvm lvscan

Die Logicalvolumes müssen jetzt alle ‘ACTIVE’ sein.

Falls nach einem Neustart das RAID fehlt:

mdadm --assemble /dev/md0 /dev/sdaX /dev/sdbX

So kann das RAID wiedergeholt werden. Es kann sein, dass in der Datei /etc/mdadm/mdadm.conf kein Eintrag existiert. Dann wird das RAID nicht automatisch eingebunden. Darum muss noch ein Eintrag manuell vorgenommen werden:

ARRAY /dev/md0 level=raid0 num-devices=2 UUID=c559ed47:39d882e4:f6bceac6:b15fcc53

Die genauen Angaben müssen natürlich angepasst werden. Um die UUID in Erfahrung zu bringen, benützt man folgenden Befehl:

mdadm --detail --scan

Und nicht wie bei normalen Partitionen mit:

blkid /dev/md0

Nicht vergessen die Datei /etc/default/mdadm zu kontrollieren. Wenn der Daemon nicht läuft, funktioniert das Raid auch nicht.
/etc/default/mdadm

...
AUTOCHECK=true
...
START_DAEMON=true
...

KVM

Für den Umgang mit KVM benötigen wir folgende Zusatzpakete

apt-get install kvm qemu ubuntu-vm-builder libvirt-bin

Netzwerk

Der alte Abschnitt im /etc/network/interfaces

# The primary network interface
auto eth0
iface eth0 inet dhcp

Durch diesen Abschönitt ersetzen:

# The primary network interface
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
      address 192.168.2.99
      netmask 255.255.255.0
      gateway 192.168.2.1
      bridge_ports eth0
#     bridge_fd 9
#     bridge_hello 2
#     bridge_maxage 12
#     bridge_stp off

Bei den ausmarkierten Parameter weiss ich nicht, ob sie überhaupt nötig sind.

Kernel Module

Ob man noch manuell die Kernelmodule nachladen muss oder nicht, habe ich nicht getestet. Falls es zwingend manuell gemacht werden muss, hier die Anleitung:
Intel:

modprobe kvm
modprobe kvm_intel

AMD:

modprobe kvm
modprobe kvm_amd

Damit die Module bei jedem Neustart wieder geladen werden, schreibt man diese noch in die Konfigurationsdatei /etc/modules

...
kvm
kvm_amd

Virtuelle System erstellen

Jetzt können wir unser erstes virtuelles System erstellen. Dazu gibt es verschiedene Wege.

ubuntu-vm-builder

Mit dem ubuntu-vm-builder Script, geht es am einfachsten. Ist aber nur für Ubunutu Systeme verwendbar.

ubuntu-vm-builder kvm hardy --hostname kvm --user=admin --pass=secret --addpkg openssh-server --arch amd64

Über die Manpage kann man die zahlreichen Parameter des Scripts in Erfahrung bringen. User und Passwort sind aber auf jedenfall erforderlich, sonst kann man sich überhaupt nicht anmelden. Damit man sich danach im laufenden System als root anmelden kann muss der User root noch aktiviert und mit Passwort versehen werden

passwd -u root
passwd root

manuell einrichten

Beim manuellen Vorgehen, muss zuerst eine Partition erstellt werden. Entweder physikalisch, mit LVM oder als Image. Bei einem Image hat man die Möglichkeit eine statische oder sich dynamisch anpassende Datei zu erstellen

# Statisch 4GB
dd if=/dev/zero of=disk.img bs=1G count=4
# Dynamisch 10GB
qemu-img create -f qcow2 disk.img 10G

Wobei zu beachten gilt, dass die qcow2 Images nicht mehr mit einem mount Befehl in ein System eingebunden werden können.

Jetzt können wir ein virtuelles System hochfahren und mit der Installation beginnen. Dafür benötigen wir eine Installations-CD oder noch besser ein ISO-Image einer CD:

kvm -hda disk.img -cdrom os.iso -m 512 -boot d -vnc [IP]:1

Dem virtuellen System wird eine Partition und ein “CD-Laufwerk” übergeben. Als weitere Parameter folgen der Speicherplatz und das zu bootende Laufwerk, in diesem Fall das CDROM.
Da bei jeder Installation Eingaben vom Benutzer nötig sind, benötigen wir auch eine Konsole. Dies wird über VNC realisiert. Für die IP gibt man eine erreichbare IP des Hostsystems an. Dann kann man mit einem VNC-Viewer über die Hostadresse und den Port 5901 auf die Konsole zugreifen. Das geht sogar mit einer Windows Installations-CD.

LVM einrichten

KVM unterstützt keine LVM Partitionen. Beziehungsweise, es erzeugt eine eigene Partitionstabelle innerhalb einer physikalischen Partition. Damit ist es leider nicht möglich, normale ext3 Partitionen zu benutzen.
Um trotzdem LVM Partitionen verwenden zu können, kann man ein bestehendes File-Image auf eine physikalische oder LVM Partition abbilden.

qemu-img convert disk0.qcow2 -O raw /dev/vg/lv1

Um eine LVM Partition zu benutzen gibt man beim Ausführen einfach die Partition anstelle eines Diskimages an.

kvm -hda /dev/vg/lv1 -net nic,vlan=0 -net tap

Virtuelle Systeme ausführen

Für einen ersten Start ist es sinnvoll wieder eine VNC Konsole zu starten, damit man bei Netzwerkproblemen auf jeden Fall Zugriff hat. Die Angabe des virtuellen Netzwerkkarten Typs, soll bei Problemen helfen. In meinem Fall war es aber nicht nötig.

kvm -hda disk.img -net nic,vlan=0,model=rtl8139 -net tap -vnc 192.168.2.99:1

Für die endgültige Verwendung eines KVM Gastes auf dem Server können wir, bei Nichtbedarf, die VNC Konsole weglassen und mit -nographic die lokale Konsole unterbinden. Damit die KVM gleich in den Hintergrund als Dienst verschwindet, wird noch der Parameter -daemonize angegeben.

kvm -hda disk.img -net nic,vlan=0 -net tap -nographic -daemonize

Weitere Parameter für kvm finden sich in der Manpage von qemu. Die Parameter sind anscheinend bei beiden Systemen gleich.

QCOW2 mounten

Wie oben erwähnt, ist es nicht möglich einfach ein dynamisches QCOW Image im System zu mounten. Ausserdem soll dieses vorgehen erst ab Ubuntu Intrepid 8.10 möglich sein.

modprobe nbd max_part=8

Jetzt wird das gewünschte Image mit einem quemu als Netzwerkdienst gestartet

qemu-nbd --connect=/dev/nbd0 disk.img

Und eingebunden

mount /dev/nbd0p1 /mnt

Und wieder entfernen

umount /mnt
qemu-nbd -d /dev/nbd0

Weitere Infos unter Mounting qcow2 disk images

LVM mounten

Etwas einfacher können LVM Partitionen eines KVM Image gemountet werden:

kpartx -av /dev/vg/lv1

Nach dem Ausführen werden die gefundenen virtuellen Partitionen unter /dev/mapper eingehängt und können gemountet werden.

mount /dev/mapper/vg-lv1p1 /mnt

Wobei p1-X den enthaltenen Partitionen entsprechen.
Nach dem benutzen, nicht vergessen die Partition wieder unmounten:

umount /mnt
kpartx -d /dev/vg/lv1

weitere Infos

ToDo

Weitere noch nicht vorhandene Informationen:

  • Paravirtualisierung
  • PCI Devices weiterreichen
  • USB Devices weiterreichen
  • Windows installieren
  • Windows mit native 3D

Links

 
linux/kvm.txt · Zuletzt geändert: 23.06.2011 09:56 von tylmann