Storage-Unterschiede beim Abkoppeln benennen statt pauschal zu melden

Die Abhaengigkeit vom Quell-Snapshot ist eine Ceph-Eigenheit. Bisher meldete
flatten alles andere pauschal als "kein Ceph-Datentraeger" - das klingt nach
Einschraenkung, ist bei LVM-thin aber das Gegenteil.

Nachgemessen auf local-lvm: ein Thin-Snapshot teilt sich die Bloecke im Pool
(256 MB Nutzdaten liegen dort nur einmal), ist aber trotzdem eigenstaendig -
Quell-Snapshot und Original liessen sich loeschen, waehrend der Klon existiert,
und seine Pruefsumme blieb unveraendert. Dort gibt es also weder geschuetzte
Snapshots noch etwas zu flatten.

  lvmthin   nicht noetig, Klon ist von sich aus unabhaengig
  zfspool   nicht moeglich, ginge nur ueber zfs send | zfs recv
  rbd       noetig fuer den Dauerbetrieb
  lvm dick  PVE kann dort gar keine Snapshots

Der Hinweis in der Zusammenfassung richtet sich jetzt ebenfalls nach dem
Storage-Typ, statt immer zum Flatten zu raten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-07-31 19:41:18 +02:00
co-authored by Claude Opus 5
parent 09dcd4c572
commit 2c85011a08
3 changed files with 84 additions and 11 deletions
+33 -4
View File
@@ -256,6 +256,26 @@ def linked_volumes(proxmox, instance):
return linked
def flatten_hint(proxmox, volid):
"""Warum ein Datentraeger nicht abgekoppelt wird - je nach Storage.
Nur Ceph kennt das Problem ueberhaupt: dort haelt ein Klon seinen
Quell-Snapshot fest. Andere Storage-Typen loesen das anders oder gar nicht.
"""
storage = volid.split(":", 1)[0] if ":" in volid else ""
try:
kind = (proxmox._json(["get", "/storage/%s" % storage]) or {}).get("type", "")
except ProxmoxError:
kind = ""
if kind == "lvmthin":
return ("nicht noetig - Thin-Snapshots sind von sich aus unabhaengig; "
"Quell-Snapshot und Original lassen sich jederzeit loeschen")
if kind == "zfspool":
return ("nicht moeglich - ein ZFS-Klon haengt am Snapshot. Loesen ginge "
"nur ueber 'zfs send | zfs recv' in einen neuen Datentraeger")
return "kein Ceph-Datentraeger"
def flatten_cost(proxmox, instance):
"""Wieviele Bytes ein flatten kopieren muesste.
@@ -785,10 +805,19 @@ def plan(proxmox, guest, snapname, spec):
"vergroessern oder verkleinern - entweder --memory "
"weglassen oder --no-resume verwenden.")
if spec.mode == "recovery":
result.notes.append(
"Die Datentraeger sind Linked Clones - sie haengen am Quell-Snapshot, "
"der dadurch unloeschbar wird. Soll die Maschine dauerhaft laufen, "
"spaeter mit 'pvesnap-recovery flatten %d' loesen." % result.newid)
kinds = {_storage_info(proxmox, volid.split(":", 1)[0]).get("type")
for _key, volid, _size in result.disks}
if "rbd" in kinds:
result.notes.append(
"Die Datentraeger sind Linked Clones - auf Ceph haelt ein Klon "
"seinen Quell-Snapshot fest, der dadurch unloeschbar wird. Soll "
"die Maschine dauerhaft laufen, spaeter mit "
"'pvesnap-recovery flatten %d' loesen." % result.newid)
elif kinds <= {"lvmthin"}:
result.notes.append(
"Die Datentraeger sind Thin-Snapshots und damit von sich aus "
"unabhaengig - Quell-Snapshot und Original lassen sich jederzeit "
"loeschen. Ein Abkoppeln ist nicht noetig.")
if result.resume:
result.notes.append("Der Arbeitsspeicher (%s) wird kopiert; die Maschine "
"laeuft danach genau dort weiter, wo sie beim Snapshot "