Einführung zu KVM

KVM ist eine Open-Source Software, die eine Virtualisierungsinfrastruktur im Linux-Kernel zur Verfügung stellt. Damit diese Infrastruktur sinnvoll genutzt werden kann, sollte die verwendete Hardware entweder Intel VT-X oder AMD-V unterstützen.

KVM ist nicht selbst ein Emulator, sondern stellt lediglich die Infrastruktur zur Virtualisierung im Kernel bereit, welche dann vom Emulator (z.B. QEMU) genutzt wird. Es handelt sich dabei um eine Vollvirtualisierung, da Qemu die einzelnen Komponenten wie z.B. Festplatten, Grafik- und Soundkarten bereit stellt und nicht die Hardware des Hostsystems direkt durchreicht.

Mittlerweile unterstützt KVM auch die Paravirtualisierung und nutzt dazu die Virtio Schnittstelle. Während bei der Vollvirtualisierung reale Hardware abgebildet wird, stellt die Paravirtualisierung lediglich eine Softwareschnittstelle bereit, die nicht identisch, sondern der Hardware lediglich ähnlich ist. Das Betriebssystem des Gastsystems muss in Form von zusätzlichen Treibern bzw. durch Portierung insoweit verändert werden, dass die Schnittstellen der Paravirtualisierung genutzt werden können. Der Vorteil der Paravirtualisierung ist die erhöhte Performance durch geringeren Aufwand bei der Abbildung von Hardware.

Vor- und Nachteile

Eine Vollvirtualisierung wie KVM/Qemu unterscheidet sich sehr stark im Resourcenverbrauch zur Containervirtualisierung (z.B. OpenVZ). Da die gesamte Hardware der virtuellen Maschine abgebildet wird und nicht direkt die Hardware des Hostsystems durchgeschleift wird, erfordert die virtuelle Maschine mehr Resourcen - verglichen mit einem Container vor allem dann, wenn diese im Leerlauf läuft.

Entscheidende Vorteile von KVM ergeben sich dann, wenn man das Hostsystem nicht unter eigener Kontrolle hat, da man bei der Vollvirtualisierung unabhängig vom physikalischen Server ist. Beispielsweise ist es bei gängigen Containersystemen wie OpenVZ nicht möglich einen anderen Kernel als den vom Hostsystem vorgegebenen zu nutzen. In Folge scheidet auch die Nutzung anderer Betriebsysteme wie z.B. Windows, Mac OS X oder BSD auf einem mit Linux laufendem Hypervisor aus. Bereits die Verwendung von Kernelmodulen ist problematisch, wenn diese das Hostsystem nicht zur Verfügung stellt. Auch der Zugriff auf die durch die virtuelle Maschine abgelegten Daten unterscheidet sich zwischen der Vollvirtualisierung mit KVM und der Containervirtualisierung. OpenVZ bietet hier zum Beispiel die Möglichkeit des direkten Zugriffs auf die Daten der virtuellen Maschine. Die Daten liegen dabei dem Host selbst in Form eines eingehängten Verzeichnisses vor. Bei KVM ist der direkte Zugriff nicht möglich. Hierzu muss die virtuelle Maschine heruntergefahren werden, damit das Image in welchem die Daten liegen bzw. ein genutztes logisches Volume (LVM) eingehängt werden kann.

Hardwarekompatibilität

Um die Virtualisierung performant nutzen zu können, sollte zunächst geprüft werden, ob die Hardware entsprechenden Support liefert. Zuerst sollte sicher gestellt sein, dass die entsprechende Virtualisierungsfunktion im BIOS aktiviert ist. Zum Teil muss die Virtualisierungsfunktion für die CPU und den Chipsatz separat aktiviert werden. Es müssen demnach zwei Einstellungen im BIOS gesetzt werden. Danach kann im laufenden Linux mit folgendem Befehl nochmals geprüft werden, ob die CPU VT-X bzw. AMD-V überhaupt unterstützt.

egrep -c '(vmx|svm)' /proc/cpuinfo

Zeigt die Rückgabe einen Wert größer Null, so ist die Unterstützung von der CPU her gegeben. Es ist noch zu klären, ob der Chipsatz des Mainboards entsprechende Funktion der CPU nutzen kann. Im Zweifel hilft hier die Dokumentation des Herstellers weiter.

Installation

Damit KVM verwendet werden kann, müssen folgende Softwarepakete installiert werden.

[sudo] apt-get install qemu-kvm qemu-system libvirt-bin bridge-utils [virt-viewer]

In den meisten Fällen wird mit einer Netzwerkbrücke (Bridge) gearbeitet, weshalb auch das Paket bridge-utils mit installiert werden sollte. Das Paket virt-viewer ermöglicht den Zugriff auf die grafische Konsole der virtuellen Maschine und ist optional nach Bedarf zu installieren. Möchte man einem Nutzer Zugriff auf libvirt geben, so fügt man diesen zur Gruppe libvirtd zu. Für Debian GNU Linux basierte Systeme kann dies mittels

[sudo] adduser $username libvirtd

erledigt werden. Alternativ ist der Weg über

[sudo] usermod $username -aG libvirtd

möglich. Sollten Sie den Benutzer gerade in Verwendung haben, so ist zwangsweise eine Ab- und Anmeldung am System nötig, um die Einstellungen für den Benutzer zu übernehmen. Danach kann dieser z.B. über virsh, welches im nächsten Abschnitt behandelt wird, virtuelle Maschinen managen.

Die Installation von virsh findet unter Debian/Ubuntu über den Paketmanager statt. Hierzu wird das Paket virtinst sowie libvirt-bin (sofern noch nicht installiert) benötigt.

[sudo] apt-get install virtinst [libvirt-bin]

Arbeiten mit KVM

Zuerst muss eine Verbindung zum Hypervisor QEMU aufgebaut werden. Befindet sich dieser auf dem selben System genügt nachfolgender Befehl.

virsh connect qemu:///system

Ein weiteres Beispiel mit Xen als Hypervisor auf einem externen System sowie einer Verbindung durch einen SSH-Tunnel sieht wie folgt aus:

virsh connect xen+ssh://root@hypervisor.example.com/system

Alternativ können auch andere Hypervisoren mit libvirt verwendet werden. Unterstützt werden unter anderem:

  • LXC
  • OpenVZ
  • QEMU
  • XEN
  • VMware ESX
  • Bhyve
  • Microsoft Hyper-V

Ensprechende URIs um die Hypervisoren anzusprechen können in der Dokumentation von libvirt eingesehen werden. Die URIs sind wie folgt aufgebaut:

$hypervisor[+$transmission_protocol]://$host/$host_definition_file

virsh stellt eine Reihe von Befehlen zur Verfügung, mit der eine virtuelle Maschine verwaltet werden kann. Eine Übersicht erhält man mit dem Befehl "help". Eine gesammte Beschreibung der möglichen Befehle erhält man auf der Webseite von libvirt.org auf dieser zusammengefassten HTML-Seite.

Anlegen einer virtuellen Maschine

Eine virtuelle Maschine kann auf zwei Arten angelegt werden. Zum Einen ist es möglich eine vorgefertigte Konfiguration im XML-Format zu laden. Diese Konfiguration kann zum Beispiel von einer anderen VM exportiert und angepasst werden. Existiert keine Beschreibung einer VM im XML-Format, so kann zum Anderen mit dem Tool virt-install eine komplett neue VM angelegt werden.

virt-install --connect qemu:///system -n $vmname -r $ram_in_mb --vcpus=$anzahl_cpus -f ~/$imagename.img -s $speicher_in_gb --graphics vnc,port=$PORT --cdrom /var/lib/libvirt/images/$OS_iso.iso --noautoconsole --os-type linux

-n : Name der virtuellen Maschine
-r : RAM in MB
-vcpus : Anzahl zugewiesener virtueller Kerne
-f : zugewiesenes Festplattenimage
-s : Größe des Festplattenimages in GB
--gaphics vnc,port=$PORT : Aktiviert den VNC-Server für diese VM auf dem angegebenem Port
--cdrom : gibt das Medium (CD oder ISO) an, von dem installiert werden soll
--noautoconsole : verhindert, dass man automatisch zur Konsole verbunden wird
--os-type : optimiert auf das OS des Gastsystems

