QEMU/KVM & Libvirt für Einsteiger: So richtest du deine erste virtuelle Maschine ein (mit grafischer Oberfläche)

Als Video ansehen
Bereitgestellt über YouTube

QEMU/KVM & Libvirt für Einsteiger: So richtest du deine erste virtuelle Maschine ein (mit grafischer Oberfläche)

KVM, QEMU und Libvirt sind wohl die Standard-Werkzeuge zur Virtualisierung unter Linux. Dieser Artikel wirft einen grundsätzlichen Blick auf die Vorteile der Technologie. Der Kern besteht darin, in die Grundlagen zur Virtualisierung mit den drei Werkzeugen aufzuzeigen: Dazu werden diese zunächst installiert. Es folgt die Einrichtung sowie Erstellung einer ersten VM, deren Zustand wir mit einem Snapshot speichern.

Wie funktioniert Virtualisierung grundsätzlich?

Durch Virtualisierung lassen sich komplette Betriebssysteme in Virtuellen Maschinen (VMs) voneinander isoliert auf dem gleichen PC bzw. Server betreiben. Vereinfacht kann man es sich wie ein Mehrfamilienhaus (Host-System) vorstellen, bei dem jede Partei (VM) eine eigenständige Wohnung besitzt, die weitgehendst unabhängig von den anderen ist.

Virtualisierung kann in einer ganzen Reihe von Szenarien verschiedene Vorteile bieten, etwa:

  • Die Installation/Einrichtung lässt sich automatisieren, ohne dass jemand physischen Zugriff benötigt, um etwa von einem USB-Stick zu booten
  • Neue Programme oder sogar Betriebssysteme gefahrlos ausprobieren, ohne sein Hauptsystem zu verbasteln oder gar zu beschädigen.
  • Durch Snapshots kann man den Zustand speichern und jederzeit wiederherstellen. Praktisch, wenn man etwas testet und somit die Änderungen per Klick bzw. Befehl wieder rückgängig machen kann.
  • Einfaches Klonen/Verschieben
  • Saubere Trennung verschiedener Systeme, etwa Test- und Produktivumgebung.
  • Paralleler Betrieb mehrerer Betriebssysteme, z.B. Eine Windows-VM unter GNU/Linux, um einzelne Programme ohne Dualboot nutzen zu können, die dort noch nicht nativ laufen.
  • Effektivere Nutzung der Ressourcen gegenüber mehreren Hardware-Systemen (v.a. im Server-Bereich)
  • Kontrolle über die Hardware – man kann die virtuelle Hardware jeder VM anpassen und damit beispielsweise alte Betriebssysteme wie Windows XP relativ gefahrlos betreiben, in dem man ihnen den Internetzugriff verweigert.
  • Analyse von wenig vertrauenswürdigen Programmen und Schadsoftware (heutzutage teilweise nur eingeschränkt, da manche Schadprogramme sich in VMs anders verhalten)
  • Je nach Nutzung gibt es noch weitere Vorteile. Beispielsweise kann man hochverfügbare Cluster aus physischen Servern erstellen und VMs auf ein anderes System verschieben, wenn ein Host aufgrund von Wartung neu gestartet werden muss oder ausgefallen ist.

Es überrascht daher nicht, dass sich Virtualisierung vor allem bei Servern schon vor etlichen Jahren durchgesetzt hat. Einen virtuellen Server kann man sich für wenige Euro im Monat mieten, da er zusammen mit hunderten anderen auf einer physischen Maschine läuft. Zwar kann man sich auch eine physische Maschine mieten – diese ist jedoch deutlich teurer und für viele Anwendungsfälle benötigt man die vergleichsweise hohe Leistung gar nicht. Systeme in der Cloud kann man als nächste Stufe davon sehen. Sie sind nahezu immer virtualisiert, gerade Cloudserver bestehen im Endeffekt oft aus VMs mit ein paar zusätzlichen Funktionen.

