Eine virtuelle Maschine erstellen Sie heute mit wenigen Mausklicks. Wesentlich mehr Optionen dazu bietet aber die Kommandozeile.
Virtuelle Maschinen (VMs) spielen schon lange eine wichtige Rolle in unterschiedlichen Bereichen der IT. Mit dem Aufkommen von Containern vor einigen Jahren sah es zeitweise so aus, als würde die herkömmliche Virtualisierung ganz verschwinden. Mittlerweile ergänzen sich jedoch beide Techniken, da Container zwar weniger Ressourcen belegen, VMs aber mehr Sicherheit bieten. Mit LXD hat Canonical sogar eine Mischform aus beiden Techniken geschaffen.
Desktop-Anwender verwenden VMs gern, um ein anderes Betriebssystem in eine virtuelle Umgebung zu sperren, statt ständig in das andere System zu booten. Das Testen neuer Distributionen stellt eines der gängigen Einsatzgebiete für solche Techniken dar.
Administratoren lagern dagegen oft Dienste im Netzwerk in eine VM oder einen Container aus, wie etwa Server für Web, Mail oder Datenbanken. So lassen sich die Dienste schnell von einem physischen Server zum nächsten verschieben oder Ressourcen dynamisch verwalten.
Für die verschiedenen Aufgabenstellungen finden sich unterschiedliche grafische Software-Lösungen im Angebot. So offeriert die Firma VMware ein ganzes Bündel an Virtualisierungslösungen hauptsächlich für den Einsatz in Unternehmen, während Virtualbox eher im privaten und semiprofessionellen Umfeld zu Hause ist.
Bei Distributionen wie etwa Arch Linux, Fedora oder Siduction, die stets mit einem brandaktuellen Kernel arbeiten, hinkt die Virtualisierungssoftware besonders bei den Erweiterungen oft hinterher.
Um dem damit verbundenen Aufwand zu entgehen, lohnt es sich unter Umständen, das Erstellen der virtuellen Maschinen mittels KVM [1] und Qemu [2] in die Kommandozeile zu verlagern. Das Thema hat zahlreiche Facetten; Hier gehen wir jedoch lediglich auf die Grundlagen ein und zeigen an einfachen Beispielen, was möglich ist. Im Internet finden Sie bei Bedarf sehr ausführliche weiterführende Informationen.
KVM als Kernel-Modul
KVM steht als Abkürzung für Kernel Virtual Machine. Es handelt sich um ein Modul des Kernels, das es Anwendungen ermöglicht, auf die Virtualisierungsfähigkeiten moderner Prozessoren zuzugreifen und diese zu nutzen, indem es die Schnittstelle /dev/kvm bereitstellt.
KVM stellt aber lediglich die Grundlage dar, zum Virtualisieren selbst kommt Qemu ins Spiel. Der Name steht für Quick Emulator und beschreibt eine Software, die unter Linux, BSD, OpenSolaris, Mac OS X und Haiku läuft, wobei sie unter anderem die Architekturen x86, x86-64, PowerPC, ARM, Alpha, Mips, S/390, Sparc und OpenRisc unterstützt.
Besonders Administratoren greifen gern zur Kombination aus KVM und Qemu: Deren Client/Server-Architektur ermöglicht es, eine virtuelle Maschine auf einem Server zu starten und die Oberfläche auf einem Client darzustellen, der unter Umständen für die VM selbst zu schwach wäre.
Es gibt schier unzählige Startparameter für VMs. Unter anderem vermag die Software bei Systemen mit nur einer CPU mehrere Prozessoren zu emulieren. Auch die Emulation eines PowerPCs oder ARMs stellt kein Problem dar. Zudem eignen sich KVM und Qemu gut für den Einsatz in Skripten. Nicht zuletzt laufen Gastsysteme auf der Basis von KVM/Qemu fast so schnell wie ein natives System. Mit Gasterweiterungen wie bei Virtualbox oder VMware brauchen Sie sich ebenfalls nicht herumzuschlagen: Qemu kommt ohne sie aus.
Flagge zeigen
Um sicherzustellen, dass die CPU im verwendeten Rechner die nötige Unterstützung für die Virtualisierung bietet, nutzen Sie den Befehl cat /proc/cpuinfo. Dort sollten Sie unter den Flags im unteren Teil der Ausgabe bei der Verwendung einer AMD-CPU das Kürzel svm vorfinden, bei einem Intel-Prozessor vmx. Weitere Informationen zu den Hardware-Voraussetzungen, die Sie für die Virtualisierung benötigen, finden Sie im vorhergehenden Artikel dieses Schwerpunkts.
Prüfen Sie zudem mittels des Kommandos lsmod | grep kvm, ob die nötigen Kernel-Module geladen wurden. Die korrekte Ausgabe sieht (bis auf die Prozessnummern) bei einer Intel-CPU etwa so aus wie in Listing 1 dargestellt.
Listing 1
kvm_intel 237568 0 kvm 733184 1 kvm_intel irqbypass 16384 1 kvm
Taucht das wider Erwarten nicht in der Ausgabe auf, hilft der Befehl modprobe kvm_intel weiter. Falls dabei Fehler auftreten, verrät die Eingabe von dmesg | grep kvm oft die Ursache. Bei manchen Rechnern ist die Hardware-Virtualisierung im BIOS deaktiviert. Aktivieren Sie sie, und laden Sie dann das Modul.
Schnell installiert
Sie installieren KVM und Qemu über das Paket qemu-system-x86. Zum Emulieren anderer Architekturen als x86 benötigen Sie zusätzlich qemu-system. Als nützlich erweisen sich darüber hinaus virtinst, libvirt-daemon-system, libvirt-clients und virt-viewer sowie optional libvirt-manager. Für den Zugriff per SSH brauchen Sie zudem openbsd-netcat.
Dem Programm Libvirt-Manager widmet sich ebenfalls ein eigener Artikel in diesem Schwerpunkt. Mit diesem Werkzeug erstellen und verwalten Sie Qemu-Instanzen über eine GUI. Statt die Fähigkeiten von Libvirt mit dem Virt-Manager auszuloten, dreht sich in diesem Beitrag alles um den direkten Zugriff auf Qemu [3]. Als Alternative käme sonst noch Virt-Install [4] infrage.
Benutzerfreundlich
Um einem unprivilegierten User den Einsatz der VMs zu erlauben, fügen Sie dessen Konto den entsprechenden Gruppen hinzu (Listing 2). Anschließend überprüfen Sie mit dem Befehl id den Erfolg (Abbildung 1).