XML-Format libvirt

Mit

virsh# dumpxml $vmname

kann die XML-Konfiguration einer virtuellen Maschine ausgegeben werden. In dieser sind alle Einstellungen enthalten. Bei einem Backup sollte diese zusammen mit allen Festplatten-Images, die in der VM Verwendung finden gesichert werden. Zum Erstellen weiterer virtueller Maschinen kann die XML-Konfiguration angepasst werden. Danach wird die virtuelle Maschine mit

virsh # create $xml_configfile

angelegt.

Grundlegende Verwaltung einer virtuellen Maschine

Die wichtigsten Funktionen zur Verwaltung einer virtuellen Maschine in virsh sind vor allem das Starten, Stoppen, Neustarten, forciertes Abschalten bzw. Neustarten sowie das Versetzen in den Ruhemodus (Suspend) und wieder Aufwachen (Resume) einer virtuellen Maschine. Dazu kennt virsh folgende Funktionen:

virsh # list --all

Gibt alle virtuellen Maschinen und deren Status aus.

virsh # start $vmname

Startet die virtuelle Maschine.

virsh # destroy $vmname

Stopt die virtuelle Maschine. Es ist darauf zu achten die englische Bezeichnung "destroy" nicht falsch zu verstehen. Die VM wird nicht gelöscht, sondern lediglich der "laufende Prozess" zerstört. Die Images sowie die XML-Konfiguration der VM bleiben erhalten.

virsh # reboot $vmname

Startet die virtuelle Maschine neu.

virsh # reset $vmname

Führt einen harten Reset der virtuellen Maschine aus.

virsh # shutdown $vmname

Sendet der virtuellen Maschine den Befehl zum Herunterfahren.

virsh # suspend $vmname

Versetzt die virtuelle Maschine in den Standby-Modus.

virsh # resume $vmname

Weckt die virtuelle Maschine aus dem Standby-Modus wieder auf.

virsh # undefine $vmname

Löscht die virtuelle Maschine. Die von ihr genutzten Images bleiben erhalten und müssen bei Bedarf von Hand gelöscht werden.

NTP-Client oder kvm-clock

Da der Constant Timestamp-Counter (TSC) der virtuellen Maschine abhängig von der Geschwindigkeit der Hostcpu ist, kann es Abweichungen in der Systemzeit geben die korrigiert werden sollten, um diverse Fehler in z.B. HA-Setups und im Netzwerkbereich zu vermeiden. KVM liefert dazu das kvm-clock Modul, welches über Paravirtualisierung den Zugriff auf den TSC des Hostsystems ermöglicht. Ob das Modul kvm-clock genutzt wird, kann man im Gastsystem wie folgt abfragen:

cat /sys/devices/system/clocksource/clocksource0/current_clocksource

Als Ausgabe sollte "kvm-clock" erscheinen. In jedem Fall sollte auf dem Hostsystem ein NTP-Client die Zeit synchron halten. Sollte das Gastsystem eine andere Quelle bezüglich der TSC nutzen, so sollte man zusätzlich einen NTP-Client in der virtuellen Umgebung betreiben um Abweichungen in der Systemzeit zu korrigieren.

Snapshots

Mit qcow2 lassen sich Snapshots anfertigen. Es handelt sich hierbei um ein Imageformat, welches mit KVM eingesetzt werden kann. Mit qemu-img kann ein Image im qcow2-Format wie folgt angelegt werden.

qemu-img create -f qcow2 /var/lib/libvirt/images/$imagename.img 20G

Mit Hilfe von virt-install kann dann eine neue VM angelegt werden, die das zuvor erstellte Image im qcow2-Format nutzt.

virt-install --connect qemu:///system -n $vmname -r $ram_in_mb --vcpus=$anzahl_cpus --disk path=/var/lib/libvirt/images/$imagename.qcow2,format=qcow2 --graphics vnc,port=$PORT --cdrom /var/lib/libvirt/images/$OS_iso.iso --noautoconsole --os-type linux

