Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Willkommen zum achten und letzten Teil unserer technischen Wiki-Serie über Linux-Administration!
Nachdem wir in den vorherigen Artikeln die Grundlagen, Benutzerverwaltung, Prozesse, Netzwerkkonfiguration, Shell-Scripting, Backup-Strategien und Systemsicherheit behandelt haben, widmen wir uns heute der Virtualisierung und dem VM-Management. Die Virtualisierung ist heute ein fundamentaler Bestandteil moderner IT-Infrastrukturen.
Die Virtualisierung ist eine fundamentale Technologie moderner IT-Infrastrukturen. Sie transformiert physische Serverressourcen in flexible, isolierte Umgebungen und ermöglicht dadurch eine effizientere Ressourcennutzung. Die Virtualisierung von Servern, Netzwerken und Storage-Systemen bildet heute das Rückgrat vieler Rechenzentren und Cloud-Umgebungen.
Virtualisierungs-Ebenen:
┌─────────── Hardware ─────────────┐
│ Physischer Computer │
│ (CPU, RAM, Festplatte) │
├─────────── Hypervisor ───────────┤
│ Verwaltet und verteilt │
│ alle Ressourcen │
├─────────── VMs ──────────────────┤
│ VM1 │ VM2 │ VM3 │ VM4 │
│ Linux │ Windows │ Linux │ BSD │
└──────────────────────────────────┘
Warum Virtualisierung?
Hypervisor-Typen verstehen:
KVM (Kernel-based Virtual Machine) und QEMU bilden das Fundament der Linux-Virtualisierung. KVM, als Kernel-Modul, stellt die Virtualisierungsfunktionen auf Hardware-Ebene bereit, während QEMU die Emulation der virtuellen Hardware übernimmt. Diese Kombination ermöglicht eine effiziente und flexible Virtualisierungsumgebung.
Virtualisierungs-Stack im Detail:
┌─────────── Verwaltungstools ──────────┐
│ virt-manager (Grafische Oberfläche) │
│ virsh (Kommandozeile) │
│ Cockpit (Weboberfläche) │
├─────────── libvirt ───────────────────┤
│ Verwaltungs-API │
│ Konfigurationsverwaltung │
│ VM-Definitionen │
├─────────── QEMU/KVM ──────────────────┤
│ QEMU: Hardware-Emulation │
│ KVM: Kernel-Modul für Virtualisierung │
│ Ressourcen-Verwaltung │
├─────────── Hardware ──────────────────┤
│ CPU mit Virtualisierungsunterstützung │
│ Arbeitsspeicher │
│ Festplattenspeicher │
└───────────────────────────────────────┘
a) Prüfen der Hardware-Voraussetzungen
egrep -c '(vmx|svm)' /proc/cpuinfo
# Wenn die Ausgabe größer als 0 ist, unterstützt dein CPU Virtualisierung
b) Notwendige Pakete installieren
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
c) Benutzerrechte einrichten
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
d) Dienste prüfen
sudo systemctl status libvirtd
# Sollte "active (running)" anzeigen
Die Erstellung einer virtuellen Maschine ähnelt der Konfiguration eines physischen Systems. Die virtuellen Komponenten wie CPU, RAM und Festplatte werden dabei aus den Ressourcen des Host-Systems bereitgestellt und können flexibel an die jeweiligen Anforderungen angepasst werden.
a) Vorbereitung der Umgebung
# Storage-Pool für VM-Images erstellen
sudo virsh pool-define-as --name vmpool --type dir --target /var/lib/libvirt/images
# Storage-Pool aktivieren
sudo virsh pool-build vmpool
sudo virsh pool-start vmpool
sudo virsh pool-autostart vmpool
b) ISO-Image vorbereiten
# Verzeichnis für ISO-Images erstellen
sudo mkdir -p /var/lib/libvirt/images/iso
# ISO-Image herunterladen (Beispiel: Ubuntu Server)
sudo wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso \
-O /var/lib/libvirt/images/iso/ubuntu-22.04.3-server.iso
c) VM über Kommandozeile erstellen
virt-install \
--name ubuntu-server \ # Name der VM für die Verwaltung
--memory 2048 \ # Arbeitsspeicher in MB (hier 2GB)
--vcpus 2 \ # Anzahl virtueller CPU-Kerne
--disk size=20,format=qcow2 \ # Festplattengröße und Format
--os-variant ubuntu22.04 \ # Optimierungen für das Betriebssystem
--network bridge=virbr0 \ # Netzwerkkonfiguration
--graphics vnc \ # Grafische Konsole via VNC
--console pty,target_type=serial # Textkonsole für die Installation
d) Parameter im Detail erklärt:
e) Erweiterte Netzwerk-Optionen
Die Netzwerkkonfiguration ist entscheidend für die Kommunikation deiner VMs. Es gibt verschiedene Netzwerk-Modi, die für unterschiedliche Anwendungsfälle geeignet sind:
Netzwerk-Modi:
┌─────────── NAT ──────────────────┐
│ - Standard-Modus │
│ - Internet über Host │
│ - VM von außen nicht sichtbar │
├─────────── Bridge ───────────────┤
│ - Direkter Netzwerkzugriff │
│ - VM wie physischer Computer │
│ - Voller Netzwerkzugang │
├─────────── Internal ─────────────┤
│ - Nur VM-zu-VM Kommunikation │
│ - Isoliertes Netzwerk │
│ - Höhere Sicherheit │
└──────────────────────────────────┘
NAT-Netzwerk erstellen:
virsh net-define nat-network.xml
virsh net-start nat-network
virsh net-autostart nat-network
Bridge-Netzwerk einrichten:
# In /etc/network/interfaces:
auto br0
iface br0 inet dhcp
bridge_ports enp0s3
bridge_stp on
bridge_fd 0
Die Verwaltung virtueller Maschinen gehört zu den Kernaufgaben in der Virtualisierungsumgebung. VMs sind eigenständige Systeme, die auf einem physischen Host-System laufen. Ihre effiziente Verwaltung und kontinuierliche Überwachung sind entscheidend für einen stabilen Betrieb.
VM-Management-Komponenten:
┌─────────── Verwaltung ───────────────┐
│ - Start/Stop/Pause │
│ - Snapshots │
│ - Backup/Restore │
├─────────── Monitoring ───────────────┤
│ - Ressourcenauslastung │
│ - Performance-Metriken │
│ - Systemzustand │
├─────────── Wartung ──────────────────┤
│ - Updates │
│ - Optimierung │
│ - Troubleshooting │
└──────────────────────────────────────┘
a) Grundlegende VM-Verwaltung
Deine VMs haben verschiedene Zustände:
# VM-Status anzeigen
virsh list --all
# Zeigt:
Id Name Status
--------------------------------
1 ubuntu-server running
- debian-test shut off
b) Tägliche Verwaltungsaufgaben
VM starten:
# VM normal starten
virsh start ubuntu-server
# Status überprüfen
virsh domstate ubuntu-server
VM herunterfahren:
# Sanftes Herunterfahren (wie Power-Button drücken)
virsh shutdown ubuntu-server
# Wenn die VM nicht reagiert (wie Stecker ziehen - nur im Notfall!)
virsh destroy ubuntu-server
c) Snapshot-Verwaltung
Ein Snapshot ist wie ein Foto deiner VM zu einem bestimmten Zeitpunkt. Du kannst später zu diesem Zustand zurückkehren, wenn etwas schiefgeht.
Snapshot-Typen:
┌─────────── Disk-Only ────────────┐
│ - Nur Festplattenzustand │
│ - Weniger Speicherplatz │
│ - VM muss laufen │
├─────────── Internal ─────────────┤
│ - Kompletter VM-Zustand │
│ - Inkl. RAM-Inhalt │
│ - VM wird pausiert │
└──────────────────────────────────┘
Snapshots erstellen und verwalten:
# Snapshot erstellen
virsh snapshot-create-as ubuntu-server snapshot1 "Vor dem Update" --disk-only --atomic
# Snapshot mit RAM-Zustand
virsh snapshot-create-as ubuntu-server snapshot2 "Vor Update" --memspec file=/path/to/ram.img
# Alle Snapshots anzeigen
virsh snapshot-list ubuntu-server
# Snapshot-Details anzeigen
virsh snapshot-info ubuntu-server snapshot1
# Zu Snapshot zurückkehren
virsh snapshot-revert ubuntu-server snapshot1
Snapshot-Hierarchie:
Base Image
│
├── Snapshot 1 (Nach Installation)
│ └── Snapshot 2 (Nach Updates)
│ └── Snapshot 3 (Aktuell)
└── Backup-Snapshot
Wichtige Hinweise für Snapshots:
e) Praktisches VM-Monitoring
Die kontinuierliche Überwachung virtueller Maschinen ist ein zentraler Aspekt des VM-Managements. Ein effektives Monitoring hilft dabei, Performance-Probleme frühzeitig zu erkennen und die Ressourcennutzung zu optimieren.
Hier sind die wichtigsten Monitoring-Werkzeuge:
Monitoring-Bereiche:
┌─────────── Ressourcen ───────────┐
│ CPU-Auslastung │
│ Arbeitsspeicher │
│ Festplattennutzung │
├─────────── Status ───────────────┤
│ Laufzeit │
│ Netzwerkaktivität │
│ Systemzustand │
├─────────── Protokolle ───────────┤
│ Systemlogs │
│ Fehlermeldungen │
│ Performance-Daten │
└──────────────────────────────────┘
Grundlegende Monitoring-Befehle:
# Detaillierte Informationen über eine VM
virsh dominfo ubuntu-server
# Zeigt:
# - CPU-Nutzung
# - Speicherauslastung
# - Laufzeit
# - Status
# Echtzeit-Statistiken
virt-top
# Ähnlich wie 'top', aber speziell für VMs:
# - CPU-Auslastung pro VM
# - Speichernutzung
# - I/O-Aktivität
VM-Monitoring-System:
┌─────────── Host-System ──────────────────────┐
│ ┌─── VM1 ───┐ ┌─── VM2 ───┐ ┌─── VM3 ───┐ │
│ │CPU: 30% │ │CPU: 50% │ │CPU: 20% │ │
│ │RAM: 2GB │ │RAM: 4GB │ │RAM: 1GB │ │
│ │Disk: 50% │ │Disk: 70% │ │Disk: 30% │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ ┌─────────── Monitoring-Tools ────────────┐ │
│ │ - virsh domstats → Status & Stats │ │
│ │ - virt-top → Live-Monitoring │ │
│ │ - domblkstat → Disk-Performance │ │
│ │ - domifstat → Netzwerk-Stats │ │
│ └─────────────────────────────────────────┘ │
└──────────────────────────────────────────────┘
Monitoring-Fluss:
┌─── Datensammlung ──┐ ┌── Analyse ───┐ ┌── Aktion ───┐
│ CPU-Nutzung │ ──> │ Auswertung │ ──> │ Warnungen │
│ RAM-Auslastung │ │ Trends │ │ Anpassung │
│ Disk-I/O │ │ Grenzwerte │ │ Skalierung │
└────────────────────┘ └──────────────┘ └─────────────┘
f) Erweiterte Monitoring-Funktionen
Ein proaktives Monitoring-System ermöglicht es, potenzielle Probleme frühzeitig zu erkennen und zu beheben. Dabei spielen verschiedene Metriken eine wichtige Rolle.
Monitoring-Bereiche:
┌─────────── Performance ───────────┐
│ CPU-Auslastung │
│ Arbeitsspeicher │
│ Festplattennutzung │
├─────────── Netzwerk ──────────────┤
│ Durchsatz │
│ Latenz │
│ Verbindungen │
├─────────── Status ────────────────┤
│ Verfügbarkeit │
│ Dienste │
│ Fehler │
└───────────────────────────────────┘
Performance-Überwachung:
# CPU und Speicher einer VM überwachen
virt-top
# Detaillierte VM-Statistiken
virsh domstats ubuntu-server
# Ressourcennutzung anzeigen
virsh dommemstat ubuntu-server
virsh cpu-stats ubuntu-server
Netzwerk-Monitoring:
# Netzwerkschnittstellen anzeigen
virsh domiflist ubuntu-server
# Netzwerkstatistiken
virsh domifstat ubuntu-server vnet0
Festplatten-Monitoring:
# Festplattennutzung anzeigen
virsh domblklist ubuntu-server
# Detaillierte Blockgeräte-Statistiken
virsh domblkstat ubuntu-server vda
g) Best Practices für VM-Monitoring
Monitoring-Strategie:
┌─────────── Grundüberwachung ─────────┐
│ - CPU-Auslastung │
│ - RAM-Nutzung │
│ - Festplattenspace │
│ - Netzwerkauslastung │
├─────────── Erweitert ────────────────┤
│ - Performance-Metriken │
│ - Dienste-Status │
│ - Log-Analyse │
├─────────── Automatisierung ──────────┤
│ - Warnmeldungen │
│ - Reports │
│ - Trending │
└──────────────────────────────────────┘
Praktische Implementierung:
Regelmäßige Überprüfungen:
# Stündliche Ressourcenprüfung
watch -n 3600 'virsh domstats ubuntu-server | grep "cpu\|balloon"'
# Tägliche Disk-Prüfung
virsh domblkstat ubuntu-server vda --human
# Wöchentliche Performance-Analyse
virt-top -n 1 > /var/log/vm_performance_$(date +%Y%m%d).log
Warnmeldungen einrichten:
# Beispiel-Skript für Ressourcen-Warnung
if virsh dommemstat ubuntu-server | awk '/actual/ {if($2>90) print "Warning: High Memory Usage"}'; then
echo "VM Memory Critical" | mail -s "VM Alert" admin@domain.com
fi
Die regelmäßige Sicherung virtueller Maschinen ist ein kritischer Aspekt des VM-Managements. Ein durchdachtes Backup-Konzept schützt nicht nur vor Datenverlust, sondern ermöglicht auch eine schnelle Wiederherstellung im Fehlerfall.
Backup-Arten:
┌─────────── Vollbackup ───────────┐
│ - Komplette VM │
│ - Alle Daten │
│ - Hoher Speicherbedarf │
├─────────── Inkrementell ─────────┤
│ - Nur Änderungen │
│ - Platzsparend │
│ - Schneller │
├─────────── Snapshot ─────────────┤
│ - Momentaufnahme │
│ - Für Tests & Updates │
│ - Temporär │
└──────────────────────────────────┘
Backup-Prozess:
Source VM ──> Backup-Tool ──> Storage
│ │ │
│ │ └── Ziel
│ └──────────────── Methode
└────────────────────────────── Quelle
a) Praktische Backup-Methoden
Es gibt verschiedene Backup-Methoden die du kennen und erlernen sollst, damit du diese anwenden kannst:
Backup-Methoden:
┌─────────── Vollbackup ───────────┐
│ - Komplette VM │
│ - Alle Daten │
│ - Hoher Speicherbedarf │
├─────────── Inkrementell ─────────┤
│ - Nur Änderungen │
│ - Platzsparend │
│ - Schneller │
├─────────── Differentiell ────────┤
│ - Änderungen seit Vollbackup │
│ - Mittlerer Speicherbedarf │
│ - Schnelle Wiederherstellung │
└──────────────────────────────────┘
Backup-Prozess:
VM ──> Vorbereitung ──> Sicherung ──> Verifizierung
│ │ │ │
│ │ │ └── Test
│ │ └────────────── Kopie
│ └────────────────────────── Snapshot
└──────────────────────────────────── Quell-VM
b) Vollständiges VM-Backup
# VM anhalten (wenn offline Backup)
virsh shutdown ubuntu-server
# Konfiguration sichern
virsh dumpxml ubuntu-server > /backup/ubuntu-server.xml
# Disk-Image kopieren
cp /var/lib/libvirt/images/ubuntu-server.qcow2 /backup/
c) Inkrementelle Backup-Methoden
Inkrementelle Backups speichern nur die Änderungen seit dem letzten Backup. Das spart Speicherplatz und Zeit.
Backup-Hierarchie:
┌─────────── Vollbackup ───────────┐
│ Tag 1: Komplettes System │
├─────────── Inkrementell ─────────┤
│ Tag 2: Nur neue/geänderte │
│ Dateien │
├─────────── Inkrementell ─────────┤
│ Tag 3: Nur neue/geänderte │
│ Dateien │
└──────────────────────────────────┘
Wiederherstellungsprozess:
Vollbackup → Inkr.1 → Inkr.2 → Inkr.3
│ │ │ │
└──────────┴────────┴────────┘
Alle werden nacheinander
eingespielt
Praktische Implementierung:
# Vollbackup erstellen (Tag 1)
qemu-img create -f qcow2 ubuntu-server-base.qcow2
# Inkrementelles Backup (Tag 2)
qemu-img create -f qcow2 -b ubuntu-server-base.qcow2 ubuntu-server-inkr1.qcow2
# Weiteres inkrementelles Backup (Tag 3)
qemu-img create -f qcow2 -b ubuntu-server-inkr1.qcow2 ubuntu-server-inkr2.qcow2
d) Backup-Best-Practices
Eine durchdachte Backup-Strategie ist fundamental für den sicheren Betrieb virtueller Maschinen. Die folgenden Praktiken haben sich in der professionellen Systemadministration bewährt.
Backup-Strategie:
┌─────────── Planung ─────────────┐
│ - Was wird gesichert? │
│ - Wie oft wird gesichert? │
│ - Wo wird gesichert? │
├─────────── Durchführung ────────┤
│ - Automatisierung │
│ - Monitoring │
│ - Verifizierung │
├─────────── Wiederherstellung ───┤
│ - Test-Prozeduren │
│ - Dokumentation │
│ - Notfallplan │
└─────────────────────────────────┘
1. Die 3-2-1 Backup-Regel:
2. Automatisierung mit Cron:
# Backup-Skript Beispiel
#!/bin/bash
# VM herunterfahren oder Snapshot erstellen
virsh shutdown ubuntu-server
# Warten bis VM gestoppt ist
sleep 30
# Backup erstellen
cp /var/lib/libvirt/images/ubuntu-server.qcow2 /backup/
# VM wieder starten
virsh start ubuntu-server
# Tägliches Backup um 2 Uhr morgens
0 2 * * * /usr/local/bin/vm-backup.sh
Als Administrator musst du manchmal VMs von einem Host auf einen anderen verschieben. Das kann verschiedene Gründe haben:
Migrations-Arten:
┌─────────── Live-Migration ─────────┐
│ - VM läuft während Migration │
│ - Minimale Ausfallzeit │
│ - Für kritische Systeme │
├─────────── Cold-Migration ─────────┤
│ - VM wird gestoppt │
│ - Kompletter Transfer │
│ - Längere Downtime │
└────────────────────────────────────┘
Migrations-Prozess:
Source Host ────> Transfer ────> Target Host
│ │ │
│ │ └── VM-Start
│ └─────────────── Daten-Transfer
└────────────────────────────── VM-Vorbereitung
a) Voraussetzungen für Migration
# Auf beiden Hosts:
# 1. Gleiche libvirt-Version
libvirtd --version
# 2. Netzwerkverbindung prüfen
ping ziel-host
# 3. Gemeinsamer Storage oder ausreichend Platz
df -h /var/lib/libvirt/images/
b) Praktische Migrationsbeispiele
Die Migration virtueller Maschinen ist ein komplexer Prozess, der verschiedene Techniken und Methoden umfasst. Je nach Anforderung und Szenario kommen unterschiedliche Migrationsstrategien zum Einsatz.
Migrations-Arten im Detail:
┌─────────── Live-Migration ──────────┐
│ VM läuft während der Migration │
│ Minimale Ausfallzeit │
│ Für kritische Systeme │
├─────────── Storage-Migration ───────┤
│ Nur Festplatten werden bewegt │
│ VM kann weiterlaufen │
│ Für Speicheroptimierung │
├─────────── Cold-Migration ──────────┤
│ VM wird gestoppt │
│ Kompletter Transfer │
│ Für unkritische Systeme │
└─────────────────────────────────────┘
Live-Migration durchführen:
# Voraussetzungen prüfen
# 1. Netzwerkverbindung testen
ping ziel-host
# 2. SSH-Zugriff einrichten
ssh-copy-id ziel-host
# 3. Gemeinsamen Storage prüfen
virsh pool-list --all
# Live-Migration starten
virsh migrate --live ubuntu-server qemu+ssh://ziel-host/system --verbose --persistent --undefinesource
Storage-Migration
Die Storage-Migration ist wie ein Umzug deiner VM-Festplatten. Dies kann notwendig sein für:
Storage-Migration-Typen:
┌─────────── Offline ──────────────┐
│ - VM ist gestoppt │
│ - Sicherer Transfer │
│ - Längere Downtime │
├─────────── Online ───────────────┤
│ - VM läuft weiter │
│ - Minimale Unterbrechung │
│ - Höhere Komplexität │
└──────────────────────────────────┘
Migration-Prozess:
Quelle ─────> Transfer ─────> Ziel
│ │ │
│ │ └── Verifizierung
│ └─────────────── Kopiervorgang
└──────────────────────────── Vorbereitung
Praktische Beispiele:
# VM herunterfahren
virsh shutdown ubuntu-server
# Storage migrieren
virsh vol-download --pool default ubuntu-server.qcow2 /backup/
virsh vol-upload --pool new_storage ubuntu-server.qcow2 /backup/
# VM-Konfiguration anpassen
virsh edit ubuntu-server
Cold-Migration
Eine Cold-Migration ist eine Methode, um VMs von einem Host zu einem anderen zu verschieben, wobei die VM während des Transfers ausgeschaltet ist.
Cold-Migration-Prozess:
┌─────────── Vorbereitung ─────────┐
│ 1. VM herunterfahren │
│ 2. Ressourcen prüfen │
│ 3. Netzwerk testen │
├─────────── Transfer ─────────────┤
│ 4. VM-Dateien kopieren │
│ 5. Konfiguration anpassen │
├─────────── Aktivierung ──────────┤
│ 6. VM auf Ziel starten │
│ 7. Funktionstest durchführen │
└──────────────────────────────────┘
Vorteile der Cold-Migration:
Nachteile:
Praktische Beispiele:
# 1. VM herunterfahren
virsh shutdown ubuntu-server
# Warten bis VM gestoppt ist
virsh list --all | grep ubuntu-server
# 2. VM-Konfiguration exportieren
virsh dumpxml ubuntu-server > ubuntu-server.xml
# 3. VM-Dateien auf Zielhost kopieren
scp /var/lib/libvirt/images/ubuntu-server.qcow2 \
ziel-host:/var/lib/libvirt/images/
scp ubuntu-server.xml ziel-host:/tmp/
# 4. Auf Zielhost: VM definieren
virsh define /tmp/ubuntu-server.xml
# 5. VM auf Zielhost starten
virsh start ubuntu-server
Best Practices Übersicht:
┌─────────── Backup ─────────────────┐
│ - Regelmäßige Sicherungen │
│ - Verschiedene Backup-Typen │
│ - Backup-Tests │
├─────────── Migration ──────────────┤
│ - Voraussetzungen prüfen │
│ - Downtime minimieren │
│ - Rollback-Plan erstellen │
├─────────── Dokumentation ──────────┤
│ - Konfigurationen │
│ - Prozeduren │
│ - Wiederherstellungspläne │
└────────────────────────────────────┘
a) Backup Best Practices:
b) Migrations Best Practices:
Container sind eine leichtgewichtige Alternative zu vollständigen virtuellen Maschinen sind. Stell dir Container wie kleine, isolierte Apartments in einem großen Gebäude vor, die sich alle dasselbe Fundament (den Kernel) teilen.
Virtualisierungs-Vergleich:
┌─────────── Klassische VM ──────────┐
│ App 1 │ App 2 │ App 3 │
│ Libs │ Libs │ Libs │
│ OS │ OS │ OS │
├─────────── Hypervisor ─────────────┤
│ Hardware │
└────────────────────────────────────┘
┌─────────── Container ──────────────┐
│ App 1 │ App 2 │ App 3 │
│ Libs │ Libs │ Libs │
├─────────── Container Engine ───────┤
│ OS Kernel │
│ Hardware │
└────────────────────────────────────┘
Vorteile von Containern:
a) Praktische Container-Beispiele
Es wichtig zu verstehen, wie Container in der Praxis eingesetzt werden:
Container vs. VM:
┌─────────── Container ────────────┐
│ App 1 │ App 2 │ App 3 │
│ Libs │ Libs │ Libs │
├─────────── Docker Engine ────────┤
│ Betriebssystem │
│ Hardware │
└──────────────────────────────────┘
┌─────────── VMs ──────────────────┐
│ App+OS │ App+OS │ App+OS │
│ Kernel │ Kernel │ Kernel │
├─────────── Hypervisor ───────────┤
│ Hardware │
└──────────────────────────────────┘
Container erstellen und verwalten:
# Docker installieren
sudo apt install docker.io
# Status prüfen
sudo systemctl status docker
# Erstes Container-Image herunterladen
sudo docker pull ubuntu:latest
# Container starten
sudo docker run -it ubuntu:latest /bin/bash
Container-Netzwerke und Storage
Container müssen miteinander und mit der Außenwelt kommunizieren können. Außerdem brauchen sie Speicherplatz für ihre Daten.
Container-Netzwerk-Typen:
┌─────────── Bridge ──────────────┐
│ - Standard-Netzwerk │
│ - Container ↔ Container │
│ - Container ↔ Internet │
├─────────── Host ────────────────┤
│ - Teilt Host-Netzwerk │
│ - Direkte Performance │
│ - Weniger Isolation │
├─────────── None ────────────────┤
│ - Kein Netzwerk │
│ - Maximale Isolation │
│ - Nur lokaler Zugriff │
└─────────────────────────────────┘
Container-Storage:
┌─────────── Volumes ─────────────┐
│ /var/lib/docker/volumes │
│ ├── Web-Daten │
│ ├── Datenbank │
│ └── Konfiguration │
├─────────── Bind Mounts ─────────┤
│ Host ←→ Container │
│ Direktes Dateisystem │
└─────────────────────────────────┘
Netzwerk-Konfiguration:
# Netzwerke anzeigen
docker network ls
# Neues Netzwerk erstellen
docker network create mein-netzwerk
# Container mit Netzwerk verbinden
docker run -d --network mein-netzwerk --name webserver nginx
c) Container-Orchestrierung
Container-Orchestrierung hilft dir, viele Container effizient zu verwalten und zu koordinieren. Stell dir das wie einen Dirigenten vor, der ein großes Orchester leitet.
Container-Orchestrierung:
┌─────────── Kubernetes ───────────┐
│ Master Node │
│ ├── API Server │
│ ├── Scheduler │
│ └── Controller Manager │
├─────────── Worker Nodes ─────────┤
│ ├── Container Runtime │
│ ├── kubelet │
│ └── kube-proxy │
└──────────────────────────────────┘
Container-Lebenszyklus:
Image ──> Container ──> Pod ──> Service
│ │ │ │
│ │ │ └── Netzwerk
│ │ └──────────── Gruppierung
│ └──────────────────────── Ausführung
└────────────────────────────────── Template
Praktische Beispiele mit Docker Compose:
# Docker Compose installieren
sudo apt install docker-compose
# Einfache Compose-Datei erstellen
cat << EOF > docker-compose.yml
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example
EOF
# Container starten
docker-compose up -d
d) Fortgeschrittene Container-Orchestrierung
Orchestrierungs-Ebenen:
┌─────────── Kubernetes ───────────┐
│ Master │
│ ├── API Server │
│ ├── Scheduler │
│ └── Controller │
├─────────── Worker Nodes ─────────┤
│ ├── Container Runtime │
│ ├── kubelet │
│ └── Services │
└──────────────────────────────────┘
Deployment-Prozess:
Pod ──> ReplicaSet ──> Deployment ──> Service
│ │ │ │
│ │ │ └── Netzwerk
│ │ └────────────── Skalierung
│ └──────────────────────────── Redundanz
└─────────────────────────────────────── Container
Praktische Beispiele:
# Kubernetes Cluster Status
kubectl get nodes
kubectl get pods --all-namespaces
# Deployment erstellen
kubectl create deployment web-app --image=nginx:latest --replicas=3
# Service erstellen
kubectl expose deployment web-app --port=80 --type=LoadBalancer
e) Container-Sicherheit
Die Sicherheit von Containern ist ein kritischer Aspekt, den du als Administrator verstehen und implementieren musst.
Container-Sicherheitsebenen:
┌─────────── Image-Sicherheit ─────────┐
│ - Vertrauenswürdige Quellen │
│ - Vulnerability Scanning │
│ - Image-Updates │
├─────────── Runtime-Sicherheit ───────┤
│ - Privilegien minimieren │
│ - Ressourcen begrenzen │
│ - Netzwerk-Isolation │
├─────────── Host-Sicherheit ──────────┤
│ - System-Updates │
│ - Zugriffskontrolle │
│ - Monitoring │
└──────────────────────────────────────┘
Grundlegende Sicherheitsmaßnahmen:
# Container nicht als Root ausführen
docker run --user 1000:1000 nginx
# Ressourcen begrenzen
docker run --memory=512m --cpus=1 nginx
# Privilegien einschränken
docker run --security-opt=no-new-privileges nginx
Best Practices für Container-Sicherheit:
Fortgeschrittene Sicherheitskonzepte
Als Administrator musst du Container sicher betreiben. Hier sind die wichtigsten Sicherheitsaspekte:
Container-Sicherheitsebenen:
┌─────────── Container ───────────┐
│ - Applikation │
│ - Bibliotheken │
│ - Konfiguration │
├─────────── Isolation ───────────┤
│ - Netzwerk │
│ - Prozesse │
│ - Dateisystem │
├─────────── Host-System ─────────┤
│ - Kernel │
│ - Ressourcen │
│ - Zugriffsrechte │
└─────────────────────────────────┘
Container absichern:
# Container ohne Root-Rechte ausführen
docker run --user 1000:1000 nginx
# Ressourcen begrenzen
docker run --memory=512m --cpus=1 nginx
# Capabilities einschränken
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx
Best Practices für Container-Sicherheit:
g) Container-Überwachung
Die Überwachung von Containern ist ein essentieller Bestandteil des Container-Betriebs. Ein proaktives Monitoring ermöglicht die frühzeitige Erkennung von Performance-Engpässen und potenziellen Problemen.
Container-Monitoring:
┌─────────── Ressourcen ───────────┐
│ - CPU-Auslastung │
│ - Speicherverbrauch │
│ - Netzwerk-Traffic │
├─────────── Logs ─────────────────┤
│ - Container-Logs │
│ - System-Logs │
│ - Application-Logs │
├─────────── Status ───────────────┤
│ - Container-Zustand │
│ - Dienste-Status │
│ - Health-Checks │
└──────────────────────────────────┘
Monitoring-Workflow:
Daten ──> Sammeln ──> Analysieren ──> Handeln
│ │ │ │
│ │ │ └── Anpassungen
│ │ └─────────────── Auswertung
│ └─────────────────────────── Metriken
└────────────────────────────────────── Container
Praktische Monitoring-Befehle:
# Grundlegende Container-Informationen
docker ps
docker stats
# Detaillierte Container-Informationen
docker inspect container_name
# Container-Logs anzeigen
docker logs container_name
# Ressourcen-Nutzung in Echtzeit
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
h) Container Best Practices
Die professionelle Container-Verwaltung erfordert ein durchdachtes Konzept für Sicherheit und Effizienz. Die folgenden Best Practices haben sich in der Praxis bewährt.
Container Best Practices:
┌─────────── Sicherheit ───────────┐
│ - Minimale Base Images │
│ - Regelmäßige Updates │
│ - Least Privilege │
├─────────── Performance ──────────┤
│ - Resource Limits │
│ - Multi-Stage Builds │
│ - Cache optimieren │
├─────────── Management ───────────┤
│ - Klare Namensgebung │
│ - Versionierung │
│ - Dokumentation │
└──────────────────────────────────┘
Sicherheits-Best-Practices:
# Minimales Base Image verwenden
FROM alpine:latest
# Als nicht-root Benutzer ausführen
USER nobody
# Ressourcen begrenzen
docker run --memory=512m --cpus=1 --security-opt=no-new-privileges meine-app
Performance-Best-Practices:
# Multi-Stage Build Beispiel
FROM node:alpine AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
3. Management-Best-Practices:
LXC (Linux Containers) und LXD bieten eine systemnahe Virtualisierungslösung, die sich besonders für Server-Umgebungen eignet. Im Gegensatz zu Docker, das auf Anwendungs-Container spezialisiert ist, ermöglichen LXC/LXD das Betreiben vollständiger Linux-Systeme in einer isolierten Umgebung.
Container-Technologien:
┌─────────── LXC ──────────────────┐
│ - System Container │
│ - Vollständiges OS │
│ - Kernel-Level Isolation │
├─────────── LXD ──────────────────┤
│ - Management Layer │
│ - Erweiterte Features │
│ - REST API │
└──────────────────────────────────┘
Unterschied zu Docker:
LXC/LXD vs Docker
┌─────────┐ ┌─────────┐
│ System │ │ App │
│Container│ │Container│
└─────────┘ └─────────┘
│ │
Vollständiges Einzelne App
OS + Dependencies
a) Praktische LXC/LXD-Beispiele
LXC/LXD Container bieten eine ressourcenschonende Alternative zu klassischen virtuellen Maschinen. Im Gegensatz zu vollständigen VMs teilen sich diese Container den Kernel des Host-Systems und ermöglichen dadurch eine effizientere Nutzung der verfügbaren Ressourcen.
Container-Struktur:
┌─────────── Host System ──────────┐
│ Linux Kernel & Betriebssystem │
│ │
│ ┌─── LXC Container 1 ──┐ │
│ │ Dateisystem │ │
│ │ Netzwerk │ │
│ │ Prozesse │ │
│ └──────────────────────┘ │
│ │
│ ┌─── LXC Container 2 ──┐ │
│ │ Dateisystem │ │
│ │ Netzwerk │ │
│ │ Prozesse │ │
│ └──────────────────────┘ │
└──────────────────────────────────┘
Installation und erste Schritte:
Installation-Abhängigkeiten:
┌─────────── LXD Paket ───────────┐
│ - LXD Daemon │
│ - LXC Bibliotheken │
│ - LXC Tools │
├─────────── Automatisch ─────────┤
│ - liblxc1 │
│ - lxcfs │
│ - lxc-common │
└─────────────────────────────────┘
# LXD installieren
sudo apt install lxd
# Dies installiert automatisch:
# - liblxc1 (LXC Bibliotheken)
# - lxc-common (Gemeinsame LXC Dateien)
# - lxcfs (LXC Dateisystem)
# LXD initialisieren
sudo lxd init
# Folge dem Assistenten für:
# - Speicher-Backend (dir oder zfs)
# - Netzwerk-Konfiguration
# - IPv4/IPv6-Einstellungen
# Ersten Container erstellen
lxc launch ubuntu:22.04 mein-container
Container-Verwaltung:
# Container-Status anzeigen
lxc list
# In Container wechseln
lxc exec mein-container -- bash
# Container stoppen/starten
lxc stop mein-container
lxc start mein-container
b) Container-Konfiguration
Die Konfiguration von LXC/LXD Containern ermöglicht eine präzise Anpassung der Ressourcen und Funktionen. Eine durchdachte Konfiguration ist entscheidend für die Performance und Sicherheit der Container-Umgebung.
Container-Konfiguration:
┌─────────── Ressourcen ───────────┐
│ - CPU-Limits │
│ - RAM-Limits │
│ - Disk-Quotas │
├─────────── Netzwerk ─────────────┤
│ - Interfaces │
│ - IP-Adressen │
│ - Firewall │
├─────────── Storage ──────────────┤
│ - Volumes │
│ - Mounts │
│ - Snapshots │
└──────────────────────────────────┘
Ressourcen-Konfiguration:
# CPU-Limits setzen
lxc config set mycontainer limits.cpu 2
# RAM-Limits setzen (2GB)
lxc config set mycontainer limits.memory 2GB
# Disk-Quota (20GB)
lxc config set mycontainer limits.disk.size 20GB
Netzwerk-Konfiguration:
# Netzwerk-Interface hinzufügen
lxc config device add mycontainer eth0 nic \
name=eth0 \
nictype=bridged \
parent=lxdbr0
# Statische IP setzen
lxc config device set mycontainer eth0 ipv4.address 192.168.1.100
c) LXC/LXD Container-Sicherheit
Die Sicherheit von LXC/LXD Containern ist ein kritischer Aspekt im professionellen Betrieb. Ein durchdachtes Sicherheitskonzept schützt sowohl die Container als auch das Host-System vor unberechtigten Zugriffen und potenziellen Sicherheitsrisiken.
Sicherheitsebenen:
┌─────────── Container ────────────┐
│ - Unprivilegiert │
│ - Privilegiert │
│ - Root-Einschränkungen │
├─────────── Host ─────────────────┤
│ - AppArmor/SELinux │
│ - Ressourcenlimits │
│ - Netzwerk-Isolation │
├─────────── Storage ──────────────┤
│ - Verschlüsselung │
│ - Quota │
│ - Snapshots │
└──────────────────────────────────┘
Unprivilegierte Container (empfohlen):
┌─────────── Unprivilegiert ───────┐
│ - Eingeschränkte Rechte │
│ - Sicherer │
│ - Standard-Empfehlung │
└──────────────────────────────────┘
# Container erstellen mit Sicherheitseinstellungen
lxc launch ubuntu:22.04 sicher-container \
-c security.privileged=false \
-c security.nesting=false \
-c linux.kernel_modules=false
# Ressourcenlimits setzen
lxc config set sicher-container limits.memory 2GB
lxc config set sicher-container limits.cpu 2
Privilegierter Container
Container-Privilegien:
┌─────────── Privilegiert ─────────┐
│ - Voller Systemzugriff │
│ - Gefährlich! │
│ - Nur für spezielle Fälle │
└──────────────────────────────────┘
# Privilegierten Container erstellen
lxc launch ubuntu:22.04 priv-container \
-c security.privileged=true \
-c security.nesting=true \
-c linux.kernel_modules=true
# Container-Status überprüfen
lxc config show priv-container | grep security
WICHTIG: Sicherheitsrisiken
AppArmor-Profile konfigurieren:
# AppArmor-Status prüfen
sudo aa-status
# Container mit spezifischem Profil
lxc config set secure-container \
lxc.apparmor.profile=lxc-container-default-cgns
# Eigenes Profil erstellen
sudo nano /etc/apparmor.d/lxc-secure
Seccomp-Filter anwenden:
# Standard Seccomp-Filter aktivieren
lxc config set secure-container \
lxc.seccomp.profile=default
# Erweiterte Einschränkungen
lxc config set secure-container \
security.syscalls.blacklist=mount,umount2
d) Verschlüsselung, Quota und Snapshots
Container-Management:
┌─────────── Verschlüsselung ────────┐
│ - LUKS Encryption │
│ - Storage Pool Security │
│ - Zugriffsschutz │
├─────────── Quota ──────────────────┤
│ - Speicherplatz-Limits │
│ - Ressourcen-Kontrolle │
│ - Überwachung │
├─────────── Snapshots ──────────────┤
│ - Momentaufnahmen │
│ - Backup & Restore │
│ - Versionierung │
└────────────────────────────────────┘
Container-Verschlüsselung:
# Storage-Pool mit LUKS verschlüsseln
lxc storage create encrypted_pool dir \
source=/encrypted/pool \
security.luks=true
# Container im verschlüsselten Pool erstellen
lxc launch ubuntu:22.04 secure-container \
-s encrypted_pool
Quota-Management:
# Speicherplatz-Limit setzen
lxc config set mein-container limits.disk.size 10GB
# RAM-Limit setzen
lxc config set mein-container limits.memory 2GB
Snapshot-Verwaltung:
# Snapshot erstellen
lxc snapshot mein-container snap01
# Snapshot wiederherstellen
lxc restore mein-container snap01
# Snapshots auflisten
lxc info mein-container
e) Best Practices für LXC/LXD
Szenario: Du bist Junior System Administrator in einem mittelständischen Unternehmen. Deine Aufgabe ist es, eine Test-Umgebung für die Entwicklungsabteilung aufzusetzen.
Anforderungen:
┌─────────── Entwicklungsserver ───────┐
│ - Ubuntu Server 22.04 LTS │
│ - 4GB RAM, 2 vCPUs │
│ - 50GB Speicher │
├─────────── Testserver ───────────────┤
│ - Debian 12 │
│ - 2GB RAM, 1 vCPU │
│ - 20GB Speicher │
├─────────── Monitoring ───────────────┤
│ - LXC Container │
│ - Prometheus + Grafana │
│ - 1GB RAM │
└──────────────────────────────────────┘
Aufgaben:
Mögliche Lösung:
VM-Setup:
# Entwicklungsserver erstellen
virt-install \
--name dev-server \
--memory 4096 \
--vcpus 2 \
--disk size=50 \
--os-variant ubuntu22.04 \
--network bridge=virbr0 \
--location 'http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/'
# Testserver erstellen
virt-install \
--name test-server \
--memory 2048 \
--vcpus 1 \
--disk size=20 \
--os-variant debian12 \
--network bridge=virbr0
# Snapshots erstellen
virsh snapshot-create-as dev-server snap01 "Nach Installation"
virsh snapshot-create-as test-server snap01 "Nach Installation"
Backup-Konfiguration:
# Backup-Skript erstellen
cat << 'EOF' > /usr/local/bin/vm-backup.sh
#!/bin/bash
# Snapshot erstellen
virsh snapshot-create-as dev-server backup-$(date +%Y%m%d)
# Alte Snapshots löschen (älter als 7 Tage)
for snap in $(virsh snapshot-list dev-server --name | grep backup- | sort -r | tail -n +8); do
virsh snapshot-delete dev-server $snap
done
EOF
# Backup-Skript ausführbar machen
chmod +x /usr/local/bin/vm-backup.sh
# Cron-Job einrichten
echo "0 2 * * * /usr/local/bin/vm-backup.sh" | sudo crontab -
Container-Setup:
# LXC Container erstellen
lxc launch ubuntu:22.04 monitoring
# Container konfigurieren
lxc config set monitoring limits.memory 1GB
lxc config set monitoring limits.cpu 1
# Sicherheit konfigurieren
lxc config set monitoring security.privileged false
lxc config set monitoring security.nesting false
In diesem Artikel hast du die fundamentalen Konzepte der Virtualisierung und des VM-Managements kennengelernt. Von der klassischen VM-Verwaltung über Container-Technologien bis hin zu Backup-Strategien wurden alle wichtigen Aspekte behandelt. Du hast gelernt, wie du virtuelle Maschinen erstellst, Container verwaltest und eine sichere, effiziente Virtualisierungsumgebung aufbaust.
Die vorgestellten Technologien und Best Practices bilden das Fundament für moderne IT-Infrastrukturen. Besonders wichtig ist das Zusammenspiel verschiedener Virtualisierungstechnologien – von KVM über Docker bis hin zu LXC/LXD. Nur durch die richtige Kombination dieser Werkzeuge kannst du eine flexible und leistungsfähige Virtualisierungsumgebung schaffen.
Damit endet unsere Serie „Linux-Administration“. In den acht Artikeln hast du alle wichtigen Grundlagen der Linux-Administration kennengelernt – von der Benutzerverwaltung über Netzwerkkonfiguration und Sicherheit bis hin zur Virtualisierung. Du verfügst nun über das nötige Wissen, um Linux-Systeme professionell zu verwalten und zu betreuen.
Happy virtualizing!