Abbildung 1: Einige Distributionen binden User bei der Installation von Libvirt in die richtigen Gruppen ein, andere nicht. Daher empfiehlt es sich, das zu überprüfen.
Listing 2
$ sudo adduser User libvirtd $ sudo adduser User kvm $ newgrp libvirt && newgrp kvm $ id
Libvirt als Grundlage
Die von Red Hat entwickelte API Libvirt [5] hat die Aufgabe, eine einheitliche Schnittstelle zum Verwalten verschiedener Hypervisoren [6] bereitzustellen – unter anderem für Xen, LXC, OpenVZ, Parallels, VMware, HyperV und Virtualbox oder (wie in unserem Beispiel) für Qemu.
Nach dem Abschluss der Vorbereitungen geht es an die Praxis: Testen Sie zunächst mit kvm-ok, ob KVM betriebsbereit ist. Dasselbe erledigen Sie für Libvirt, indem Sie als User virsh -c qemu:///session aufrufen – als Root ersetzen Sie systemweit session mit system. Die Shell grüßt mit einem kurzen Text und startet dann den interaktiven Interpreter Virsh (Abbildung 2).

Abbildung 2: Begrüßt Virsh Sie freundlich, steht das System für den Einsatz virtueller Maschinen bereit. Mit Virt-Install (oder direkt mit Qemu) erstellen Sie dann im nächsten Schritt eine VM.
Nun überprüfen Sie den Status der virtuellen Netzwerkkarte – vereinzelt ist sie nicht aktiv. Zeigt der Befehl net-list --all die Karte als inaktiv, schalten Sie sie mit net-start default ein (Abbildung 3). Klappt das, schließen Sie die Ausgabe mit quit und erstellen im Folgenden eine erste virtuelle Maschine.

Abbildung 3: Nicht immer ist die virtuelle Netzwerkkarte von Hause aus aktiv. Dann hilft das Virsh-Kommando net-start default dabei, sie in Betrieb zu nehmen.
Für erste Versuche empfiehlt es sich, ein lokales ISO-Image zu verwenden, das Sie im Home-Verzeichnis ablegen. Alternativ nutzen Sie ein optisches Medium im CD/DVD-Laufwerk. Mit etwas mehr Erfahrung bewältigen Sie später auch die Installation per SSH auf einem entfernten Server oder nutzen statt eines lokalen Images eine URL zu einem Abbild im Netz.
Schlanker Start
Soll die zu erstellende VM nur als Live-System zum Einsatz kommen, etwa weil Sie eine neue Distribution testen möchten, benötigen Sie keine virtuelle Festplatte. Ansonsten erstellen Sie nun eine solche mit dem Befehl qemu-img create test.img 10G.
Das Kommando erzeugt einen Container im Raw-Format, der – je nach Dateisystem – von Beginn an die maximale Größe hat. Ein mit der Belegung anwachsender Container benötigt das Format Qcow2 (Qemu Copy on Write), das Sie beim Erstellen über den Parameter -f qcow2 angeben.
In jedem Fall steht die Datei nun bereit; mit den Befehlen aus Listing 3 erzeugen Sie eine erste virtuelle Maschine (Abbildung 4). Den Namen hinter -name dürfen Sie frei wählen, der Parameter -m gibt die Menge an Hauptspeicher an, die die virtuelle Maschine erhält. Mit -smp definieren Sie die zu verwendenden Prozessorkerne – dabei dürfen Sie mehr Cores angeben, als der Host besitzt.
Listing 3
$ qemu-system-x86_64 -enable-kvm -vga vmware -name test -m 2048 -smp 4 -usbdevice tablet -cdrom ISO-Datei

Abbildung 4: Der Start eines Live-Images mit Qemu klappt mit nur wenigen Parametern. Komplexere Aufgaben packen Sie, falls diese häufiger zum Einsatz kommen, in ein Skript.
Mit -cdrom legen Sie den Speicherort des zu startenden Images fest. Dabei darf es sich entweder, wie im Beispiel, direkt um das ISO-Image handeln oder aber um einen Verweis auf ein reales CD/DVD-Laufwerk in der Form /dev/cdrom. Durch den Parameter -usbdevice tablet vermeiden Sie, das Qemu den Mauszeiger fängt. Warnungen betreffs Host does not support… dürfen Sie getrost ignorieren: Derzeit gelingt es nur mit viel Aufwand, sie komplett zu unterdrücken.
Die hier verwendeten Parameter fallen recht minimal aus – die Qemu-Manpage kennt unzählige weitere Optionen, Einfluss auf die zu erstellende VM zu nehmen.
Ausbaufähig
Möchten Sie eine Distribution nicht nur live betrachten, sondern in der VM installieren, dann binden Sie die zuvor erstellte virtuelle Festplatte per -hda Dateiname (im Beispiel: test.img) ein, sodass der Installer sie findet (Abbildung 5).

Abbildung 5: Wollen Sie eine Distribution in der VM installieren, erstellen Sie zunächst einen Container, den Sie dann über den Parameter -hda in Qemu einbinden.
Standardmäßig befinden sich die VMs hinter einem NAT und haben so zwar die Möglichkeit, sich im Internet zu bewegen (Abbildung 6), dürfen aber keinen Kontakt zum Gast oder mit einer anderen VM aufnehmen. Sollen sie das aber können, dann richten Sie dazu eine Netzwerkbrücke ein [7].

Abbildung 6: Ubuntu Maté startet mit Qemu in wenigen Sekunden, eine Verbindung ins Internet per NAT besteht standardmäßig.
Ein Beispiel dafür zeigt das Skript aus Listing 4, das Virt-install nutzt, statt Qemu direkt zu verwenden (Abbildung 7). Wollen Sie es nachvollziehen, erstellen Sie zuerst den bei --disk angegebenen Container debian9.img. Dabei installieren Sie Debian direkt aus dem Netz. Es kommt keine grafische Oberfläche zum Einsatz, das System erreichen Sie mit virsh console debian9.