Aber auch auf dem Desktop kann Virtualisierung Sinn machen. Für beide Bereiche stehen einige Werkzeuge bereit, die alle grundlegende Funktionen beherrschen. Im Detail gibt es Unterschiede, wodurch sie sich für bestimmte Szenarien mehr oder weniger eignen. So ist KVM ein Typ 1 Hypervisor, der im Gegensatz zu Typ 2 den Umweg über das Betriebssystem spart.

Was sind KVM, QEMU und Libvirt?

KVM (Kernel-based Virtual Machine) ist eine Sammlung von Modulen zu Virtualisierung, die bereits seit 2007 mit Version 2.6.20 fester Bestandteil des Linux-Kernels sind. Ursprünglich wurde es für die X86-Architektur entwickelt, mittlerweile unterstützt es auch weitere wie unter anderem ARM. Wichtig zu verstehen ist: KVM stellt keine Emulation für VMs bereit, sondern lediglich die dafür notwendige Low-Level Technologie im Kernel.

Um diese als vollwertige Virtualisierungssoftware praktisch nutzen zu können, wird daher QEMU benötigt. Es unterstützt zahlreiche Funktionen, darunter u.a. auch Emulation. So können beispielsweise X86 Programme auf ARM-Systemen betrieben werden.

Libvirt bietet eine einheitliche Schnittstelle für eine ganze Reihe an Hypervisoren: QEMU, Xen, Vmware, Hyper-V und zahlreiche weitere. Technisch ist es daher nicht zwingend notwendig, wenn man sich nur auf einen Hypervisor beschränkt. Allerdings hat sie den Vorteil der Abstraktionsschicht, wodurch der Hypervisor austauschbar wird. Das ist beispielsweise dann nützlich, wenn man verschiedene Technologien unterstützen möchte – etwa in Terraform. Im besten Falle muss nicht für jede eine Implementierung entwickelt werden. Sondern man integriert Libvirt, was sich dann selbst darum kümmert, wie QEMU, Vmware oder andere Plattformen angesteuert werden. Alle drei Komponenten sind quelloffen.

QEMU ist mit KVM ein Typ 1 Hypervisor, d.H. er hat direkten Zugriff auf die physische Hardware. Die Leistung wird daher i.d.R. besser sein, als bei Typ 2 wie z.B. VirtualBox, welches als Anwendungssoftware auf das Betriebssystem aufsetzt. Es muss daher den Umweg über das Betriebssystem gehen, um z.B. auf Prozessor oder Speicher zugreifen zu können.

Voraussetzungen

Da in jeder VM ein komplettes Betriebssystem läuft, sollte euer Host-System über mindestens 4 Kerne und 8 GB Arbeitsspeicher verfügen. Mehr ist tendenziell besser. Abhängig davon was in den VMs laufen soll, werden deutlich üppigere Ressourcen benötigt. Mindestens 50 GB freien Speicherplatz ist zudem ebenfalls wichtig, da ihr einige Gigabyte für virtuelle Festplatte und Installationsmedien benötigen werdet.

In diesem Artikel wird Debian 11 als Host-System verwendet. Unter anderen Debian-Derivaten wie Ubuntu funktioniert es in der Regel identisch. Auch

VMX ist das Virtualisierungsmodul für Intel, SVM heißt es auf Systemen mit AMD-Prozessor. Wird eine Zahl größer 0 zurückgegeben, unterstützt euer System eine der beiden Virtualisierungstechnologien und die jeweilige ist aktiv – KVM kann also genutzt werden.

[daniel@dani-pc ~]$ grep -Ec '(vmx|svm)' /proc/cpuinfo 
24

Selbst viele 10 bis 15 Jahre alte Systeme sind dazu fähig. Nur extrem alte Hardware eignet sich technisch nicht zur Virtualisierung. Bei solchen Oldtimern ist die praktische Tauglichkeit meistens ohnehin stark eingeschränkt. Solltet ihr 0 erhalten, ist die Funktion in den meisten Fällen also lediglich im BIOS/UEFI abgeschaltet. Wie ihr dies konkret aktiviert, variiert je nach Hersteller und Modell. Über die Dokumentation oder eine Internetrecherche erfahrt ihr, mit welcher Tastenkombination das BIOS aufgerufen wird. Die Doku zeigt meistens auch, wo die Virtualisierungsfunktionen zu finden sind. Alternativ kann man sich in den Menüs selbst auf die Suche machen. Meist findet man diese in einem Bereich zu Hardware oder dem Prozessor. Teilweise auch im Registern die Fortgeschritten oder Advanced heißen, wie bei diesem HP:

