virsh-Befehl unter Linux

Eine kompakte Übersicht zur Verwaltung von KVM/QEMU-VMs mit dem Kommandozeilentool virsh.

Was ist virsh?

Libvirt ist ein Toolkit, mit dem du unterschiedliche Virtualisierungs-Plattformen (Hypervisor), wie KVM oder VirtualBox ansprechen kannst.

Sowohl mit dem GUI Virtual Machine Manager, als auch mit virsh als CLI-Tool lassen sich VMs (virtuelle Maschinen) administrieren.

In der Welt von virsh werden VMs als Domain 💡 bezeichnet.

In diesem Artikel zeige ich dir, was du so alles mit virsh unter Linux anstellen kannst.

Voraussetzungen und Installation

Bevor du virsh und KVM nutzen kannst, müssen die grundlegenden Voraussetzungen bei Hardware und Software erfüllt sein.

Hardware

Die CPU muss Hardware-Virtualisierung unterstützen (Intel VT-x oder AMD-V/SVM):

  • diese Option muss im BIOS/UEFI des Servers/PCs aktiviert sein
  • das prüfst du unter Linux mit egrep -c '(vmx|svm)' /proc/cpuinfo, was die Anzahl der CPU-Kerne ausgibt

Software

Jetzt kannst du die Pakete installieren.

Die Schritte für Debian/Ubuntu:

1
2
sudo apt update
sudo apt install qemu-kvm bridge-utils virt-manager

Die Schritte für Fedora/RHEL:

1
sudo dnf install qemu-kvm libvirt virt-install virt-manager

Und so kannst du das Ergebnis auf allen Distribution überprüfen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Dienst prüfen:
sudo systemctl status libvirtd
# Dienst ggf. aktivieren und starten:
sudo systemctl enable --now libvirtd
# eigenen User zur Gruppe libvirt hinzufügen:
sudo usermod -aG libvirt $(whoami)
# Ergebnis validieren:
lsmod | grep kvm # Modul geladen
sudo virsh version # Version anzeigen
sudo virt-host-validate # ausführliche Validierung

Modi zur Nutzung von virsh

Wenn bis hierhin alles geklappt hat, bist du nun bereit virsh zu nutzen:

  1. du kannst einzelne Befehle absetzen, wie virsh list --all
  2. oder es interaktiv nutzen, indem du virsh aufrufst

Die mit virsh aufgerufene Shell kannst du durch Eingabe von quit wieder verlassen.

Wir werden nur die 1. Option nutzen.

Verbindung zu virsh

Für eine Verbindung zu virsh ist eine URI erforderlich, die je nach Hypervisor anders aussieht oder auch auf einem anderen System läuft.

lokale Verbindung

So kannst du die Default-URI abfragen: virsh uri.

Die Ausgabe ist bei mir: qemu:///session

Falls es keine Verbindung gibt, kannst du sie so explizit angeben: virsh -c qemu:///system

Remote-Verbindung

Hier ein paar Beispiele, wie eine Remote-URI aussehen kann:

URI Protokoll
virsh -c qemu+ssh://<USER>@<IP-Adresse>/system SSH
virsh -c qemu://<USER>@<IP-Adresse>/system TLS/x509
virsh -c qemu+tcp://<USER>@<IP-Adresse>/system SASL/Kerberos

Wir arbeiten aber weiter mit der lokalen Verbindung und du kannst die URI weglassen. Also ist virsh -c qemu:///system nodeinfo äquivalent zu virsh nodeinfo.

Ein Golden Image

Jetzt ist es an der Zeit, deine erste VM zu erstellen und dann mit virsh zu testen. Das kannst du tun, indem du ein ISO von der Distribution deiner Wahl herunterlädst und damit im Virtual Machine Manager eine VM erstellst.

Alternativ lädst du dir ein fertiges QCOW2-Image herunter. Du findest sie zum Beispiel hier:

Virtuelle Maschinen verwalten

Mit einer ersten VM kannst du die folgenden Befehle live testen.

Hier sind einige grundlegende Befehle zum Anzeigen und Starten von VMs:

1
2
3
4
5
6
7
8
# alle VMs anzeigen:
virsh list --all
# nur laufende VMs anzeigen:
virsh list
# VM starten:
virsh start debian13
# VM mit Host zusammen starten lassen:
virsh autostart debian13

