Tills Blog

Notizen eines rastlosen Geistes

Dies ist eine alte Version des Dokuments!


VMs via kvm/qemu/virsh - erste Schritte

Virtuelle Maschinen haben viele Einsatzszenarien. Die nachfolgende Beschreibung dient in erster Linie der Dokumentation eigener Anwendungen und dem dabei Gelernten.

Ausgangspunkt: Debian 10/11 Basisinstallation (netinstaller, nichts ausgewählt)

Zielstellung: VM (mit Debian 11) erzeugen, Zugriff aus der VM auf das Netzwerk

Vorarbeiten

Schritte, die vor dem Erzeugen und Administrieren von VMs ausgeführt werden sollten. Perspektivisch sollten diese Schritte als ansible playbooks formuliert werden.

Basispakete installieren

Zunächst muss eine Reihe von Basispaketen installiert werden, damit kvm/qemu/virsh unter Debian funktionieren:

apt install --no-install-recommends qemu-system libvirt-clients libvirt-daemon-system

Das ist erstmal nur das Grundsystem, noch nicht das, was für das Netzwerk notwendig ist. Dafür bedarf es noch weiterer Pakete (nicht klar, ob wirklich alle):

apt install dnsmasq-base bridge-utils iptables 

Administration als normaler Nutzer

Soll nicht nur root, sondern auch ein normaler Nutzer (<user>) mit virsh arbeiten können, sollte dieser der Gruppe libvirt hinzugefügt werden:

adduser <user> libvirt

Damit das dann funktioniert, am Besten einmal aus- und wieder einloggen. Überprüfung, ob der Nutzer zur Gruppe gehört:

id

Hier sollte dann die Gruppe libvirt auftauchen.

Netzwerk für die Kommunikation der VMs

Es gibt diverse Möglichkeiten, ein Netzwerk aufzusetzen. Die einfachste, die libvirt als Standard mitbringt, ist eine „bridge“ (virbr0). Dieses Netzwerk ist aber erstmal nicht aktiv und sollte vor dem Erzeugen einer VM aktiviert werden:

virsh --connect=qemu:///system net-start default
virsh --connect=qemu:///system net-autostart default

Mit diesen beiden Befehlen wird das Netz default angelegt und künftig automatisch gestartet. Will man sich davon überzeugen, dass die Brücke existiert:

brctl show

Die Ausgabe sollte als „bridge name“ sowas wie „virbr0“ ausgeben.

Eine VM erzeugen

Es gibt auch hier wieder unterschiedliche Wege. Letztlich ist ein großer Vorteil von libvirt, dass die Definition und Handhabung von VMs abstrahiert werden und alle notwendigen Informationen in einem einheitlichen XML-Format vorliegen. Auch wenn es hier nur um KVM/qemu geht, ist libvirt viel genereller.

Das Werkzeug, das hier zur Erzeugung einer VM verwendet werden soll, ist virt-install.

Pakete installieren

Zur Verwendung von virt-install muss es zunächst installiert werden:

apt install virtinst

Achtung: Dabei werden recht viele Abhängigkeiten, u.a. Python und diverse zugehörige Pakete, installiert. Insofern wäre es ggf. ein Szenario, virtinst nicht auf dem Produktivsystem zu installieren, sondern die VMs anderweitig zu definieren und dann nur auf das Produktivsystem zu übertragen.

Installationsmedium besorgen

Hier soll eine Minimalinstallation des aktuellen Debian-Systems erfolgen. Entsprechend bedarf es des net-installers als ISO-Abbild:

Je nach Kontext kann das ISO-Abbild entweder auf das Hostsystem kopiert oder direkt von dort aus per wget oder curl von der Debian-Seite gezogen werden. Nachfolgend wird davon ausgegangen, dass die Abbild-Datei debian-11.0.0-amd64-netinst.iso heißt.

VM erzeugen

Eine Möglichkeit zur Erzeugung einer VM, die dann gleich auch noch gestartet wird und dann das Debian-Installationsprogramm startet, sähe wie folgt aus:

# Name of the VM
NAME=bullseye
# Disk size of the VM in GB
DISKSIZE=10
# Memory size of the VM in MB
MEMSIZE=1024

virt-install \
  --virt-type kvm \
  --connect qemu:///system \
  --name "$NAME" \
  --location /home/till/debian-11.0.0-amd64-netinst.iso \
  --disk path=/home/vms/images/"$NAME".qcow2,size=$DISKSIZE \
  --memory $MEMSIZE \
  --graphics none \
  --console pty,target_type=serial \
  --extra-args console=ttyS0 

Entscheidend sind hier ein paar Details, die in anderen Dokumentationen oft untergehen:

  • --connect
    Kann unterbleiben, wenn als root-Nutzer gearbeitet wird, ist ansonsten aber notwendig, wenn das Netzwerk funktionieren soll.
  • --location
    Häufig wird für die Installation von einem ISO-Abbild die Option –cdrom angegeben, die funktioniert aber nicht in Verbindung mit –extra-args, was dann die interaktive Nutzung des Installationsprogramms erschwert, zumal wenn man nicht per vnc zur VM verbinden möchte (was auf einem Server-System auch erstmal unplausibel wäre).

Die Werte für die Größe von RAM und Festplatte sind natürlich anpassbar (und sollten an die lokalen Gegebenheiten angepasst werden). Auch wird hier davon ausgegangen, dass die Festplattenabbilder als Dateien im QCOW2-Format auf die Festplatte geschrieben werden (hier in den Pfad /home/vms/images/).

Sollte alles funktionieren, erscheint auf der Konsole nach dem initialen Booten vom Installationsmedium der Debian-Installer im Textmodus. Da gilt es dann, nach eigenem Geschmack durchzuturnen. Es reicht aber, das reine Basissystem zu installieren und im „tasksel“ alles abzuwählen. Alle weiteren Pakete können später immer noch (z.B. über ansible) installiert werden.

Konsole zur VM

Die Installation hat bereits (durch –extra-args console=ttyS0) eine Konsole zur VM aufgemacht, was für die Installation ja auch sehr hilfreich ist. Nach dem Neustarten der VM nach erfolgreicher Installation sieht man sich dann also dem Textmodus-Login gegenüber und fragt sich ggf., wie man da wieder herauskommt. Es gibt zwei Möglichkeiten (auf der deutschen Tastatur):

  • Strg + 5
  • Strg + AltGr + 9

Läuft eine VM und man möchte sich mit ihr per Konsole verbinden, geht das über virsh:

virsh --connect qemu:///system console <domain>

Wobei hier <domain> den Namen der VM angibt. Um eine Liste aller VMs zu bekommen:

virsh --connect qemu:///system list

zeigt alle laufenden VMs an. Alle (auch nicht laufende) bekommt man mit

virsh --connect qemu:///system list-all

Test des Netzwerks

Um zu überprüfen, ob die VM eine aktive Netzwerkkarte hat, eine Konsole starten (s.o.), sich als „root“ einloggen und dann nachschauen:

ip addr

Die IP-Adresse sollte im Block 192.168.122.0/24 sein, wenn man das Netzwerk für die VMs wie oben angegeben eingerichtet hat.

Probe auf's Exempel:

ping heise.de

Wenn da dann das Richtige zurückkommt, kann die VM zumindest ins Netz.

Arbeiten mit der VM

Die Arbeit mit der VM läuft weitestgehend über virsh. Man kann zwar auch in den XML-Dateien, die libvirt ablegt, editieren, davon wird aber deutlich abgeraten, weil die ggf. von libvirt/virsh überschrieben werden.

Der Aufruf von virsh führt zu einer virsh-Konsole, dort kann man sich über den Befehl help weiter durchhangeln. Auf den ersten Blick sicherlich gewöhnungsbedürftig, aber mit der Zeit ganz plausibel.

vim und Pfeiltasten

Wenn man per Konsole (virsh console) mit einer VM verbunden ist und dann im vim eine Datei editieren will, kann es im Einfügen-Modus ggf. vorkommen, dass die Pfeiltasten nicht funktionieren. Puristen sagen, dass das gewollt ist. Abhilfe kann aber schaffen, wenn man vor Aufruf von vim das Folgende eingibt:

export TERM=xterm

Das hat zumindest dem Autor geholfen. Ansonsten: Wenn man am Ende einer Zeile etwas einfügen möchte, a statt i drücken (für „append“ statt „insert“)…

Weitere Überlegungen

Soweit war das Beschriebene ein Minimalbeispiel und sollte folgende Erfolge gebracht haben:

  • VM mit Linux-Basissystem installiert
  • VM kann mit dem Internet/externen Netz kommunizieren
  • VM kann vom Hostsystem via virsh-Konsole erreicht werden

Für den produktiven Einsatz fehlen natürlich noch einige Aspekte, von denen ein paar nachfolgend aufgelistet seien:

Hilfreiche Quellen

Natürlich gibt es unübersehbar viele Seiten im Netz zum Thema. Die nachfolgenden waren zur Entstehungszeit dieses Beitrags eine Hilfe: