linux-ubuntu-debian virtualization kvm libvirt management orchestration

Libvirt: VM Management Library (Artikel 042)

Beherrschung der Libvirt-Toolchain für das Management von virtuellen Maschinen. Einsatz von virsh, XML-Konfigurationen und Storage-Pool-Verwaltung im Enterprise-Umfeld.

# Libvirt Deep Dive: Das Gehirn Ihrer Virtualisierung

TL;DR / Management Summary Während KVM die Muskeln (Hypervisor) bereitstellt, ist Libvirt das Gehirn. Es bietet eine einheitliche API, um virtuelle Maschinen, Netzwerke und Speicher zu verwalten – egal ob KVM, QEMU, Xen oder sogar LXC dahintersteckt. Das wichtigste Werkzeug für den Admin ist virsh (CLI). Wer die Libvirt-XML-Struktur versteht, kann komplexe Setups automatisieren, die über Web-GUIs nicht möglich wären.


# 1. Einführung & Architektur

Die Management-Schicht.

Libvirt abstrahiert die hypervisorspezifischen Befehle in eine standardisierte XML-Sprache.

graph TD
    A[Admin: virsh / virt-manager] --> B[libvirtd Daemon]
    B --> C[Driver: QEMU/KVM]
    B --> D[Driver: LXC]
    B --> E[Driver: Storage & Network]
    C --> F[Running VM 1]
    C --> G[Running VM 2]
    E --> H[Bridge / NAT / Pools]

# 2. Das CLI-Werkzeug: virsh

Präzision in der Konsole.

virsh ist das Schweizer Taschenmesser. Fast jeder Befehl kann interaktiv oder als One-Liner ausgeführt werden.

# Lifecycle Management

# VM definieren (aus XML)
virsh define myvm.xml

# Starten & Stoppen
virsh start myvm
virsh shutdown myvm # Sanft via ACPI
virsh destroy myvm  # Hart (wie Stecker ziehen)

# Autostart beim Booten des Hosts
virsh autostart myvm

# 3. Storage Pools & Netzwerke

Infrastruktur für VMs.

Libvirt verwaltet nicht nur VMs, sondern auch die Ressourcen dahinter.

# Storage Pools (Wo liegen die Disks?)

# Pools anzeigen
virsh pool-list --all

# Neuen Verzeichnis-Pool erstellen
virsh pool-define-as data dir - - - - /var/lib/libvirt/images/data
virsh pool-autostart data
virsh pool-start data

# Virtuelle Netzwerke

Standardmäßig nutzt Libvirt ein NAT-Netzwerk (default). Im Enterprise nutzen wir oft Bridges.

# Netzwerkstatus
virsh net-list --all

# 4. Day-2 Operations: XML Editing & Migration

Unter die Haube schauen.

Wenn Sie eine Einstellung ändern wollen (z.B. mehr RAM), nutzen Sie virsh edit <name>. Dies öffnet den Standardeditor mit der XML-Konfiguration.

# Beispiel: RAM & CPU anpassen

<domain type='kvm'>
  <name>myvm</name>
  <memory unit='KiB'>4194304</memory>
  <vcpu placement='static'>4</vcpu>
  ...
</domain>

# Live Migration (Voraussetzung: Shared Storage)

Eines der mächtigsten Features: Eine VM von Host A nach Host B schieben, ohne sie auszuschalten.

virsh migrate --live myvm qemu+ssh://host-b.company.com/system

# 5. Troubleshooting & “War Stories”

Wenn Libvirt streikt.

# Story 1: “Der hängende Shutdown”

Symptom: virsh shutdown macht nichts, die VM läuft weiter. Ursache: Das Gast-Betriebssystem reagiert nicht auf ACPI-Signale (kein QEMU Guest Agent installiert oder Dienst im Gast hängt). Lösung: Installieren Sie qemu-guest-agent im Gast. Falls das nicht hilft: virsh destroy.

# Story 2: “XML-Fehler: Domain not found”

Symptom: virsh edit meldet, dass die Domain nicht existiert, obwohl virsh list sie anzeigt. Ursache: Sie befinden sich in der falschen URI. Libvirt unterscheidet zwischen qemu:///session (User-Space) und qemu:///system (Root/System). Lösung: Nutzen Sie immer virsh -c qemu:///system oder setzen Sie den Alias permanent in Ihrer Shell.


# 6. Fazit & Empfehlung

  • Sicherheit: Nutzen Sie Libvirt-Zertifikate für Remote-Zugriffe (TCP statt nur SSH).
  • Backup: Sichern Sie die XML-Dateien Ihrer VMs unter /etc/libvirt/qemu/. Ohne diese Datei ist die Wiederherstellung einer Disk mühsam.
  • Tools: Für eine schnelle GUI-Übersicht ist virt-manager (X11/Wayland) die ideale Ergänzung zu virsh.

# Anhang: Cheatsheet

Aufgabe Befehl
Konsolenzugriff virsh console <name>
Details zur VM virsh dominfo <name>
Block-Devices (Disks) virsh domblklist <name>
Netzwerk-Interfaces virsh domiflist <name>
Snapshot-Liste virsh snapshot-list <name>
Resource Monitoring virt-top
VNC Port finden virsh vncdisplay <name>