Installation

Je nach Anforderungen und Umgebung möchte man ggf. die VMs auf einen eigenständigen VM-Host betreiben und über eine Arbeitsstation darauf zugreifen. Da Libvirt eine Client-Server Architektur besitzt, ist das möglich. In diesem einfachen Beispiel wird alles auf dem gleichen Host installiert, d.H. sowohl der Server, als auch Client. Für Testzwecke und eine lokale Arbeitssstation ausreichend. Hier können wir mit virt-manager eine grafische Oberfläche mitinstallieren,

Das Paket qemu-utils wird für alle virtuellen Festplattenformate außer Raw benötigt, etwa Qcow2. Verwendet man –no-install-recommends, sollte man sich bewusst sein, dass auch andere optionale Abhängigkeiten wie z.B. Dnsmasq für DNS-Abfragen nicht installiert werden! apt-cache depends <paket> (z.B. apt-cache depends libvirt-daemon-system) liefert eine Liste aller Abhängigkeiten. Vor allem für Einsteiger ist daher der erste Weg zu empfehlen, der im Zweifel ein paar Pakete zusätzlich installiert, die nicht benötigt werden.

# Installiert alle Abhaengigkeiten - fuer Einsteiger/Workstations
sudo apt install qemu-system libvirt-daemon-system qemu-utils virt-manager

# Verhindert die Installation grafischer Pakete - Auf Servern zu empfehlen (ohne virt-manager GUI)
sudo apt install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system qemu-utils dnsmasq-base

# Ausfuehrliche Pruefung des Systems auf Kompatibilitaet nach Paketinstallation
sudo virt-host-validate

Damit der aktuell angemeldete Benutzer Libvirt vollständig nutzen kann, muss er in die Gruppe libvirt aufgenommen werden. Anschließend einmal an- und wieder abmelden, um die Gruppen neu zu laden, oder direkt das gesamte System neu starten.

sudo usermod -a -G libvirt $USER
sudo usermod -a -G kvm $USER

Der Daemon libvirtd wird unter Debian automatisch gestartet und geladen:

$ sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
     Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2023-04-30 12:03:06 CEST; 3min 46s ago

Sollte dies unter anderen Distributionen nicht der Fall sein, können wir dies von Hand nachholen:

sudo systemctl enable --now libvirtd

Einrichten des ersten Virtuellen PCs

Zunächst benötigt ihr ein Abbild des Betriebssystems, welches als Gast in der VM installiert werden soll. Üblicherweise liegt dies im ISO-Format vor. Alternativ werden teils aus vorbereitete virtuelle Festplatten angeboten. Im Folgen führen wir eine Installation mit dem ISO-Abbild von Kubuntu Desktop durch. Aufgrund der Virtualisierung kann jede beliebige Distribution genutzt werden und auch proprietäre Betriebssysteme wie Microsoft Windows sind möglich.

Sowohl die Einrichtung als auch Verwaltung können per Kommandozeile oder grafischer Oberfläche durchgeführt werden. Für Einsteiger empfiehlt sich die grafische Variante über virt-manager von Red Hat, der sich über den gleichnamigen Befehl starten lässt. Über den Knopf links oben unter Datei lässt sich die erste VM anlegen.

Die korrekte Option für das ISO-Abbild ist Lokales Installationsmedium. Da wir in diesem Falle ein X86-System installieren, muss an dem passenden Standardwert für die Architekturoptionen nichts verändert werden. Im zweiten Schritt fragt der Assistent nach dem ISO-Installationsmedium. Grundsätzlich werden alle Dateien in Pools organisiert.

