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.
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.
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.
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 ...
Für den Umgang mit KVM benötigen wir folgende Zusatzpakete
apt-get install kvm qemu ubuntu-vm-builder libvirt-bin
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.
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
Jetzt können wir unser erstes virtuelles System erstellen. Dazu gibt es verschiedene Wege.
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
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.
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
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.
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
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 noch nicht vorhandene Informationen: