Notizen eines rastlosen Geistes
Dies ist eine alte Version des Dokuments!
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
Schritte, die vor dem Erzeugen und Administrieren von VMs ausgeführt werden sollten. Perspektivisch sollten diese Schritte als ansible playbooks formuliert werden.
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
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.
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.
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.
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.
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.
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 root-Nutzer gearbeitet wird, ist ansonsten aber notwendig, wenn das Netzwerk funktionieren soll.--location --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.
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):
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
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.
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.
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“)…
Soweit war das Beschriebene ein Minimalbeispiel und sollte folgende Erfolge gebracht haben:
Für den produktiven Einsatz fehlen natürlich noch einige Aspekte, von denen ein paar nachfolgend aufgelistet seien:
/etc/hosts)Natürlich gibt es unübersehbar viele Seiten im Netz zum Thema. Die nachfolgenden waren zur Entstehungszeit dieses Beitrags eine Hilfe: