Handbuch auf MkDocs-Basis, mit Bildschirmfotos aus dem Programm

26 Kapitel in vier Teilen, in der Reihenfolge, in der man sie braucht:
erst sichern, dann Dateien holen, dann ganze Maschinen wiederherstellen,
dahinter der Nachschlagteil.

Gebaut wird mit MkDocs + Material. Bewusst ohne Netzabhaengigkeiten:
keine Schriften vom CDN (font: false), Volltextsuche mit deutschem
Stemming liegt neben den Seiten. Im Notfall steht vielleicht das halbe
Netz - dann nuetzt eine Doku im Internet nichts.

  handbuch/bauen.sh              baut handbuch/site/
  handbuch/bauen.sh ansehen      Vorschau auf 127.0.0.1:8000

install.sh nimmt das gebaute Handbuch mit nach
/usr/share/doc/pvesnap/handbuch/ - falls es vorliegt. Auf dem Host selbst
wird nichts gebaut, mkdocs gehoert nicht auf einen Hypervisor.

Die 28 Bildschirmfotos sind nicht abfotografiert, sondern erzeugt: Der
echte Programmcode laeuft in einem Pseudo-Terminal gegen einen erfundenen
Proxmox-Host (Attrappen fuer pvesh, perl und rbd), pyte baut den Bildschirm
nach, heraus faellt ein SVG. Damit stimmen sie garantiert mit dem Programm
ueberein, sind reproduzierbar und enthalten keine echten Daten. Die
Werkstatt dafuer liegt unter handbuch/werkstatt/ samt LIESMICH.md.

Nebenbei: die Schlussmeldung von install.sh warb noch mit --exchange,
das mit dem eingebauten Austauschlaufwerk weggefallen ist.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-08-09 12:39:30 +02:00
co-authored by Claude Opus 5
parent c484596702
commit 59e7224297
72 changed files with 7355 additions and 2 deletions
+176
View File
@@ -0,0 +1,176 @@
# Damit arbeiten
++enter++ auf einer Maschine in der Übersicht öffnet die Detailansicht. Das ist
der Bildschirm, auf dem man im Ernstfall die meiste Zeit verbringt:
![Die Detailansicht](../bilder/recovery-detail.svg)
| Taste | |
|---|---|
| ++s++ | starten |
| ++h++ | [herunterfahren](#herunterfahren) |
| ++e++ | [Austauschlaufwerk auswerfen / einklinken](transfer.md#im-laufenden-betrieb-wechseln) |
| ++v++ | [Austauschlaufwerke verwalten](transfer.md) |
| ++p++ | [SPICE und USB](dongle.md#nachtraglich-umstellen) |
| ++f++ | [vom Quell-Snapshot lösen](loesen.md) |
| ++x++ | [verwerfen](verwerfen.md) |
| ++q++ | zurück |
---
## An die Konsole kommen
In der Detailansicht steht die fertige Adresse:
```
https://10.20.0.11:8006/?console=kvm&novnc=1&vmid=9101&node=pve1&resize=off&cmd=
```
Dasselbe liefert `pvesnap-recovery console 9101`. Es ist die ganz normale
noVNC-Konsole von Proxmox — die Maschine taucht auch in der Weboberfläche auf,
markiert mit dem Tag `pvesnap-recovery`.
Bei Containern geht zusätzlich `pct enter 9101` auf dem Host.
!!! info "Warum eine IP-Adresse und kein Name?"
Vorne steht bewusst die **IP** des Nodes, nicht sein Name: Auf dem
Proxmox-Host löst der Name auf, am Arbeitsplatz meist nicht. Sie kommt aus
`/etc/pve/.members`.
Der Node hinter `node=` bleibt der Name — so erwartet Proxmox ihn.
Für SPICE und USB-Weiterleitung siehe [Dongle und USB](dongle.md).
---
## Was man drinnen tut
Die Maschine ist voll beschreibbar. Alles, was man an einer echten Maschine
täte, geht auch hier — nur eben ohne Netz.
Der typische Ablauf für eine Datenbank:
<div class="ablauf" markdown>
**1.** Im Gast prüfen, ob der Dienst läuft — mit geladenem Arbeitsspeicher ist
er bereits offen
**2.** Dump schreiben, auf das [Austauschlaufwerk](transfer.md):
`pg_dump -Fc kunden > /media/DUMPS/kunden.dump`
**3.** Im Gast aushängen (`umount`, unter Windows „Auswerfen")
**4.** In pvesnap ++e++ — Laufwerk auswerfen
**5.** ++v++ ++enter++ — Commander auf das Laufwerk, Dump abholen
**6.** ++x++ — Maschine verwerfen
</div>
Schritt 3 ist der, den man vergisst. Mehr dazu unter
[Austauschlaufwerke](transfer.md#im-laufenden-betrieb-wechseln).
---
## Herunterfahren
Taste ++h++ fährt **sauber** herunter — und schaltet nicht von selbst hart ab.
Weigert sich der Gast, kommt eine Wahl:
| | |
|---|---|
| **Im Gast selbst herunterfahren** | pvesnap wartet und meldet, wenn sie aus ist |
| **Hart ausschalten** | wie Stecker ziehen, mit ausdrücklicher Bestätigung |
| **Abbrechen** | läuft weiter |
!!! quote "Warum nicht einfach nach 60 Sekunden abschalten?"
Weil ein stilles Abschalten nach Zeitablauf ein Stromausfall mit Ansage
wäre — und genau der Grund, warum ein Dateisystem hinterher unsauber ist.
Wenn man gerade dabei ist, aus einer Maschine konsistente Daten zu holen,
ist das die falsche Voreinstellung.
Beim Warten zeigt pvesnap, was zu tun ist, und verfolgt den Zustand:
```
Bitte jetzt IM GAST herunterfahren.
Windows Start -> Ein/Aus -> Herunterfahren
Linux poweroff bzw. shutdown -h now
Zustand: running seit 1:23
```
++q++ bricht das Warten ab — die Maschine läuft dann weiter.
---
## Neu starten
Ein Neustart wird nötig, wenn sich die [Grafikkarte ändert](dongle.md) — also
beim Ein- oder Ausschalten von SPICE. Dann kommt dieselbe Wahl:
![Wie soll die Maschine neu starten?](../bilder/recovery-neustartwahl.svg)
| | |
|---|---|
| **Ich fahre im Gast herunter** | pvesnap wartet, startet danach selbst wieder — **der verlässliche Weg** |
| **Proxmox herunterfahren lassen (ACPI)** | klappt bei Linux, bei Windows oft nicht |
| **Gar nicht** | später selbst; die Änderung greift beim nächsten Start |
!!! warning "ACPI und Windows"
Bei Linux funktioniert der ACPI-Aus-Knopf zuverlässig. Windows blockt ihn
gern: Dort hält eine Anwendung den Vorgang auf, oder der Shutdown Event
Tracker fragt nach einem Grund und wartet auf eine Eingabe, die nie kommt.
Wer im Gast selbst herunterfährt, umgeht das. Deshalb steht dieser Weg an
erster Stelle.
!!! danger "Ein Neustart *im* Gast hilft nicht"
Dabei setzt sich nur die Maschine zurück — der QEMU-Prozess läuft weiter,
mit der alten Grafikkarte. Es braucht wirklich den Umweg über „aus und
wieder an".
### Der geladene Arbeitsspeicher ist danach weg
!!! danger "Endgültig"
Proxmox gibt den kopierten Arbeitsspeicher schon beim **ersten** Start
wieder frei. Ein zweiter Start bootet also kalt — offene Programme und
ungespeicherte Daten sind dann verloren.
pvesnap warnt vorher ausdrücklich, wenn eine Maschine mit geladenem
Arbeitsspeicher neu starten soll:
![Warnung vor dem Neustart](../bilder/recovery-neustart.svg)
Wer den warmen Zustand braucht, erledigt seine Arbeit also **vor** dem ersten
Neustart — oder verzichtet gleich mit `--no-resume` darauf und bootet kalt.
---
## Starten und Stoppen von außen
```bash
pvesnap-recovery start 9101
pvesnap-recovery stop 9101
pvesnap-recovery list
pvesnap-recovery console 9101
```
`list` zeigt dieselbe Tabelle wie die Übersicht:
```
Maschine Zustand Node Herkunft Modus
VM 9101 running pve1 VM 101 @ auto-stuendlich-20260809-… live
VM 9102 stopped pve2 VM 105 @ auto-taeglich-20260809-02… recover
```
Steht in der Spalte **Zustand** ein `weg`, wurde die Maschine außerhalb von
pvesnap entfernt — dann hilft [`cleanup`](verwerfen.md#cleanup).
+176
View File
@@ -0,0 +1,176 @@
# Dongle und USB
Eine abgeschottete Maschine hat kein Netzwerk. Ein Software-Schutzmodul hängt
sonst an einem USB-Server im Netz — der ist damit unerreichbar. Und ohne
Lizenzprüfung startet die Warenwirtschaft nicht, aus der man gerade Daten holen
wollte.
**SPICE löst das.** Die USB-Weiterleitung kommt vom **Rechner des Bedieners**,
nicht über das Gastnetz. Die Maschine bleibt also vollständig abgeschottet und
hat trotzdem ihren Dongle.
```
Dein Arbeitsplatz Proxmox-Host Gast
Dongle am USB ──SPICE──► QEMU ──virtuell──► "USB-Gerät"
remote-viewer (kein Netz nötig)
```
---
## Einrichten
Beim Anlegen in der [Optionsmaske](einrichten.md#die-optionsmaske) die beiden
Felder setzen — oder direkt:
```bash
pvesnap-recovery live 105 --usb 2 --no-resume
```
`--usb` schaltet `--spice` automatisch mit ein.
Die Zusammenfassung sagt dann, was zu tun ist:
![Vorhaben mit SPICE und USB](../bilder/dongle-vorhaben.svg)
---
## Verbinden
```bash
pvesnap-recovery spice 9104 -o vm.vv # Verbindungsdatei erzeugen
scp root@10.20.0.12:vm.vv . # auf den Arbeitsplatz holen
remote-viewer vm.vv # öffnen
```
Ohne `-o` wird die Datei auf die Standardausgabe geschrieben — praktisch für
eine Pipeline:
```bash
ssh root@pve2 pvesnap-recovery spice 9104 > vm.vv && remote-viewer vm.vv
```
Im **remote-viewer** dann unter **Datei → USB-Geräteauswahl** das Gerät
anhaken. Es taucht sofort im Gast auf.
!!! success "Guest-Tools braucht es dafür nicht"
Der Dongle erscheint im Gast als gewöhnliches USB-Gerät; QEMU und der
SPICE-Client machen die Arbeit.
Die Guest-Tools (`tools/get-guest-tools.sh` holt virtio-win auf einen
ISO-Storage) sind nur für Zwischenablage, automatische Auflösung und
Mauszeiger nützlich. Für den Dongle sind sie überflüssig.
Die Verbindungsdatei ist **kurzlebig**: Das darin enthaltene Kennwort gilt nur
für wenige Sekunden. Sie muss also zeitnah nach dem Erzeugen benutzt werden —
nicht am Vortag vorbereiten.
---
## Zwei Dinge, die man vorher wissen sollte
### USB braucht SPICE
Ohne `vga: qxl` legt QEMU die Weiterleitungen zwar an, aber es gibt keinen
Kanal, der sie transportiert — die Maschine startet dann mit `no spice port`
gar nicht erst.
Deshalb schaltet `--usb` die Anzeige automatisch mit ein.
Umgekehrt gilt das nicht: Wer SPICE **ausschaltet**, verliert die USB-Anschlüsse
mit — ohne Kanal wären sie ohnehin wirkungslos. pvesnap sagt das dazu, statt sie
stillschweigend stehen zu lassen.
### SPICE und geladener Arbeitsspeicher schließen sich aus
Das ist der unangenehme Teil, und er hängt davon ab, was im **Original** steht:
| Original | warmer RAM-Zustand | SPICE + Dongle |
|---|---|---|
| `vga: std` (Vorgabe) | ✅ | nur mit `--no-resume` |
| `vga: qxl` | ✅ | ✅ **gleichzeitig** |
Der Grund: `qxl` bringt 64 MB Grafikspeicher mit, die Vorgabe 16. Der
gespeicherte Zustand passt dann nicht mehr, und das Laden bricht ab:
```
Size mismatch: vga.vram
```
Die Maschine bleibt danach angehalten stehen, während Proxmox `TASK OK` meldet.
`pvesnap-recovery` lehnt die Kombination deshalb von vornherein ab und nennt die
Auswege.
!!! tip "Der Griff, der sich lohnt — für Produktivmaschinen"
Setz auf Maschinen, die ein Schutzmodul brauchen, **einmal** `vga: qxl`:
```bash
qm set 105 --vga qxl
```
Dann tragen alle künftigen Snapshots es mit, und im Ernstfall gibt es
warmen RAM-Zustand **und** Dongle gleichzeitig.
**Nachträglich lässt sich das bei einem vorhandenen Snapshot nicht mehr
reparieren** — der gespeicherte Zustand enthält die alte Grafikkarte. Es ist
also eine Entscheidung, die man vorher trifft oder gar nicht.
Auf der Produktivmaschine kostet `qxl` nichts außer ein paar Megabyte
Grafikspeicher.
---
## Nachträglich umstellen
Taste ++p++ in der [Detailansicht](arbeiten.md) ändert SPICE und USB auch an
einer bestehenden Maschine:
![SPICE ein- oder ausschalten](../bilder/recovery-spice.svg)
Dann die Zahl der Anschlüsse:
![Wie viele USB-Anschlüsse?](../bilder/recovery-usb.svg)
| Änderung | |
|---|---|
| **SPICE ein oder aus** | **Neustart nötig** — die Grafikkarte lässt sich im Betrieb nicht wechseln |
| **USB dazu oder weg** | sofort, solange der SPICE-Kanal schon steht |
Ist ein Neustart nötig, warnt pvesnap vorher deutlich:
![Warnung vor dem nötigen Neustart](../bilder/recovery-neustart.svg)
… und lässt danach die Wahl, **wie** neu gestartet wird — siehe
[Damit arbeiten](arbeiten.md#neu-starten).
!!! danger "Bei geladenem Arbeitsspeicher"
Der ist nach dem Neustart **endgültig weg**. Wer SPICE nachrüstet, um an
den Dongle zu kommen, verliert also genau den warmen Zustand, wegen dem er
vielleicht überhaupt mit `--resume` gestartet ist.
Deshalb: die Entscheidung möglichst **vor** dem ersten Start treffen.
Höchstens **14 Anschlüsse** sind möglich — mehr sieht QEMU nicht vor. Für einen
Dongle reicht einer; zwei sind bequem, wenn man zusätzlich einen USB-Stick
durchreichen will.
---
## Wenn der Dongle nicht auftaucht
| Symptom | woran es liegt |
|---|---|
| Kein Eintrag unter „USB-Geräteauswahl" | Der `remote-viewer` läuft auf dem falschen Rechner — er muss dort laufen, wo der Dongle steckt. |
| Maschine startet nicht, `no spice port` | `vga: qxl` fehlt. In der Detailansicht ++p++ → SPICE ein. |
| Gerät angehakt, im Gast nichts | Manche Dongles brauchen im Gast einen Treiber. Der gehört auf ein [Austauschlaufwerk](transfer.md). |
| `.vv`-Datei wird abgewiesen | Sie ist zu alt — neu erzeugen, das Kennwort gilt nur kurz. |
| Unter Linux fehlt `remote-viewer` | Paket `virt-viewer` installieren. |
!!! note "Der Dongle bleibt am Arbeitsplatz"
Er wird nicht in den Host gesteckt und nicht ins Netz gehängt. Genau das ist
der Punkt: Der Weg führt über die SPICE-Verbindung, die ohnehin schon
zwischen Arbeitsplatz und Maschine besteht — und nicht über ein Netz, das
die abgeschottete Maschine gar nicht hat.
@@ -0,0 +1,188 @@
# Eine Maschine einrichten
```bash
pvesnap-recovery
```
Dann ++n++ in der Übersicht. Der Assistent fragt nacheinander nach Gast und
Snapshot — dieselben Auswahlfenster wie im
[Explorer](../holen/explorer.md#1-welcher-gast) — und landet dann in der
Optionsmaske.
---
## Die Optionsmaske
![Die Optionsmaske](../bilder/recovery-optionen.svg)
Pfeiltasten bewegen sich, ++enter++ oder ++space++ ändert ein Feld. Unten steht
zu jedem Feld eine Erklärung — man muss also nichts auswendig wissen.
| Taste | |
|---|---|
| ++enter++ ++space++ | Feld ändern |
| ++v++ | [Austauschlaufwerke verwalten](transfer.md) — ohne die Maske zu verlassen |
| ++f10++ | anlegen |
| ++q++ | abbrechen |
### Betriebsart
![Die Wahl der Betriebsart](../bilder/recovery-betriebsart.svg)
| | |
|---|---|
| **live** | abgeschottet, ohne Netzwerk. Zum Hineinschauen. |
| **recovery** | mit Netzwerk und gleicher Identität. Siehe [Mit Netzwerk](netzwerk.md). |
### Die übrigen Felder
| Feld | Vorgabe | |
|---|---|---|
| **Netzwerk** | automatisch (nach Modus) | `keine Karte` / `Karte ohne Leitung` / `am Netz` — überschreibt die Vorgabe der Betriebsart |
| **Arbeitsspeicher** | wenn im Snapshot vorhanden | mit `nein` bootet die Maschine kalt |
| **Transfer-Laufwerke** | — | [Austauschlaufwerke](transfer.md), mehrere möglich |
| **SPICE-Anzeige** | nein | zusätzlich zu noVNC, nötig für [USB](dongle.md) |
| **USB-Weiterleitung** | keine | Anzahl der Anschlüsse; schaltet SPICE mit ein |
| **Neue VMID** | nächste freie | |
| **Node** | der des Originals | bei lokalem Storage nicht änderbar |
| **Danach starten** | ja | mit `nein` nur einrichten |
---
## Austauschlaufwerke auswählen
Auf dem Feld **Transfer-Laufwerke** öffnet ++enter++ die Mehrfachauswahl:
![Austauschlaufwerke auswählen](../bilder/transfer-auswahl.svg)
++space++ wählt aus, ++enter++ übernimmt. Belegte Laufwerke lassen sich nicht
anhängen — sie sind entweder am Host eingehängt oder stecken schon in einer
anderen Maschine. Warum das so streng ist, steht unter
[Austauschlaufwerke](transfer.md#host-oder-gast-nie-beides).
Fehlt noch eins, führt ++v++ direkt in die Verwaltung und wieder zurück.
---
## Die Zusammenfassung
++f10++ zeigt, was passieren wird — **bevor** etwas passiert:
![Das Vorhaben prüfen](../bilder/recovery-vorhaben.svg)
Hier lohnt sich das Lesen. Vier Arten von Zeilen stehen darin:
| | |
|---|---|
| **Klone** | welche Datenträger geklont werden, mit Größe |
| **Hinweise** (`-`) | was pvesnap von sich aus angepasst hat und warum |
| **ACHTUNG** | Dinge, die man wissen sollte, die aber in Ordnung sind |
| **GEFAHR** | Dinge, die so nicht gehen — siehe [Mit Netzwerk](netzwerk.md) |
Im Bild sind es drei Hinweise, die je einen Sachverhalt erklären:
> *Netzwerkkarte bleibt vorhanden, aber abgeklemmt (link_down): mit geladenem
> Arbeitsspeicher darf sich die Geräteausstattung nicht ändern.*
Die Karte zu entfernen würde den gespeicherten RAM-Zustand unbrauchbar machen —
also bleibt sie drin, und stattdessen wird die Leitung gekappt.
> *Proxmox gibt den kopierten Arbeitsspeicher nach dem ersten Start wieder frei
> — ein späterer Neustart bootet dann kalt.*
Der warme Zustand ist **einmalig**. Wer ihn braucht, sollte gleich beim ersten
Start damit arbeiten.
Mit ++j++ geht es los, mit ++n++ zurück.
---
## Auf der Kommandozeile
```bash
pvesnap-recovery live 101 # neuester Snapshot
pvesnap-recovery live 101 auto-stuendlich-20260809-100000 # ein bestimmter
pvesnap-recovery live 101 --newid 9103 --transfer werkzeuge -y
```
Ohne Snapshot-Namen wird der neueste brauchbare genommen.
| Parameter | Bedeutung |
|---|---|
| `--newid <ID>` | VMID der neuen Maschine (Vorgabe: nächste freie) |
| `--node <name>` | auf welchem Node sie laufen soll |
| `--net none\|down\|on` | keine Karte / Karte ohne Leitung / voll am Netz |
| `--resume` / `--no-resume` | Arbeitsspeicher laden bzw. bewusst kalt starten |
| `--transfer <name>` | Austauschlaufwerk anhängen (mehrfach möglich) |
| `--spice` | SPICE-Anzeige (`vga: qxl`), zusätzlich zu noVNC |
| `--usb <n>` | so viele USB-Weiterleitungen über SPICE (schaltet `--spice` mit ein) |
| `--iso <volid>` | Abbild als CD einlegen, z. B. `local:iso/virtio-win.iso` |
| `--memory <MB>`, `--cores <n>` | abweichende Ausstattung (nicht mit `--resume`) |
| `--name <name>` | Name der neuen Maschine |
| `--keep-binds` | durchgereichte Host-Verzeichnisse des Originals übernehmen |
| `--no-start` | nur einrichten, nicht starten |
| `-y`, `--yes` | Routinefragen überspringen |
| `--force` | auch anlegen, wenn das Original noch läuft |
Ohne `-y` wird die Zusammenfassung angezeigt und nachgefragt. Ein Probelauf ist
das aber nicht — wer nur sehen will, was geschähe, bricht an der Rückfrage ab.
!!! danger "`-y` deckt `--force` nicht ab"
`-y` überspringt **Routinefragen**. Es winkt nicht durch, dass eine
Wiederherstellung mit Netzwerk startet, während das Original läuft — das
verlangt ausdrücklich `--force`. Siehe [Mit Netzwerk](netzwerk.md).
---
## Was dabei angelegt wird
1. **Klone** aller Datenträger des Snapshots (`PVE::Storage::vdisk_clone`)
2. eine **Konfigurationsdatei** unter `/etc/pve/nodes/<node>/qemu-server/<id>.conf`
3. der **Tag** `pvesnap-recovery` an der neuen Maschine
4. ein Eintrag in der Merkliste `/var/lib/pvesnap/recovery.json`
Geht dabei etwas schief, wird **alles wieder abgeräumt** — es bleiben keine
halben Klone liegen.
!!! info "Auf Ceph wird der Quell-Snapshot geschützt"
RBD verlangt für einen Klon, dass der Quell-Snapshot geschützt ist
(`rbd snap protect`); Proxmox setzt das beim Klonen selbst.
Solange die Wiederherstellung existiert, ist ihr Quell-Snapshot damit
**unlöschbar** — die [Vorhaltezeit](../sichern/vorhaltezeit.md) kommt an ihm
nicht vorbei. Beim [Verwerfen](verwerfen.md) wird der Schutz wieder
aufgehoben.
Das ist der Grund, eine Wiederherstellung nicht länger stehen zu lassen als
nötig — oder sie mit [`flatten`](loesen.md) zu lösen.
---
## Was übernommen wird und was nicht
**Übernommen:** SMBIOS-UUID, `vmgenid`, MAC-Adressen, CPU- und
Speicherausstattung, Bootreihenfolge, alle Datenträger als Klone, bei Containern
der Hostname.
**Weggelassen:**
| | warum |
|---|---|
| `onboot`, `startup` | eine Wiederherstellung soll nicht beim nächsten Hostneustart von selbst hochkommen |
| `protection` | sie soll sich verwerfen lassen |
| `replicate` | sonst würde der Klon auf andere Nodes repliziert |
| `hookscript` | fremde Skripte laufen nicht ungefragt in der Kopie |
| `description`, `tags` | wird durch die eigenen ersetzt |
| durchgereichte Host-Verzeichnisse | nur mit `--keep-binds` |
| `parent`, `snaptime`, `snapstate` | gehören zum Snapshot, nicht zur Maschine |
!!! warning "`--keep-binds` mit Bedacht"
Reicht das Original ein Host-Verzeichnis in den Container durch, sieht die
Wiederherstellung mit `--keep-binds` **dieselben, echten Daten** — nicht
deren Stand vom Snapshot. Und sie kann hineinschreiben.
Ohne die Option bleibt das Verzeichnis weg; in der Zusammenfassung steht
dann, was weggelassen wurde.
+179
View File
@@ -0,0 +1,179 @@
# Wiederherstellen
Manchmal reicht es nicht, einzelne Dateien herauszukopieren.
Eine Datenbank liegt im Snapshot als Haufen halbfertiger Dateien — brauchbar
wird sie erst, wenn der Datenbankserver läuft und selbst einen Dump schreibt.
Eine Warenwirtschaft prüft beim Start ihre Lizenz. Ein Verzeichnisdienst ist
ohne laufende Maschine überhaupt nicht zu befragen.
`pvesnap-recovery` startet den Snapshot deshalb als **eigenständige Maschine**
ohne das Original anzufassen.
![Übersicht der Wiederherstellungen](../bilder/recovery-uebersicht.svg)
---
## Zwei Betriebsarten
| | **live** | **recovery** |
|---|---|---|
| Netzwerk | keins | volles Netz |
| Identität | bleibt (UUID, MACs, Hostname) | bleibt (UUID, MACs, Hostname) |
| Wofür | hineinschauen, Dump ziehen, Daten holen | die Maschine wirklich wieder in Betrieb nehmen |
| Risiko | keins — sie kann nichts erreichen | hoch, solange das Original läuft |
**Der Unterschied ist ausschließlich das Netzwerk** — und die Zahl der
Sicherheitsabfragen. An den Datenträgern ändert der Modus nichts; beide klonen
gleich.
`live` ist der Normalfall. Die Maschine ist vollständig abgeschottet: Sie kann
nichts erreichen und niemanden stören, auch wenn sie dieselbe IP-Adresse
konfiguriert hat wie das noch laufende Original. Daten kommen über ein
[Austauschlaufwerk](transfer.md) heraus.
`recovery` ist der Ernstfall — und gefährlich, solange das Original läuft.
Details unter [Mit Netzwerk](netzwerk.md).
---
## Warum das schnell geht
Die Datenträger werden nicht kopiert, sondern **geklont**. Auf Ceph/RBD, ZFS und
LVM-thin ist das ein Copy-on-Write-Klon: fertig in Sekunden, egal wie groß die
Platte ist, und anfangs ohne zusätzlichen Platzbedarf.
```
Klon ~1 s egal ob 32 GB oder 2 TB
Start Sekunden mit RAM-Zustand sofort im laufenden Zustand
Arbeiten ab jetzt voll beschreibbar
```
Eine 32-GB-Platte war im Test nach **0,8 Sekunden** geklont.
Dafür wird `PVE::Storage::vdisk_clone` benutzt — dieselbe Funktion, die auch
Proxmox selbst für Klone verwendet, samt Cluster-Sperre auf dem Storage. Es
wird nichts nachgebaut, was Proxmox schon kann.
!!! info "Kein „Live-Restore"— besser"
Beim Live-Restore eines Backup-Servers liegt die Sicherung auf einem anderen
Medium: Die VM startet zwar sofort, holt die Blöcke aber im Hintergrund
übers Netz nach und läuft bis dahin gebremst.
Hier wird **gar nichts nachgeladen**. Der Klon liegt im selben Pool und ist
aus Sicht des Gastes von Sekunde eins an vollständig — bei voller
Geschwindigkeit. Bei einer 2-TB-VM wird also nicht stundenlang kopiert und
dann gestartet; gearbeitet wird ab der ersten Sekunde.
!!! warning "Nicht auf jedem Storage"
Auf Datei-Storages (`dir`, `nfs`, `cifs`) geht das nicht — aus einem
qcow2-internen Snapshot lässt sich kein Klon ziehen. Für diese Storages
bleibt der Weg über den [Explorer](../holen/explorer.md).
Was welches Storage kann, steht unter
[Speicherarten](../nachschlagen/speicher.md).
---
## Der Arbeitsspeicher kommt mit
Enthält der Snapshot den Arbeitsspeicher (`vmstate = yes` in der Gruppe), wird
er mitgenommen. Die Maschine **bootet dann nicht**, sondern läuft genau dort
weiter, wo sie beim Snapshot stand:
* kein Crash-Recovery, kein `fsck`, kein Journal-Rollback
* Datenbanken sind bereits offen und konsistent
* die Uhr im Gast steht auf dem Snapshot-Zeitpunkt
Im Test war das gut zu sehen: Die Konsole zeigte 10:38 — die Uhrzeit des
Snapshots — während auf dem Host längst 11:24 war.
Damit das klappt, muss die Geräteausstattung **exakt** zum gespeicherten Zustand
passen. `pvesnap-recovery` sorgt selbst dafür:
| | |
|---|---|
| `vmgenid`, `smbios1` | bleiben erhalten — fehlen sie, bricht das Laden mit `Unknown savevm section or instance 'vmgenid'` ab |
| `runningmachine`, `runningcpu` | werden aus dem Snapshot übernommen |
| Netzwerkkarte | bleibt **vorhanden**, wird aber abgeklemmt (`link_down=1`) statt entfernt |
| Austauschlaufwerke | werden erst **nach** dem Fortsetzen angesteckt (Hotplug) — der Gast wacht in einem Zustand auf, in dem es die Platte noch nicht gab |
!!! note "Ein Detail, das Proxmox nicht selbst meldet"
Schlägt das Laden des Arbeitsspeichers fehl, quittiert Proxmox den Start
trotzdem mit `TASK OK` und lässt die Maschine angehalten stehen.
`pvesnap-recovery` liest das Task-Protokoll mit, setzt die Maschine fort und
sagt deutlich, wenn statt des RAM-Standes kalt gebootet wurde.
Mit `--no-resume` lässt sich der Arbeitsspeicher bewusst weglassen — etwa, wenn
[SPICE](dongle.md) gebraucht wird, das sich damit ausschließt.
---
## Der übliche Ablauf
<div class="ablauf" markdown>
**1.** [Austauschlaufwerk vorbereiten](transfer.md) — *vorher*, in Ruhe
**2.** [Maschine einrichten](einrichten.md) — Snapshot wählen, Optionen prüfen, anlegen
**3.** [Damit arbeiten](arbeiten.md) — noVNC-Konsole, Dump ziehen, Laufwerk auswerfen
**4.** [Verwerfen](verwerfen.md) — oder [dauerhaft übernehmen](loesen.md)
</div>
Bedient wird alles entweder über die ncurses-Oberfläche:
```bash
pvesnap-recovery
```
… oder direkt über Parameter:
```bash
pvesnap-recovery live 101 # neuester Snapshot, abgeschottet
pvesnap-recovery live 101 auto-stuendlich-20260809-100000
pvesnap-recovery recover 101 --newid 9101 # mit Netzwerk
pvesnap-recovery list
pvesnap-recovery destroy 9101
```
Vollständig unter [Alle Befehle](../nachschlagen/befehle.md#pvesnap-recovery).
---
## Was in der Übersicht steht
| Spalte | |
|---|---|
| **Maschine** | die neue VMID |
| **Zustand** | `running`, `stopped` — oder `weg`, wenn sie außerhalb von pvesnap entfernt wurde |
| **Node** | auf welchem Cluster-Knoten sie läuft |
| **Herkunft** | Original-VMID und Snapshot, aus dem sie stammt |
| **Modus** | `live` oder `recover` |
| Taste | |
|---|---|
| ++enter++ | [Detailansicht](arbeiten.md) |
| ++n++ | [neue Wiederherstellung](einrichten.md) |
| ++s++ / ++h++ | starten / herunterfahren |
| ++x++ | [verwerfen](verwerfen.md) |
| ++v++ | [Austauschlaufwerke](transfer.md) |
| ++r++ | Liste neu einlesen |
| ++q++ | Ende |
!!! tip "Wiederhergestellte Maschinen tragen einen Tag"
Jede von `pvesnap-recovery` angelegte Maschine bekommt in Proxmox den Tag
**`pvesnap-recovery`**. Daran erkennt man sie in der Weboberfläche — und
daran erkennt `destroy`, dass es sie anfassen darf. Eine von Hand angelegte
VM lässt sich damit nicht versehentlich löschen.
Der Tag ist auch der Grund, warum
`exclude_tags = nosnap, pvesnap-recovery` in jede `all`-Gruppe gehört, siehe
[Auswahl](../sichern/auswahl.md#ausschlusse).
+194
View File
@@ -0,0 +1,194 @@
# Vom Snapshot lösen
Ein Linked Clone hängt für immer am Quell-Snapshot. Fürs Hineinschauen ist das
ideal — es kostet nichts und geht in Sekunden. Für eine **dauerhaft übernommene**
Maschine ist es ein Problem:
* der Quell-Snapshot lässt sich nicht mehr löschen — die
[Vorhaltezeit](../sichern/vorhaltezeit.md) scheitert mit
`snapshot is protected`
* die Original-VM muss mitsamt ihrer Platte bestehen bleiben
* der Klon wächst ohnehin mit jedem Schreibvorgang
Die Detailansicht sagt, woran man ist:
![Linked Clone in der Detailansicht](../bilder/recovery-detail.svg)
```
Datentraeger: Linked Clone - haengt am Quell-Snapshot
Belegt nur, was seither geschrieben wurde. Der Quell-Snapshot ist dafuer unloeschbar.
Fuer den Dauerbetrieb mit f loesen (kopiert die Daten wirklich).
```
---
## Lösen
Taste ++f++ in der Detailansicht — oder:
```bash
pvesnap-recovery flatten 9101
```
Zuerst wird gemessen, wie viel kopiert werden muss:
![Der Lösen-Dialog mit der Größe](../bilder/recovery-loesen.svg)
Dahinter steckt `rbd flatten`: Die Daten aus dem Elternteil werden jetzt
wirklich in den Klon kopiert. Danach hängt die Maschine an nichts mehr, und der
Schutz der Quell-Snapshots wird **automatisch aufgehoben** — die Vorhaltezeit
kommt wieder durch.
Schnell ist es, solange Platz da ist: 13 GB waren im Test in rund
**70 Sekunden** kopiert.
---
## Die Maschine läuft dabei weiter
!!! success "`rbd flatten` ist eine Online-Operation"
Im Test blieb die VM über den gesamten Vorgang auf `qmpstatus: running`, der
QEMU-Monitor antwortete durchgehend, und die Uhr auf der Konsole lief weiter
— inklusive geladenem RAM-Zustand.
Auch Daten, die **während** des Abkoppelns geschrieben werden, überleben es.
Gemessen an einem Container, der durchgehend schrieb:
| | |
|---|---|
| vor dem Flatten geschrieben | 64 MB Zufallsdaten, SHA-256 danach **OK** |
| während des Flatten geschrieben | 192 MB Zufallsdaten, SHA-256 danach **OK** |
| Schreibvorgänge im Zeitfenster | 12, von 19:35:48 bis 19:36:10 (Flatten: 19:35:4819:36:11) |
| Zustand des Gastes | durchgehend `running` |
Der Grund: `rbd flatten` füllt nur die Blöcke auf, die der Klon noch **nicht**
selbst besitzt. Was der Gast bereits geschrieben hat, gehört ihm — und wird
nicht überschrieben.
`flatten` betrifft also ausschließlich die *Abhängigkeit* vom Quell-Snapshot,
nie die Verfügbarkeit.
---
## Der Platzbedarf — und warum `rbd du` täuscht
!!! warning "Nicht von der Snapshot-Zeile täuschen lassen"
Die Zeile eines Snapshots in `rbd du` zeigt nur dessen **Zuwachs**, nicht
seinen Inhalt.
Im Test stand `@handtest01` mit `USED 56 MiB` da — kopiert wurden beim
Flatten trotzdem über 8 GB. Denn sichtbar ist an dieser Stelle der gesamte
Inhalt der Kette (`<TOTAL> 14 GiB`).
Deshalb misst `pvesnap-recovery flatten` das vorher richtig und nennt die
Größe, bevor es losgeht.
### Es wird geprüft, ob der Platz reicht
!!! danger "Ein volllaufender Ceph-Pool blockiert alles"
Läuft der Pool während des Kopierens voll, blockiert er **jeden**
Schreibvorgang. Dann steht nicht nur das Flatten, sondern jede VM auf diesem
Storage — und selbst das Aufräumen wird schwierig, weil Löschen ebenfalls
ein Schreibvorgang ist.
`flatten` bricht deshalb ab, wenn weniger als das **1,15-fache** des Bedarfs
frei ist. `--force` setzt sich darüber hinweg.
Vorher selbst nachsehen:
```bash
ceph df # MAX AVAIL beachten, nicht % RAW USED
```
`% RAW USED` täuscht, weil es die Replikation nicht berücksichtigt: Bei
dreifacher Replikation kosten 13 GB Nutzdaten 39 GB im Pool.
---
## Nachsehen, was los ist
```bash
rbd -p <pool> ls -l | grep -E 'NAME|vm-9101' # Spalte PARENT
rbd -p <pool> du | grep -E 'NAME|vm-9101' # PROVISIONED gegen USED
```
Eine frisch geklonte 32-GB-Platte steht dort mit `PROVISIONED 32 GiB` und
`USED 80 MiB` — die 80 MiB sind alles, was der laufende Gast seither geschrieben
hat.
Nach dem Flatten ist die Spalte `PARENT` leer, und `USED` entspricht dem
tatsächlichen Inhalt.
---
## Auf anderen Speicherarten
Das ganze Thema ist eine **Ceph-Eigenheit**. Andere Storages verhalten sich
anders:
| Storage | Hängt am Quell-Snapshot? | `flatten` |
|---|---|---|
| `rbd` (Ceph) | **ja** — Snapshot wird geschützt und unlöschbar | nötig für den Dauerbetrieb |
| `lvmthin` | **nein** | nicht nötig |
| `zfspool` | ja | nicht möglich |
### LVM-thin ist hier angenehmer als Ceph
Ein Thin-Snapshot ist ein eigenständiges Volume, das sich mit anderen nur die
Blöcke im Pool teilt. Nachgemessen:
```
Belegung im Thin-Pool nach dem Klonen (256 MB Nutzdaten):
data <19.84g 1.26 % ← Pool hält die Daten nur EINMAL
snap_..._wdhtest 1.00g
vm-9998-disk-0 1.00g 25.00 % Klon
vm-9999-disk-0 1.00g 25.00 % Original
Quell-Snapshot löschen, während der Klon existiert → erlaubt
Original löschen → erlaubt
Prüfsumme des Klons danach → unverändert
```
Also: platzsparend geteilt **und** trotzdem frei löschbar. `flatten` meldet
solche Datenträger entsprechend als „nicht nötig".
Der Preis liegt woanders: `lvmthin` ist **lokaler** Speicher. Die
Wiederherstellung muss auf demselben Node laufen wie das Original;
`pvesnap-recovery` prüft das und lehnt einen anderen Node ab. Mit Ceph ist sie
dagegen auf jedem Node des Clusters startbar.
!!! warning "Auch Thin-Pools laufen voll"
Und dann stehen alle Volumes darin. Überprovisionierung im Blick behalten:
```bash
lvs -o lv_name,data_percent,metadata_percent
```
### Bei ZFS geht es nicht
Der Klon hängt wie bei Ceph am Snapshot. `zfs promote` würde die Abhängigkeit
nur **umdrehen** statt auflösen — danach hinge das Original am Klon, was das
Problem nicht löst, sondern verschiebt.
Echte Unabhängigkeit ginge nur über eine Vollkopie per `zfs send | zfs recv`.
Das macht `flatten` nicht, und es sagt das auch so:
```
nicht moeglich - ein ZFS-Klon haengt am Snapshot. Loesen ginge nur
ueber 'zfs send | zfs recv' in einen neuen Datentraeger
```
---
## Wann lösen, wann nicht?
| Lage | |
|---|---|
| Kurz hineinschauen, Dump ziehen, verwerfen | **nicht lösen.** Kostet nur Platz und Zeit. |
| Die Maschine bleibt ein paar Tage stehen | **lösen**, sonst blockiert sie die Vorhaltezeit des Originals |
| Die Maschine übernimmt dauerhaft | **lösen** — und zwar vor dem Löschen des Originals |
| Auf LVM-thin | nichts zu tun |
+167
View File
@@ -0,0 +1,167 @@
# Mit Netzwerk
```bash
pvesnap-recovery recover 101 auto-stuendlich-20260809-100000 --newid 9101
```
Der Ernstfall: Die Maschine soll nicht nur untersucht, sondern **wieder in
Betrieb genommen** werden.
Dabei bleibt alles erhalten, was die Maschine ausmacht:
* SMBIOS-UUID und `vmgenid`
* MAC-Adressen aller Netzwerkkarten
* bei Containern der Hostname
Für alles im Netz ist sie damit **dieselbe Maschine** — inklusive
Lizenzbindungen, AD-Mitgliedschaft und DHCP-Reservierungen. Genau das will man
im Ernstfall.
---
## Genau deshalb ist sie gefährlich
!!! danger "Zwei Maschinen, eine Identität"
Dieselbe MAC und dieselbe IP zweimal im selben Netz geben Chaos: ARP-Tabellen
schlagen um, Verbindungen brechen sporadisch ab, ein Verzeichnisdienst
bekommt widersprüchliche Anmeldungen, und die Datenbank wird von zwei Seiten
beschrieben.
Und das Unangenehme daran: Es fällt nicht sofort auf. Es fällt eine halbe
Stunde später auf, wenn niemand mehr weiß, was zuletzt geändert wurde.
`pvesnap-recovery` prüft deshalb vorher, ob das Original noch läuft — und lässt
sich in dem Fall **nicht beiläufig durchwinken**:
| Situation | Verhalten |
|---|---|
| ncurses-Oberfläche | Zusammenfassung nur mit ++j++, danach eine **zweite** Rückfrage, die den Grund beim Namen nennt |
| `recover …` im Terminal | das Wort **`ja`** muss ausgeschrieben werden — ++j++ reicht nicht |
| `recover … -y` | **wird abgewiesen** (Exit-Code 2) |
| `recover … --force` | läuft durch — die bewusste Entscheidung |
!!! quote "Warum `-y` nicht reicht"
`-y` heißt „keine Routinefragen", nicht „frag mich auch dann nicht, wenn es
weh tut". Ein Skript, das mit `-y` läuft, soll nicht versehentlich eine
zweite Domänencontroller-Identität ins Netz stellen.
Wer es wirklich will, schreibt `--force` — und hat es dann bewusst getan.
---
## Der sichere Weg
<div class="ablauf" markdown>
**Erste Wahl:** Das Original **vorher stoppen**.
```bash
qm stop 101
pvesnap-recovery recover 101 --newid 9101
```
**Zweite Wahl:** Mit abgeklemmter Leitung starten und die Karte erst zuschalten,
wenn klar ist, dass die Luft rein ist.
```bash
pvesnap-recovery recover 101 --newid 9101 --net down
# ... in der Konsole prüfen, ob es die richtige Maschine ist ...
qm set 9101 --net0 virtio=BC:24:11:00:65:40,bridge=vmbr0
```
</div>
Der zweite Weg hat einen praktischen Vorteil: Man sieht der Maschine über die
noVNC-Konsole an, ob es wirklich der richtige Stand ist — **bevor** sie
irgendjemand im Netz erreicht.
---
## Die drei Netzwerkzustände
| `--net` | |
|---|---|
| `none` | **keine Netzwerkkarte.** Die Maschine hat gar kein Netz. Vorgabe bei `live`. |
| `down` | **Karte vorhanden, Leitung abgeklemmt** (`link_down=1`). Der Gast sieht seine Karte, aber nichts kommt durch. |
| `on` | **voll am Netz**, mit den MAC-Adressen des Originals. Vorgabe bei `recover`. |
Der Unterschied zwischen `none` und `down` ist wichtiger, als er aussieht:
!!! info "Mit geladenem Arbeitsspeicher wird aus `none` automatisch `down`"
Ein gespeicherter RAM-Zustand lässt sich nur in eine Maschine mit **exakt
derselben Geräteausstattung** laden. Eine entfernte Netzwerkkarte wäre eine
Änderung — das Laden würde scheitern.
Deshalb bleibt die Karte in diesem Fall vorhanden und wird stattdessen
abgeklemmt. In der Zusammenfassung steht dazu ein Hinweis; man muss also
nicht selbst daran denken.
---
## Was danach zu tun ist
Eine Wiederherstellung, die dauerhaft bleiben soll, ist noch nicht fertig:
<div class="ablauf" markdown>
**1.** [Vom Quell-Snapshot lösen](loesen.md) — sonst hängt sie für immer daran,
und die Vorhaltezeit kommt an den Snapshots des Originals nicht mehr vorbei
**2.** Den Tag `pvesnap-recovery` entfernen, wenn sie zur regulären Maschine
werden soll:
```bash
qm set 9101 --tags produktion,datenbank
```
**3.** Aus der Merkliste nehmen — nach dem Entfernen des Tags taucht sie in
`pvesnap-recovery list` ohnehin nicht mehr als lebend auf
**4.** `onboot` wieder setzen, falls sie beim Hostneustart hochkommen soll:
```bash
qm set 9101 --onboot 1
```
</div>
!!! warning "Schritt 1 ist keine Kür"
Solange die Maschine ein Linked Clone ist, kann der Quell-Snapshot nicht
gelöscht werden — und das Original muss mitsamt seiner Platte bestehen
bleiben. Im Protokoll des Dienstes stünde dauerhaft
`snapshot is protected`.
Siehe [Vom Snapshot lösen](loesen.md).
!!! note "`onboot` und `startup` werden bewusst weggelassen"
Eine frisch angelegte Wiederherstellung soll nicht beim nächsten
Hostneustart von selbst hochkommen — schon gar nicht eine mit den
MAC-Adressen einer noch laufenden Maschine. Wer sie behält, setzt das selbst.
---
## Und das Original?
Wenn die Wiederherstellung übernimmt, will das Original meistens weg. Aber
**nicht sofort**:
!!! danger "Erst lösen, dann löschen"
Solange die Wiederherstellung ein Linked Clone ist, hängt sie an den
Datenträgern des Originals. Das Original zu löschen, würde die
Wiederherstellung mitnehmen.
Reihenfolge:
1. `pvesnap-recovery flatten 9101` — abwarten, bis es durch ist
2. prüfen: Die Detailansicht muss *„eigenständig — hängt an keinem Snapshot"*
zeigen
3. erst dann das Original entfernen
Auf LVM-thin entfällt das — dort sind die Klone von sich aus unabhängig. Siehe
[Speicherarten](../nachschlagen/speicher.md).
+228
View File
@@ -0,0 +1,228 @@
# Austauschlaufwerke
Eine abgeschottete Wiederherstellung hat **kein Netzwerk**. Kein SCP, kein
Netzlaufwerk, kein Cloud-Speicher. Wie kommt der Datenbank-Dump dann heraus?
Über ein **Austauschlaufwerk**: eine benannte Abbilddatei unter
`/var/lib/pvesnap/transfer/`, die sich am Host ganz normal einhängen lässt und
einem Gast als zusätzliche Platte angehängt wird.
```
/var/lib/pvesnap/transfer/dumps.img 20G "Datenbank-Dumps und Exporte"
/var/lib/pvesnap/transfer/werkzeuge.img 4G "Skripte, Treiber, Installer"
```
!!! success "Der eigentliche Sinn: vorher, nicht mittendrin"
Ein Austauschlaufwerk gehört zu keiner Maschine und überlebt jede
Wiederherstellung. Man legt es **einmal in Ruhe an**, packt hinein, was man
im Notfall braucht — und wählt es im Ernstfall nur noch aus einer Liste aus.
Im Notfall ist keine Zeit, sich Werkzeuge zusammenzusuchen. Und die
Maschine, in der man sie bräuchte, kommt nicht ins Netz.
---
## Die Übersicht
Taste ++v++ — erreichbar aus der Übersicht, aus der
[Optionsmaske](einrichten.md#die-optionsmaske) und aus der
[Detailansicht](arbeiten.md):
![Übersicht der Austauschlaufwerke](../bilder/transfer-uebersicht.svg)
| Taste | |
|---|---|
| ++enter++ | am Host einhängen und im Commander öffnen |
| ++n++ | neues Laufwerk anlegen |
| ++u++ | am Host aushängen |
| ++l++ | löschen |
| ++r++ | neu einlesen |
| ++q++ | zurück |
Die Spalte **Zustand** ist die wichtigste. Sie kennt drei Werte:
| Zustand | Farbe | bedeutet |
|---|---|---|
| `frei` | — | gehört niemandem, kann angehängt oder eingehängt werden |
| `am Host eingehängt` | grün | liegt gerade unter `/run/pvesnap/transfer/<name>` |
| `in Benutzung von 9101` | gelb | steckt in dieser Maschine |
---
## Ein Laufwerk anlegen
Taste ++n++, dann drei Fragen:
![Ein neues Laufwerk anlegen](../bilder/transfer-neu.svg)
| Frage | |
|---|---|
| **Name** | kurz, klein geschrieben, z. B. `dumps`. Wird zur Bezeichnung im Gast (`DUMPS`). |
| **Größe** | `20G`, `500M`, `2T` |
| **Wofür** | freier Text, taucht in der Übersicht auf |
Dabei passiert:
1. Abbilddatei anlegen (dünn besetzt — sie belegt anfangs nichts)
2. GPT-Partitionstabelle mit einer Partition, Typ `msftdata`
3. exFAT-Dateisystem, Bezeichnung = Name in Großbuchstaben
4. Rechte `0777` und eine `LIESMICH.txt` hineinlegen
!!! note "Die Größe ist eine Obergrenze, keine Reservierung"
Die Datei ist dünn besetzt: Ein 20-GB-Laufwerk mit 3 GB Inhalt belegt 3 GB
auf dem Host. In der Übersicht stehen beide Zahlen nebeneinander —
**Größe** und **belegt**.
---
## Befüllen und auslesen
++enter++ hängt das Laufwerk am Host ein und öffnet den
[Commander](../holen/explorer.md) darauf:
![Der Commander auf einem Austauschlaufwerk](../bilder/transfer-commander.svg)
Links das Laufwerk, rechts der Host. **Beide Seiten sind beschreibbar** — anders
als beim Snapshot-Explorer, wo links Schreibschutz herrscht. Kopiert wird mit
++f5++ in beide Richtungen.
Beim Verlassen mit ++q++ wird das Laufwerk automatisch wieder ausgehängt.
!!! tip "Was hineingehört"
Alles, was man im Gast bräuchte und dort nicht herunterladen kann:
* ein passendes `pg_dump` / `mysqldump` in der richtigen Version
* ein Packprogramm (`7z.exe` für Windows-Gäste)
* eigene Auswerteskripte
* bei Windows die virtio-Treiber, falls die Maschine sie braucht
* ein leeres Verzeichnis `ausgang/` für das, was herauskommen soll
---
## Host oder Gast, nie beides
Zwei unabhängige Einhängungen desselben Blockgeräts zerlegen das Dateisystem.
Nicht „vielleicht" — zuverlässig, weil beide Seiten Puffer halten, von denen
die andere nichts weiß.
Die Verwaltung lässt das deshalb nicht zu:
| Versuch | |
|---|---|
| Anhängen, während der Host es hält | abgelehnt |
| Aushängen, während ein Gast darauf arbeitet | abgelehnt |
| Löschen, solange es überhaupt in Benutzung ist | abgelehnt |
Woher sie das weiß: Sie liest die **Gast-Konfigurationen** unter
`/etc/pve/nodes/*/`. Dort steht der Eintrag auch dann, wenn die Maschine gerade
nicht läuft — was die Wahrheit besser trifft als jede Merkliste.
!!! info "Bei Containern ist es anders"
Dort ist es kein Blockgerät, sondern ein durchgereichtes Verzeichnis
(Bind-Mount). Host und Container sehen dieselben Dateien **gleichzeitig**
es ist dasselbe Dateisystem, nicht zweimal eingehängt.
Dort gibt es also nichts auszuwerfen und nichts abzuwarten.
---
## Im laufenden Betrieb wechseln
Taste ++e++ in der [Detailansicht](arbeiten.md) zieht das Laufwerk bei laufender
Maschine ab und gibt es wieder hinein — beliebig oft:
<div class="ablauf" markdown>
**auswerfen** → gehört wieder dem Host: einhängen, auslesen, neu befüllen
**einklinken** → zurück in denselben Steckplatz, die VM läuft durchgehend
</div>
Das ist der Weg, ohne die Maschine anzufassen an Zwischenergebnisse zu kommen —
Dump ziehen, abholen, weitermachen.
!!! warning "Im Gast vorher aushängen"
Unter Linux `umount`, unter Windows „Auswerfen" im Explorer.
Proxmox meldet das Gerät zwar ordentlich ab, aber ein Dateisystem, auf das
gerade geschrieben wird, nimmt das übel. Hält der Gast es fest, schlägt das
Auswerfen mit einer entsprechenden Meldung fehl — dann erst im Gast
aushängen und noch einmal.
Die Detailansicht zeigt jederzeit, was steckt:
```
Transfer-Laufwerke:
dumps eingesteckt als scsi1
e = auswerfen / einklinken, im laufenden Betrieb
```
---
## Warum exFAT
| | |
|---|---|
| **Windows und Linux** lesen und schreiben es von Haus aus | kein Treiber, keine Nachinstallation im Gast |
| **Keine 4-GB-Grenze** je Datei | ein 30-GB-Dump passt |
| **Keine Besitzrechte auf der Platte** | keine Rechteprobleme zwischen Host und Gast, keine `chown`-Runden |
Die Bezeichnung darf höchstens **11 Zeichen** haben — daher der Rat, den Namen
kurz zu halten. Eingehängt wird mit `umask=0000`, damit auch ein
unprivilegierter Container hineinschreiben kann (dessen `root` ist auf dem Host
die UID 100000).
### Warum eine Datei und kein Proxmox-Volume?
!!! danger "Ein Volume würde mitgelöscht"
Beim Entfernen der Maschine — auch aus der Proxmox-Weboberfläche heraus.
Die mühsam vorbereitete Werkzeugsammlung wäre weg, und zwar genau in dem
Moment, in dem jemand aufräumt.
Pfade überspringt PVE beim Zerstören ausdrücklich:
`return if $volid =~ m|^/|`. Deshalb eine Datei.
Angehängt wird über ein **Loop-Gerät**, weil Proxmox als Pfad nur `/dev/…`
akzeptiert — eine Abbilddatei direkt einzutragen lehnt es ab
(`unable to associate path to any storage`).
Die GPT-Partition trägt bewusst den Typ `msftdata`. Ohne diese Angabe vergibt
`parted` den Typ „Linux filesystem", und Windows gibt dem Laufwerk dann keinen
Buchstaben.
---
## Auf der Kommandozeile
```bash
pvesnap-recovery live 101 --transfer werkzeuge --transfer dumps
```
Mehrfach möglich. Die Laufwerke müssen frei sein, sonst bricht das Anlegen mit
einer Meldung ab.
Angelegt und verwaltet werden sie nur über die Oberfläche — dafür gibt es
bewusst keine Parameter. Das ist eine Vorbereitungsaufgabe, keine, die man
unter Zeitdruck tippt.
---
## Wo sie liegen
```
/var/lib/pvesnap/transfer/index.json Verzeichnis der Laufwerke
/var/lib/pvesnap/transfer/dumps.img die Abbilddatei
/run/pvesnap/transfer/dumps Einhängepunkt am Host
```
!!! warning "`uninstall.sh --purge` nimmt sie mit"
Ohne `--purge` bleibt alles liegen. Mit `--purge` ist auch der Inhalt der
Austauschlaufwerke weg. Siehe [Installation](../installation.md#deinstallation).
+146
View File
@@ -0,0 +1,146 @@
# Verwerfen und aufräumen
## Verwerfen
Taste ++x++ in der Übersicht oder in der Detailansicht:
![Sicherheitsabfrage vor dem Verwerfen](../bilder/recovery-verwerfen.svg)
Oder auf der Kommandozeile:
```bash
pvesnap-recovery destroy 9101
pvesnap-recovery destroy 9101 -y # ohne Rückfrage
```
`destroy` räumt vollständig auf:
<div class="ablauf" markdown>
**1.** Maschine stoppen
**2.** Gast samt aller Klone entfernen
**3.** Austauschlaufwerke freigeben (der **Inhalt bleibt** — sie gehören zu
keiner Maschine)
**4.** Den **Schutz der Quell-Snapshots wieder aufheben**
**5.** Eintrag aus der Merkliste nehmen
</div>
---
### Schritt 4 ist der wichtige
!!! info "Warum der Snapshot-Schutz wieder weg muss"
Ceph verlangt für einen Klon, dass der Quell-Snapshot geschützt ist
(`rbd snap protect`), und Proxmox setzt das beim Klonen selbst.
Bliebe der Schutz stehen, könnte die [Vorhaltezeit](../sichern/vorhaltezeit.md)
diesen Snapshot später nicht mehr löschen — im Protokoll stünde dann immer
wieder:
```
snapshot is protected
```
Solange eine Wiederherstellung existiert, ist ihr Quell-Snapshot also
**bewusst** unlöschbar. Danach nicht mehr.
---
### Was `destroy` nicht anfasst
!!! success "Nur Maschinen mit dem Tag `pvesnap-recovery`"
Eine von Hand angelegte VM lässt sich damit nicht versehentlich löschen —
auch dann nicht, wenn sie zufällig eine VMID hat, die einmal einer
Wiederherstellung gehörte.
**Austauschlaufwerke bleiben.** Sie gehören zu keiner Maschine; ihr Inhalt
überlebt jede Wiederherstellung. Sie werden nur wieder als `frei` markiert.
**Das Original bleibt.** Selbstverständlich — `destroy` fasst ausschließlich die
Wiederherstellung an.
---
## `cleanup`
Wird eine Wiederherstellung in der **Proxmox-Oberfläche** entfernt statt mit
`destroy`, bleibt etwas liegen:
* der Klon selbst kann übrigbleiben
* der Quell-Snapshot bleibt **geschützt** — die Vorhaltezeit scheitert dann
dauerhaft
```bash
pvesnap-recovery cleanup # zeigt Gefundenes, fragt, räumt auf
pvesnap-recovery cleanup --all # auch Datenträger ohne Elternteil
pvesnap-recovery cleanup -y # ohne Rückfrage
```
### Wonach gesucht wird
Nach Datenträgern der Form `vm-<id>-disk-N`, zu deren VMID es **keine
Konfigurationsdatei** unter `/etc/pve/nodes/*/` mehr gibt.
!!! info "Bewusst nicht über `/cluster/resources`"
Ein Gast auf einem abgemeldeten Node taucht dort unter Umständen nicht auf
— und dann würden die Platten einer **lebenden** Maschine als verwaist
gelten.
Die Konfigurationsdateien im Cluster-Dateisystem sind die verlässlichere
Quelle.
Zwei weitere Vorsichtsmaßnahmen:
| | |
|---|---|
| **Ohne Elternteil** wird nichts von selbst entfernt | dafür braucht es `--all` |
| **Der Schutz eines Snapshots wird nur gelöst**, wenn wirklich kein Klon mehr daran hängt | sonst würde ein noch lebender Klon seine Grundlage verlieren |
### Wann man es braucht
* Jemand hat eine Wiederherstellung in der Weboberfläche gelöscht
* Ein `destroy` ist mittendrin abgebrochen (Host neu gestartet, Netz weg)
* Im Protokoll des Dienstes taucht wiederholt `snapshot is protected` auf
Der letzte Fall ist der häufigste — und der, den man sonst lange sucht.
---
## Aufräumen prüfen
```bash
pvesnap-recovery list # sind noch welche eingetragen?
qm list | grep -i recovery # laufen noch welche?
rbd -p <pool> ls | grep -E 'vm-9[0-9]{3}-' # liegen noch Klone herum?
rbd -p <pool> snap ls vm-101-disk-0 # steht noch ein Schutz?
```
Bei der letzten Ausgabe steht in der Spalte `PROTECTED` ein `yes`, solange ein
Snapshot geschützt ist. Ohne zugehörigen Klon ist das ein Fall für `cleanup`.
---
## Vor der Deinstallation
`uninstall.sh` warnt, wenn noch Wiederherstellungen offen sind. Der Grund ist
derselbe:
!!! warning "Erst verwerfen, dann deinstallieren"
Nach dem Entfernen von pvesnap gibt es kein `destroy` und kein `cleanup`
mehr. Die Klone müsste man dann von Hand aufspüren, und den Snapshot-Schutz
von Hand lösen:
```bash
rbd -p <pool> snap unprotect vm-101-disk-0@auto-stuendlich-20260809-100000
```
Mit Werkzeug ist das ein Tastendruck. Ohne eine Stunde Sucherei.