pvesnap-recovery: Snapshots als Maschine starten

Zwei Betriebsarten:

  live      abgeschottet ohne Netzwerk - zum Hineinschauen ueber die
            noVNC-Konsole, Dump ziehen, Daten ueber ein Austauschlaufwerk
            herausholen
  recovery  mit Netzwerk und gleicher Identitaet (SMBIOS-UUID, vmgenid,
            MAC-Adressen, Hostname) - warnt, wenn das Original noch laeuft

Die Datentraeger werden ueber PVE::Storage::vdisk_clone geklont, also mit
derselben Funktion und Cluster-Sperre, die Proxmox selbst verwendet. Auf
Ceph/ZFS/LVM-thin ist das Copy-on-Write: 32 GiB waren im Test in 0,8s
geklont, das Original bleibt unberuehrt.

Enthaelt der Snapshot den Arbeitsspeicher, wird er mitkopiert - die Maschine
laeuft dann genau dort weiter, wo sie stand, statt zu booten. Dafuer muss die
Geraeteausstattung exakt passen:

  - vmgenid und smbios1 bleiben erhalten (ohne vmgenid bricht das Laden mit
    "Unknown savevm section" ab)
  - runningmachine/runningcpu werden uebernommen
  - die Netzwerkkarte wird abgeklemmt statt entfernt
  - das Austauschlaufwerk kommt erst nach dem Fortsetzen per Hotplug dazu,
    sonst bemerkt der Gast es nie (nachgewiesen ueber "info virtio-status")

Proxmox meldet einen fehlgeschlagenen RAM-Ladevorgang als TASK OK und laesst
die Maschine angehalten stehen - deshalb wird das Task-Protokoll mitgelesen,
fortgesetzt und deutlich gemeldet, wenn stattdessen kalt gebootet wurde.

Austausch mit dem Host: bei VMs eine formatierte Zusatzplatte, bei
Containern ein durchgereichtes Verzeichnis - dort passt auch ein bereits
eingehaengtes Netzlaufwerk.

Verworfen wird restlos, samt Aufheben des rbd-Snapshot-Schutzes, den das
Klonen setzt - sonst koennte die Vorhaltezeit den Snapshot nie mehr loeschen.
Angefasst wird nur, was den Tag pvesnap-recovery traegt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-31 11:38:38 +02:00
co-authored by Claude Opus 5
parent 8577b23b0c
commit 725fbf8732
6 changed files with 2486 additions and 6 deletions
+22 -1
View File
@@ -49,6 +49,27 @@ if [ "$YES" -eq 0 ]; then
esac
fi
# Laufende Wiederherstellungen sind echte VMs, deren Datentraeger an Snapshots
# haengen. Verschwindet pvesnap, laesst sich beides nicht mehr sauber aufloesen.
if [ -x "${BIN}-recovery" ]; then
RUNNING="$("${BIN}-recovery" list 2>/dev/null | tail -n +2 || true)"
if [ -n "$RUNNING" ]; then
warn "Es gibt noch Wiederherstellungen von pvesnap-recovery:"
printf '%s\n' "$RUNNING" >&2
warn "Bitte zuerst verwerfen: pvesnap-recovery destroy <VMID>"
warn "Sonst bleiben Klone und geschuetzte Snapshots zurueck, die die"
warn "Vorhaltezeit spaeter nicht mehr loeschen kann."
if [ "$YES" -eq 0 ]; then
printf 'Trotzdem weitermachen? [j/N] '
read -r answer
case "$answer" in
j|J|y|Y) ;;
*) echo "Abgebrochen."; exit 0 ;;
esac
fi
fi
fi
for unit in pvesnap.service pvesnap-web.service; do
if systemctl list-unit-files 2>/dev/null | grep -q "^${unit}"; then
info "Stoppe und deaktiviere ${unit}"
@@ -72,7 +93,7 @@ done
systemctl daemon-reload 2>/dev/null || true
systemctl reset-failed pvesnap.service pvesnap-web.service 2>/dev/null || true
for command in "$BIN" "${BIN}-explorer" "${BIN}-web"; do
for command in "$BIN" "${BIN}-explorer" "${BIN}-web" "${BIN}-recovery"; do
if [ -e "$command" ]; then
info "Entferne $command"
rm -f "$command"