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>
126 lines
4.0 KiB
Bash
Executable File
126 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# ---------------------------------------------------------------------
|
|
# pvesnap - Deinstallation
|
|
#
|
|
# ./uninstall.sh Programm und Dienst entfernen,
|
|
# Konfiguration und Zustand bleiben erhalten
|
|
# ./uninstall.sh --purge zusaetzlich /etc/pvesnap und /var/lib/pvesnap
|
|
# entfernen
|
|
#
|
|
# Bereits angelegte Snapshots werden NIE angeruehrt.
|
|
# ---------------------------------------------------------------------
|
|
set -euo pipefail
|
|
|
|
LIB_DIR="/usr/lib/pvesnap"
|
|
BIN="/usr/local/bin/pvesnap"
|
|
CONF_DIR="/etc/pvesnap"
|
|
STATE_DIR="/var/lib/pvesnap"
|
|
DOC_DIR="/usr/share/doc/pvesnap"
|
|
UNIT="/etc/systemd/system/pvesnap.service"
|
|
WEB_UNIT="/etc/systemd/system/pvesnap-web.service"
|
|
|
|
PURGE=0
|
|
YES=0
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--purge) PURGE=1 ;;
|
|
-y|--yes) YES=1 ;;
|
|
-h|--help) sed -n '2,11p' "$0" | sed 's/^#[[:space:]]\{0,1\}//'; exit 0 ;;
|
|
*) echo "Unbekannte Option: $arg" >&2; exit 1 ;;
|
|
esac
|
|
done
|
|
|
|
info() { printf '\033[1;32m==>\033[0m %s\n' "$*"; }
|
|
warn() { printf '\033[1;33m==>\033[0m %s\n' "$*" >&2; }
|
|
fail() { printf '\033[1;31m==>\033[0m %s\n' "$*" >&2; exit 1; }
|
|
|
|
[ "$(id -u)" -eq 0 ] || fail "Bitte als root ausfuehren (sudo ./uninstall.sh)."
|
|
|
|
if [ "$YES" -eq 0 ]; then
|
|
if [ "$PURGE" -eq 1 ]; then
|
|
printf 'pvesnap inklusive Konfiguration und Zustand entfernen? [j/N] '
|
|
else
|
|
printf 'pvesnap entfernen (Konfiguration bleibt erhalten)? [j/N] '
|
|
fi
|
|
read -r answer
|
|
case "$answer" in
|
|
j|J|y|Y) ;;
|
|
*) echo "Abgebrochen."; exit 0 ;;
|
|
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}"
|
|
systemctl stop "$unit" 2>/dev/null || true
|
|
systemctl disable "$unit" 2>/dev/null || true
|
|
fi
|
|
done
|
|
|
|
# Eingebundene Snapshots loesen, bevor das Programm verschwindet.
|
|
if [ -x "${BIN}-explorer" ]; then
|
|
info "Haenge eventuell eingebundene Snapshots aus"
|
|
"${BIN}-explorer" --cleanup >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
for unit in "$UNIT" "$WEB_UNIT"; do
|
|
if [ -f "$unit" ]; then
|
|
info "Entferne $unit"
|
|
rm -f "$unit"
|
|
fi
|
|
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" "${BIN}-recovery"; do
|
|
if [ -e "$command" ]; then
|
|
info "Entferne $command"
|
|
rm -f "$command"
|
|
fi
|
|
done
|
|
if [ -d "$LIB_DIR" ]; then
|
|
info "Entferne $LIB_DIR"
|
|
rm -rf "$LIB_DIR"
|
|
fi
|
|
rm -rf "$DOC_DIR"
|
|
rm -f /run/pvesnap.lock /run/pvesnap.lock.daemon
|
|
|
|
if [ "$PURGE" -eq 1 ]; then
|
|
info "Entferne Konfiguration und Zustand"
|
|
rm -rf "$CONF_DIR" "$STATE_DIR"
|
|
else
|
|
warn "Behalten: $CONF_DIR und $STATE_DIR (mit --purge ebenfalls entfernen)"
|
|
fi
|
|
|
|
cat <<EOF
|
|
|
|
pvesnap wurde entfernt.
|
|
|
|
Bereits vorhandene Snapshots bleiben bestehen. Auflisten und loeschen lassen
|
|
sie sich weiterhin in der Proxmox-Oberflaeche oder mit:
|
|
|
|
qm listsnapshot <VMID> / qm delsnapshot <VMID> <NAME>
|
|
pct listsnapshot <VMID> / pct delsnapshot <VMID> <NAME>
|
|
EOF
|