Es gibt verschiedene Typen, so kann ein Pool etwa auf einem bestimmten Laufwerk oder Netzwerk-Dateisystem liegen – eine ganze Reihe unterschiedlicher Typen werden unterstützt. Dies würde an der Stelle den Rahmen sprengen, für den Einstieg reicht dir völlig aus: Hier werden die Dateien in einem Verzeichnispfad abgelegt. Standardmäßig existiert ein Pool namens default, dessen Daten in /var/lib/libvirt/images liegen. Theoretisch kann man diesen nutzen. Zur besseren Übersichtlichkeit empfehle ich, einen eigenen Pool für Iso-Abbilder anzulegen. In diesem Beispiel wird er im Heimverzeichnis des U-Labs Benutzers gespeichert.

Nachdem ihr den gewünschten Pool (default oder den von euch erstellten) links angeklickt habt, wird mit dem Knopf Lokal durchsuchen unten die zuvor heruntergeladene ISO-Datei ausgewählt.

Kann das Betriebssystem nicht automatisch erkannt werden (None detected), entfernt ihr den Haken bei Automatically detect from the installation media/source darunter und sucht ein passendes heraus. Steht es nicht zur Auswahl, ein möglichst aktuelles nehmen – zur Not mit Generic OS (generic) ein allgemeines.

Schritt 3 legt Prozessorkerne und Arbeitsspeicher fest. Sinnvolle Werte hängen vom Gast-Betriebssystem, dessen Einsatzzweck sowie den verfügbaren Ressourcen auf dem Host ab. Grafische Oberflächen benötigen beispielsweise mehr Speicher und Leistung, hier sollten es mindestens 2 Kerne und 2 GB Arbeitsspeicher sein.

Nun folgt die virtuelle Festplatte, darauf wird die VM nach der Installation ihre Daten abspeichern. Die Größe hängt wieder vom Einsatzzweck ab. Durch die Option Datenträger Image für die virtuelle Maschine erstellen legt der Assistent automatisch eine virtuelle Festplatte mit der angegebenen Größe im Pool default an. Für den Anfang ist das völlig ausreichend. Wer mehrere Pools nutzt bzw. selbst kontrollieren möchte, wo die Daten landen, ist mit Benutzerdefinierten Speicher auswählen oder erstellen besser beraten. Über Verwalten erscheint die Pool-Verwaltung, die bereits zu Beginn für das ISO-Abbild diente. Dort müsste in diesem Falle ober den Plus-Knopf neben Datenträger von Hand eine VHD erstellt werden. Dieser Weg erlaubt zudem eine Anpassung des Formats, wobei am qcow2 in den meisten Fällen wenig auszusetzen ist.

Abschließend noch die Frage nach dem Name. Standardmäßig wird der OS-Typ eingetragen. Dieser ist hier nicht nur falsch (Ubuntu 22 stand ja noch nicht zur Auswahl). Generell sagt er wenig aus, spätestens wenn mehrere VMs angelegt wurden, findet man sich schwer zurecht. Zu empfehlen ist daher eine Bezeichnung, die etwas über den Zweck der Maschine aussagt.

Abhängig davon ist die eingeklappte Netzwerk Auswahl interessant: NAT ist die Vorauswahl. Dadurch hat die VM Zugriff über den Host Zugriff auf euer Netzwerk und damit wahrscheinlich auch das Internet, ohne jedoch eine IP-Adresse vom Router zu erhalten. Letzteres lässt sich über eine Netzwerk-Brücke (Bridged device) ändern. Dies ist jedoch eher ein erweitertes Thema, für erste Versuche ist NAT in Ordnung.

Aufmerksamen Beobachtern wird aufgefallen sein: Das default genannte Standard NAT Netzwerk ist inaktiv und würde daher unserer VM keinen Netzwerkzugang verschaffen. Der Assistent hat das ebenfalls gemerkt. Die Frage nach der Aktivierung sollte daher mit Ja beantwortet werden.

Wenige Sekunden später ist die VM angelegt und erscheint in der Übersicht der virtuellen Maschinenverwaltung. Außerdem öffnet sich ein Fenster, in dem die Maschine bootet.