Das Anlegen eines Snapshots wird in virsh mit snapshot-create erledigt.

virsh # snapshot-create $vmname

Damit ein Snapshot angelegt werden kann, wird die VM für diese Zeit pausiert und ist nicht erreichbar. Wurde der Snapshot angelegt, kann eine Liste aller Snapshots über

virsh # snapshot-list $vmname

eingesehen werden.
Dort ist auch der Name des Snapshots ersichtlich, der für das Zurückspielen benötigt wird. Das Zurückspielen eines Snapshots erreicht man über den folgenden Befehl:

virsh # snapshot-revert $vmname --snapshotname $snapshot_name

Weitere Infos zum Snapshot erhält man über

virsh # snapshot-info $vmname --snapshotname $snapshot_name

Auf entsprechende Art und Weise kann ein angelegter Snapshot auch wieder gelöscht werden. Dazu dient folgender Befehl:

virsh # snapshot-delete $vmname --snapshotname $snapshot_name

Virtio

Wie am Anfang dieses Artikels beschrieben, stellt KVM/QEMU eine vollvirtualisierte Umgebung dar. Aus diesem Grund muss die gesamte Hardware auf Treiberebene emuliert werden. Mit dem Einsatz von virtio in KVM sowie als Treiber im Gastsystem stellt virtio eine Schnittstelle in Form einer Paravirtualisierung zwischen Hostsystem und Gastsystem zur Verfügung. Dies erfordert zwar weitere Treiber im Gastsystem, wodurch sich Einschränkungen ergeben, ermöglicht aber eine performantere Emulation der entsprechenden Komponenten. Virtio unterteilt sich dabei in so genannte "back-end drivers" für das Hostsystem sowie die "front-end drivers" für das Gastsystem. Bei den front-end drivers stehen folgende zur Verfügung.

  • virtio-blk für Blocklaufwerke
  • virtio-net für Netzwerkkarten
  • virtio-pci für PCI-Karten
  • virtio-balloon um dynamisch den Speicher des Gastsystems zu verwalten
  • virtio-console als Konsolentreiber

Für jeden front-end driver existiert ein entsprechender back-end driver. Ob virtio benutzt werden soll, muss explizit angegeben werden. Im Folgenden ein kleines Beispiel wie dies beim Anlegen einer neuen VM aussieht:

virt-install --connect qemu:///system -n $vmname -r $ram_in_mb --vcpus=$anzahl_cpus --disk path=/var/lib/libvirt/images/$imagename.qcow2,device=disk,bus=virtio,format=qcow2 --graphics vnc,port=$PORT --cdrom /var/lib/libvirt/images/$OS_iso.iso --noautoconsole --os-type linux

Virtio liefert durch die Paravirtualisierung eine bessere Performance und sollte wenn möglich genutzt werden. Der Linux-Kernel bringt entsprechende Treiber für das Gastsystem von Haus aus mit. Für Windows können die Treiber direkt auf der KVM-Seite gefunden werden.

 

Hotline
 
Hotline des Rechenzentrums

Fragen? Rufen Sie uns an!
Montag - Freitag 10:00 - 19:00 Uhr

+49 69 - 900 180 - 0

 
Aktionen & News
 

Dedizierte Supermicro Xeon Server - ab 70,00 Euro

Angebote

 

Zweiter Standort
 
Hotline des Rechenzentrums

Erfahren Sie mehr über unseren zweiten Standort in der Hanauer Landstrasse in Frankfurt am Main.

mehr erfahren

Zertifizierungen
 
TüV geprüftes Rechenzentrum
ISO 27001 zertifiziertes Rechenzentrum
ISO 9001 zertifiziertes Rechenzentrum


Knowledge Base
 

Hilfreiche Artikel zum Thema Netzwerk, Server & IT.

mehr erfahren


Galerie
 

Sehen Sie sich in einem virtuellen Rundgang in unserem Rechenzentrum um:

Niederspannungshauptverteilung Unterbrechungsfreie Strom Versorgung
Kaltwassererzeuger Bereitstellung individueller SAT-Dienstleistungen


100% Ökostrom
 
100% Öko-Strom