KVM (Kernel-based Virtual Machine) ist die native Virtualisierungslösung für Linux. Zusammen mit QEMU und libvirt bildet es eine leistungsfähige Plattform für Server-Virtualisierung.

Voraussetzungen

Hardware-Virtualisierung prüfen

# Intel VT-x oder AMD-V
grep -E 'vmx|svm' /proc/cpuinfo

# Anzahl Kerne mit Virtualisierung
egrep -c '(vmx|svm)' /proc/cpuinfo

# Kernel-Module
lsmod | grep kvm

Installation

# Debian/Ubuntu
apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst

# RHEL/CentOS
dnf install qemu-kvm libvirt virt-install virt-manager

# User zur Gruppe hinzufügen
usermod -aG libvirt $USER
usermod -aG kvm $USER

Service starten

systemctl enable libvirtd
systemctl start libvirtd

# Status prüfen
systemctl status libvirtd
virsh list --all

Netzwerk einrichten

Default NAT-Netzwerk

# Standardnetzwerk starten
virsh net-start default
virsh net-autostart default

# Netzwerk anzeigen
virsh net-list --all
virsh net-info default

Bridge-Netzwerk

# /etc/netplan/01-bridge.yaml (Ubuntu)
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: false
  bridges:
    br0:
      interfaces: [enp0s3]
      dhcp4: true
      parameters:
        stp: false
        forward-delay: 0

# Anwenden
netplan apply

Bridge in libvirt

<!-- /tmp/bridge-network.xml -->
<network>
  <name>host-bridge</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>
virsh net-define /tmp/bridge-network.xml
virsh net-start host-bridge
virsh net-autostart host-bridge

VM erstellen

Mit virt-install

# Minimale VM
virt-install \
  --name ubuntu-server \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/ubuntu.qcow2,size=20 \
  --os-variant ubuntu22.04 \
  --network bridge=br0 \
  --graphics vnc \
  --cdrom /var/lib/libvirt/images/ubuntu-22.04.iso

# Mit mehr Optionen
virt-install \
  --name webserver \
  --memory 4096 \
  --vcpus 4,sockets=1,cores=4 \
  --disk path=/var/lib/libvirt/images/webserver.qcow2,size=50,format=qcow2 \
  --os-variant debian11 \
  --network network=default \
  --graphics vnc,listen=0.0.0.0,port=5901 \
  --noautoconsole \
  --boot cdrom,hd \
  --cdrom /var/lib/libvirt/images/debian-11.iso

Aus Template klonen

virt-clone \
  --original template-vm \
  --name new-vm \
  --file /var/lib/libvirt/images/new-vm.qcow2

VM-Verwaltung

Grundbefehle

# VMs auflisten
virsh list              # Laufende VMs
virsh list --all        # Alle VMs

# VM starten/stoppen
virsh start vmname
virsh shutdown vmname   # Sauberes Herunterfahren
virsh destroy vmname    # Sofort beenden (wie Stecker ziehen)

# VM pausieren
virsh suspend vmname
virsh resume vmname

# VM neustarten
virsh reboot vmname

Autostart

# Autostart aktivieren
virsh autostart vmname

# Autostart deaktivieren
virsh autostart --disable vmname

VM löschen

# VM entfernen
virsh undefine vmname

# Mit Storage
virsh undefine vmname --remove-all-storage

VM-Konfiguration

XML bearbeiten

# Konfiguration anzeigen
virsh dumpxml vmname

# Konfiguration bearbeiten
virsh edit vmname

# Live-Änderungen (wenn möglich)
virsh edit --running vmname

Ressourcen ändern

# RAM ändern (live)
virsh setmem vmname 4G --live

# RAM Maximum setzen
virsh setmaxmem vmname 8G --config

# CPUs ändern
virsh setvcpus vmname 4 --live
virsh setvcpus vmname 8 --config --maximum

Disk hinzufügen

# Image erstellen
qemu-img create -f qcow2 /var/lib/libvirt/images/disk2.qcow2 50G

# Disk anhängen
virsh attach-disk vmname /var/lib/libvirt/images/disk2.qcow2 vdb --persistent

# Detach
virsh detach-disk vmname vdb --persistent

Netzwerk ändern

# Interface hinzufügen
virsh attach-interface vmname network default --model virtio --persistent

# Interface entfernen
virsh detach-interface vmname network --mac 52:54:00:xx:xx:xx

Snapshots

Snapshot erstellen

# Snapshot erstellen
virsh snapshot-create-as vmname snapshot1 "Vor Update"

# Mit Beschreibung
virsh snapshot-create-as vmname --name pre-upgrade --description "System vor Upgrade"

Snapshots verwalten

# Snapshots auflisten
virsh snapshot-list vmname

# Snapshot-Info
virsh snapshot-info vmname snapshot1

# Zu Snapshot zurückkehren
virsh snapshot-revert vmname snapshot1

# Snapshot löschen
virsh snapshot-delete vmname snapshot1

Konsole

VNC

# VNC-Port ermitteln
virsh vncdisplay vmname

# VNC-Zugriff auf Port 5900+

Serial Console

virsh console vmname

# Escape: Ctrl+]

Spice

# Remote-Viewer
virt-viewer vmname

Storage-Pools

Pool erstellen

# Directory-Pool
virsh pool-define-as images dir - - - - "/var/lib/libvirt/images"
virsh pool-build images
virsh pool-start images
virsh pool-autostart images

# LVM-Pool
virsh pool-define-as lvm-pool logical - - /dev/vg0 vg0
virsh pool-start lvm-pool

Pool verwalten

# Pools anzeigen
virsh pool-list --all

# Pool-Info
virsh pool-info images

# Volumes im Pool
virsh vol-list images

Volume erstellen

# Volume erstellen
virsh vol-create-as images new-disk.qcow2 50G --format qcow2

# Volume löschen
virsh vol-delete new-disk.qcow2 --pool images

Performance

Virtio-Treiber

<!-- Disk mit virtio -->
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='none'/>
  <source file='/var/lib/libvirt/images/disk.qcow2'/>
  <target dev='vda' bus='virtio'/>
</disk>

<!-- Netzwerk mit virtio -->
<interface type='network'>
  <source network='default'/>
  <model type='virtio'/>
</interface>

CPU-Pinning

<vcpu placement='static'>4</vcpu>
<cputune>
  <vcpupin vcpu='0' cpuset='0'/>
  <vcpupin vcpu='1' cpuset='1'/>
  <vcpupin vcpu='2' cpuset='2'/>
  <vcpupin vcpu='3' cpuset='3'/>
</cputune>

Hugepages

# Hugepages aktivieren
echo 1024 > /proc/sys/vm/nr_hugepages

# In VM-Config
<memoryBacking>
  <hugepages/>
</memoryBacking>

Cache-Modes

<!-- Für beste Performance -->
<driver name='qemu' type='qcow2' cache='none' io='native'/>

<!-- Für Datensicherheit -->
<driver name='qemu' type='qcow2' cache='writethrough'/>

Migration

Live-Migration

# Zu anderem Host migrieren
virsh migrate --live vmname qemu+ssh://host2/system

# Mit Storage-Migration
virsh migrate --live --copy-storage-all vmname qemu+ssh://host2/system

Offline-Migration

# VM auf Ziel definieren
virsh dumpxml vmname > vmname.xml
# XML auf Zielhost kopieren, Disk kopieren
virsh define vmname.xml

Backup

VM-Backup-Script

#!/bin/bash
# backup-vm.sh

VM=$1
BACKUP_DIR="/backup/vms"
DATE=$(date +%Y%m%d)

# VM pausieren
virsh suspend $VM

# Snapshot für konsistenten Zustand
virsh snapshot-create-as $VM backup-snap --disk-only

# Disk kopieren
cp /var/lib/libvirt/images/$VM.qcow2 $BACKUP_DIR/$VM-$DATE.qcow2

# Snapshot entfernen
virsh snapshot-delete $VM backup-snap

# VM fortsetzen
virsh resume $VM

# XML sichern
virsh dumpxml $VM > $BACKUP_DIR/$VM-$DATE.xml

Monitoring

# VM-Ressourcen
virsh domstats vmname

# CPU-Statistiken
virsh cpu-stats vmname

# Netzwerk
virsh domifstat vmname vnet0

# Block I/O
virsh domblkstat vmname vda

Zusammenfassung

| Befehl | Funktion | |--------|----------| | virsh list | VMs anzeigen | | virsh start/stop | VM starten/stoppen | | virt-install | VM erstellen | | virsh edit | VM konfigurieren | | virsh snapshot-* | Snapshots verwalten | | virsh migrate | Migration |

| Datei | Funktion | |-------|----------| | /var/lib/libvirt/images/ | VM-Images | | /etc/libvirt/qemu/ | VM-Konfigurationen | | /var/log/libvirt/ | Logs |

| Tool | Verwendung | |------|------------| | virsh | CLI-Verwaltung | | virt-manager | GUI | | virt-install | VM-Erstellung | | virt-viewer | Konsole |

Fazit

KVM bietet Enterprise-Virtualisierung ohne Lizenzkosten. Virtio-Treiber liefern native Performance. Snapshots ermöglichen sichere Updates. Live-Migration sorgt für Hochverfügbarkeit. Die Integration mit libvirt macht die Verwaltung komfortabel.