# Libvirt-VM-Backup und Restore ## Voraussetzungen Auf dem Ubuntu-Host: ```bash sudo apt install rsync libvirt-clients qemu-utils python3 ``` Auf dem Debian-Ziel: ```bash sudo apt install qemu-system-x86 qemu-utils libvirt-daemon-system \ libvirt-clients ovmf swtpm swtpm-tools rsync python3 ``` ## Backup 1. Windows vollständig herunterfahren. 2. BitLocker-Recovery-Keys separat sichern. 3. Backup-Datenträger einhängen. 4. Skript starten: ```bash chmod +x libvirt-backup.sh libvirt-restore.sh sudo ./libvirt-backup.sh /mnt/backup/libvirt-host ``` Prüfen: ```bash cd /mnt/backup/libvirt-host sha256sum -c metadata/SHA256SUMS cat metadata/block-sources.txt cat metadata/missing-files.txt ``` `block-sources.txt` muss leer sein, sofern keine LVM-/Block-Devices verwendet werden. Enthaltene Blockgeräte sind zusätzlich separat zu sichern. ## Restore Auf Debian zunächst libvirt/QEMU installieren und den Backup-Datenträger einbinden: ```bash sudo ./libvirt-restore.sh /mnt/backup/libvirt-host ``` Standardmäßig überschreibt das Skript keine vorhandenen Dateien oder libvirt-Definitionen. Für eine bewusst erzwungene Wiederherstellung: ```bash sudo OVERWRITE_FILES=1 REPLACE_DEFINITIONS=1 \ ./libvirt-restore.sh /mnt/backup/libvirt-host ``` Autostart für importierte Objekte setzen: ```bash sudo AUTOSTART_OBJECTS=1 ./libvirt-restore.sh /mnt/backup/libvirt-host ``` Exportierte Host-Interfaces/Bridges werden aus Sicherheitsgründen nicht automatisch definiert. Das ist bewusst separat: ```bash sudo RESTORE_INTERFACES=1 ./libvirt-restore.sh /mnt/backup/libvirt-host ``` Bei Bridges ist es häufig besser, die Netzwerkkonfiguration auf Debian mit NetworkManager oder systemd-networkd neu aufzubauen. ## Wichtige Grenzen - Offline-Backup: Die VMs müssen ausgeschaltet sein. - File-basierte Images, UEFI-NVRAM und dateibasierte TPM-Zustände werden kopiert. - LVM-LVs, ZFS-ZVOLs, Ceph/RBD, iSCSI und sonstige Block-/Netzwerk-Storage- Quellen werden nur dokumentiert. - Snapshot-Backing-Chains werden nicht automatisch aufgelöst. Referenzierte Backing-Dateien müssen selbst als Disk-Quelle in der Konfiguration vorkommen oder zusätzlich gesichert werden. - Firmwarepfade können sich zwischen Ubuntu und Debian unterscheiden. Bei OVMF-Fehlern das Domain-XML und die auf Debian installierten Firmwaredateien prüfen. - Nach dem Restore zuerst nur eine VM starten und insbesondere UEFI, virtuelles TPM, Secure Boot, BitLocker und Netzwerk testen. ## PAW-Netzwerk aus `50-paw-install.yml` (Version 1.2) Das Paket sichert jetzt zusätzlich die vom Playbook verwendete Konfiguration: - `/etc/NetworkManager/system-connections/` - `/etc/NetworkManager/dispatcher.d/` - `/etc/libvirt/qemu/networks/` - relevante sysctl-, UFW-, Routing- und `/hilden`-Dateien - aktuelle MAC von `br-lan` - permanente MACs und Hardwarepfade aller physischen Interfaces - Zuordnung der Bridge-Ports zu `br-lan` Das alte PAW-Profil bindet die Ports fest an `eth0` und `enp2s0f0`. Beim Restore werden diese Namen anhand der gesicherten permanenten MAC-Adressen auf die unter Debian tatsächlich vorhandenen Gerätenamen umgesetzt. Zusätzlich wird die bisher dynamische MAC von `br-lan` als `bridge.mac-address` im NetworkManager-Keyfile festgeschrieben. Empfohlene Reihenfolge auf Debian: ```bash # 1. 50-paw-install.yml ausführen # 2. VM- und Netzwerk-Restore vorbereiten, NetworkManager noch nicht neu starten sudo RESTORE_PAW_NETWORK=1 ./libvirt-restore.sh /mnt/backup/libvirt-host # 3. Profile kontrollieren sudo grep -R -E '^(interface-name|mac-address|master)=' \ /etc/NetworkManager/system-connections/ # 4. Nur lokal an der Konsole aktivieren sudo RESTORE_PAW_NETWORK=1 APPLY_PAW_NETWORK=1 \ ./libvirt-restore.sh /mnt/backup/libvirt-host ``` Alternativ kann nur der Netzwerkteil ausgeführt werden: ```bash sudo ./paw-network-backup.sh /mnt/backup/paw-network sudo ./paw-network-restore.sh /mnt/backup/paw-network sudo APPLY_NETWORK=1 ./paw-network-restore.sh /mnt/backup/paw-network ``` Der Netzwerk-Restore startet NetworkManager standardmäßig **nicht** neu. Das verhindert einen unbeabsichtigten Verbindungsabbruch bei einem Restore per SSH.