Abbildung 7: Auch mit Virt-Install lässt sich Ubuntu Maté schnell starten und installieren. Das Listing 4 zeigt dagegen das Einrichten von Debian auf einem Server von einem Image im Netz.
Listing 4
virt-install \ --name debian9 \ --memory 4096 \ --disk /var/lib/libvirt/images/debian9.img \ --vcpus 4 \ --os-type linux \ --os-variant debian9 \ --network bridge=virbr0 \ --graphics none \ --console pty,target_type=serial \ --location http://ftp.de.debian.org/debian/dists/stretch/main/installer-amd64/ \ --extra-args 'console=ttyS0,115200n8 serial'
Aus der Ferne
Liegt ein Image auf einem entfernten Gerät, verwenden Sie zur lokalen Anzeige gegebenenfalls VNC oder das Spice-Protokoll [8]. Letzteres bietet gegenüber VNC einige Vorteile. So erlaubt es etwa, beliebige USB-Geräte des Hosts als virtuelles Gerät in die Umgebung des Gasts einzubinden. Der auf dem Gast installierte Spice-Agent spice-vdagent ermöglicht bei grafischen Oberflächen unter anderem das Kopieren und Einfügen von Texten und Bildern zwischen Host und Gast.
Qemu erlaubt das Einbinden von virtuellen Festplatten, die dem Virtualbox-Format (VDI) entsprechen. Dazu dient ein Befehl wie der aus Listing 5.
Listing 5
$ VBoxManage clonehd Platte.vdi KVM-Container.img
Interessant ist auch die Möglichkeit, analog zur Persistenz bei USB-Sticks in Qemu Overlay-Images anzulegen [9]. Dabei schreibt das System neue und geänderte Daten nicht in die originale Abbilddatei, sondern in ein Overlay. So bleibt das Image von experimentellen Änderungen verschont. Das Schema zum Anlegen eines solchen Overlays zeigt Listing 6.
Listing 6
$ qemu-img create -b Name.img -f qcow2 Name_overlay.ovl
Achten sie beim Einsatz eines Overlays darauf, Änderungen nur dort vorzunehmen. Bei Modifikationen am originalen Image funktioniert das Overlay nicht mehr, da es die Änderungen relativ zum Original speichert. Noch etwas flexibler sind Qemu-Snapshots [10].
Zu guter Letzt seien noch einige nützliche Tastenkombinationen verraten, die das Arbeiten mit Qemu erleichtern. Befinden Sie sich im Vollbildmodus, geht es zurück nur per [Strg]+[Alt]+[F]. Mit [Strg]+[Alt]+[**2**] öffnen Sie mit dem Qemu-Monitor eine Konsole, deren Befehle ähnlich wie Virsh Manipulationen der laufenden VM erlauben [11]. Zurück zu Qemu geht es mit [Strg]+[Alt][**1**].
Fazit
Die Kombination aus KVM und Qemu bietet nicht nur Admins oder DevOps interessante Einsatzmöglichkeiten, sondern bringt auch für den Heimanwender im Desktop-Bereich Vorteile. Zwar erfordert das Einarbeiten in die Materie einige Zeit, der Lohn liegt jedoch in einer überbordenden Fülle an Möglichkeiten, die VMs zu gestalten.
Wer sich die Mühe nicht machen will, der braucht trotzdem nicht auf KVM/Qemu zu verzichten, sondern erstellt und steuert die virtuellen Maschinen mit dem Libvirt-Manager. Um sich in der Vielfalt von Qemu zurechtzufinden, helfen am besten dessen Manpage [12], das Qemu-Wiki [13] sowie das Arch-Linux-Wiki [14] weiter.
Glossar
-
Hypervisor
-
Programm, das sich als Abstraktionsschicht zwischen die Hardware und die auszuführenden Betriebssysteme legt. Der Hypervisor verwaltet dabei die Ressourcenzuteilung (CPU, GPU, RAM, Massenspeicher, Peripherie) an die Gastsysteme.
Infos
-
KVM: https://de.wikipedia.org/wiki/Kernel-based_Virtual_Machine
-
KVM/Qemu: https://libvirt.org/drvqemu.html
-
Virt-Install: https://manpages.debian.org/testing/virtinst/virt-install.1.en.html
-
Hypervisor: https://de.wikipedia.org/wiki/Hypervisor
-
Bridge: https://www.linuxmuster.net/wiki/anwenderwiki:vlan:kvm-virtuelles-netzwerk
-
Overlays: https://kashyapc.fedorapeople.org/virt/lc-2012/snapshots-handout.html
-
Snapshots: https://wiki.qemu.org/Documentation/CreateSnapshot
-
Qemu-Monitor: https://en.wikibooks.org/wiki/QEMU/Monitor
-
Manpage: https://linux.die.net/man/1/qemu-kvm
-
Qemu-Wiki:https://wiki.qemu.org/Main_Page