Von hier an läuft die Installation des Gast-Betriebssystems ganz normal, wie man es von einer physischen Installation her gewohnt ist: Der Assistent fragt einige Informationen ab, kopiert die Daten, lädt ggf. noch Aktualisierungen herunter und wir haben ein vollwertiges, aber isoliertes System in der VM.

Über das Menü Anzeige könnt ihr mit Details sämtliche Einstellungen einsehen und in ausgeschaltetem Zustand auch bearbeiten.

Weitere Funktionen: Snapshots

Eine grundlegende, hilfreiche Funktion von VMs sind Snapshots: Sie speichern den Stand des kompletten Gast-Systems. Vor Änderungen oder Tests macht es daher Sinn, welche anzulegen. Dafür öffnet man die VM und klickt oben auf Anzeigen > Snapshots und unten auf das Plus. Name sowie Beschreibung sind frei wählbar und sollten so gestaltet werden, damit man sie zuordnen kann.

Nun legen wir zur Demonstration eine Datei im Downloads-Ordner an:

Nach dem zurückspielen des Snapshots mittels Schnappschuss starten und der Bestätigung ist die Datei verschwunden – die gesamte VM wurde auf dessen Stand zurückgesetzt. Alle Änderungen seit dem letzten Snapshot sind damit rückgängig gemacht worden.

Zu empfehlen ist generell die Installation des QEMU Gast-Agents innerhalb der VM. Er stellt dem Host-System Informationen zur Verfügung und ermöglicht ein paar weitere Funktionen, die ohne Zugriff auf den Gast nicht möglich sind. Der Agent befindet sich bei einigen Distributionen in den offiziellen Paketquellen, etwa unter Debian/Ubuntu:

sudo apt install qemu-guest-agent

Unter Windows bieten die VirtIO-Treiber bessere Leistung und sollte in der VM installiert werden. Außerdem verfügt Windows über einen Bug, der sich mit einer speziellen virtuellen Uhr lösen lässt. Unter Umständen führt dieser zu einer hohen CPU-Auslastung im Leerlauf.

Ein Ausflug auf die Kommandozeile

QEMU enthält spezifische Kommandozeilenwerkzeuge für die eigene Plattform. Libvirt dagegen bringt mit virsh ein übergreifendes Tool zur Verwaltung von VMs mit. Dies soll an dieser Stelle erwähnt werden, da man es zur Integration oder Automatisierung verwenden kann. Oder schlichtweg zur grundsätzlichen Verwaltung, wenn man die grafische Verwaltungsoberfläche nicht nutzen kann oder möchte.

Wissenswert ist zudem, dass die gesamte Konfiguration aller Komponenten intern als XML abgespeichert wird. Man kann diese daher einfach exportieren und auf einem anderen System importieren.

$ sudo virsh list
 Id   Name                 Status
------------------------------------
 1    ulabs-libvirt-demo   laufend

$ sudo virsh pool-list
 Name      Status   Automatischer Start
-----------------------------------------
 default   Aktiv    ja
 iso       Aktiv    ja

$ sudo virsh vol-list default
 Name                       Pfad
------------------------------------------------------------------------------
 ulabs-libvirt-demo.qcow2   /var/lib/libvirt/images/ulabs-libvirt-demo.qcow2


# Weitere hilfreiche Befehle
sudo virsh start <VM>
sudo virsh reboot <VM>

sudo virsh shutdown <VM>
# Destroy bedeutet VM hart abschalten
sudo virsh destroy vm
# Soll eine VM dauerhaft entfernt werden, geschieht dies mit undefine
sudo virsh undefine vm

# Snapshot erstellen/einspielen
virsh save <VM> snapshot.state
virsh restore snapshot.state

# Textkonsole (VMs ohne GUI - verlassen mit STRG + ']')
virsh console <VM>

# Direktes Anpassen der XML Konfiguration
virsh edit <VM>

Weiterführende Informationen

  • https://wiki.debian.org/KVM

Leave a Reply