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 kvmInstallation
# 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 $USERService starten
systemctl enable libvirtd
systemctl start libvirtd
# Status prüfen
systemctl status libvirtd
virsh list --allNetzwerk einrichten
Default NAT-Netzwerk
# Standardnetzwerk starten
virsh net-start default
virsh net-autostart default
# Netzwerk anzeigen
virsh net-list --all
virsh net-info defaultBridge-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 applyBridge 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-bridgeVM 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.isoAus Template klonen
virt-clone \
--original template-vm \
--name new-vm \
--file /var/lib/libvirt/images/new-vm.qcow2VM-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 vmnameAutostart
# Autostart aktivieren
virsh autostart vmname
# Autostart deaktivieren
virsh autostart --disable vmnameVM löschen
# VM entfernen
virsh undefine vmname
# Mit Storage
virsh undefine vmname --remove-all-storageVM-Konfiguration
XML bearbeiten
# Konfiguration anzeigen
virsh dumpxml vmname
# Konfiguration bearbeiten
virsh edit vmname
# Live-Änderungen (wenn möglich)
virsh edit --running vmnameRessourcen ä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 --maximumDisk 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 --persistentNetzwerk ä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:xxSnapshots
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 snapshot1Konsole
VNC
# VNC-Port ermitteln
virsh vncdisplay vmname
# VNC-Zugriff auf Port 5900+Serial Console
virsh console vmname
# Escape: Ctrl+]Spice
# Remote-Viewer
virt-viewer vmnameStorage-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-poolPool verwalten
# Pools anzeigen
virsh pool-list --all
# Pool-Info
virsh pool-info images
# Volumes im Pool
virsh vol-list imagesVolume erstellen
# Volume erstellen
virsh vol-create-as images new-disk.qcow2 50G --format qcow2
# Volume löschen
virsh vol-delete new-disk.qcow2 --pool imagesPerformance
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/systemOffline-Migration
# VM auf Ziel definieren
virsh dumpxml vmname > vmname.xml
# XML auf Zielhost kopieren, Disk kopieren
virsh define vmname.xmlBackup
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.xmlMonitoring
# VM-Ressourcen
virsh domstats vmname
# CPU-Statistiken
virsh cpu-stats vmname
# Netzwerk
virsh domifstat vmname vnet0
# Block I/O
virsh domblkstat vmname vdaZusammenfassung
| 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.