Jetzt kannst du dich im Virtual Machine Manager lokal auf der Konsole anmelden und auf der VM nach Belieben arbeiten.

Mit den folgenden Kommandos kannst du deine VM wieder ausschalten oder komplett entfernen:

1
2
3
4
5
# VM ausschalten:
virsh shutdown debian13
# VM stoppen und löschen:
virsh destroy debian13 && \
  virsh undefine debian13

SSH, IP-Adresse und Netzwerke

So kannst du eine SSH-Verbindung zu deiner VM aufbauen:

1
2
3
4
5
6
7
# IP-Adressen abfragen:
virsh net-dhcp-leases default # `default` ist das Standard-Netzwerk
# SSH-Verbindung zur VM aufbauen:
ssh [USER]@[IP]
## ersetze [USER] und [IP] mit deinen eigenen Werten
## ein Beispiel von mir:
ssh tux@192.168.0.147

Willst du es genauer wissen? So kannst du das Default-Netzwerk anzeigen:

1
2
3
4
5
6
# Netzwerke anzeigen:
virsh net-list --all
# Details zum Netzwerk sehen:
virsh net-info default
# XML zum Netzwerk sehen:
virsh net-dumpxml default

Snapshots verwalten

Snapshots sind Zustände des Betriebssystems, die sich wiederherstellen lassen.

Das kann in vielen Fällen sinnvoll sein. Deswegen zeige ich dir jetzt die wichtigsten Befehle dazu:

1
2
3
4
5
6
# Snapshot anlegen:
virsh snapshot-create debian13
# Snapshots anzeigen:
virsh snapshot-list debian13
# Snapshot wiederherstellen:
virsh snapshot-revert debian13 snapshot1

Erweiterte Verwendung

Bis hierher hast du einen guten, grundlegenden Überblick zu virsh erhalten. Aber darüber hinaus ist noch viel mehr möglich.

Das erkennst du zum Beispiel, wenn du virsh gefolgt von Leerzeichen und Tab-Taste eingibst: Hier kannst du über 280 Möglichkeiten anzeigen.

Ich zeige dir in diesem Abschnitt noch ein paar vertiefende Beispiele, die ich häufig verwende.

Netzwerke managen

Du kannst statt des Default-Netzwerks weitere Netzwerke anlegen oder ändern.

Dafür kannst du ein XML ausgeben: virsh net-dumpxml default > classA.xml

Dann den Inhalt anpassen an deine Wünsche und das Ganze wieder importieren, um daraus ein neues Netzwerk zu definieren.

Die Netzwerk-Arten sind in der Dokumentation genauer beschrieben.

So könnte dein Import aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# dein Netzwerk-XML, wie classA.xml:
network_file="$1"
network="${network_file%.xml}"
# Netzwerk definieren:
sudo virsh net-define --validate --file "$network_file"
# auf Autostart setzen:
sudo virsh net-autostart "$network"
# Netzwerk starten:
sudo virsh net-start "$network"
# überprüfen:
sudo virsh net-list --all

Diese Netzwerke kannst du dann VMs individuell zuordnen.

VMs generisch managen

Auch bei VMs kann es tiefer gehen. Wenn du einmal mehrere Golden Images hast und verschiedene Netzwerke, dann könntest du so neue Instanzen erstellen.

So kannst du das XML zu einer VM exportieren: virsh dumpxml debian13 > custom_debian13.xml

Dann kannst du es nach Bedarf anpassen - zum Beispiel die Werte für MAC, RAM, CPU, Disk und vieles mehr.

Und danach erstellst du daraus eine neue Instanz: virsh define custom_debian13.xml

Diese Instanz lässt sich wieder in allen Aspekten managen, die wir oben gesehen haben und die darüber hinaus möglich sind.

Zusammenfassung

Wenn du KVM/QEMU effizient administrieren willst, dann führt der Weg zu virsh 😎.

Mit diesem mächtigen CLI-Tool steuerst du deine virtuelle Infrastruktur unter Linux von der Erstellung über das Netzwerkmanagement bis hin zu Snapshots komplett aus einem Guss.

Hilfe zu virsh

Mehr zu virsh findest du unter man virsh und tldr virsh. Details zum Befehl tldr gibt es hier.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy