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:
co-authored by
Claude Opus 5
parent
c484596702
commit
59e7224297
@@ -0,0 +1,243 @@
|
||||
# Alle Befehle
|
||||
|
||||
## `pvesnap`
|
||||
|
||||
Der Snapshot-Dienst und seine Verwaltung.
|
||||
|
||||
```bash
|
||||
pvesnap [globale Optionen] <befehl> [optionen]
|
||||
```
|
||||
|
||||
### Globale Optionen
|
||||
|
||||
| Option | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `-c`, `--config <pfad>` | `/etc/pvesnap/pvesnap.conf` | andere Konfiguration verwenden (auch über `PVESNAP_CONFIG`) |
|
||||
| `-n`, `--dry-run` | — | nichts wirklich anlegen oder löschen, nur anzeigen |
|
||||
| `-v`, `--verbose` | — | ausführliche Ausgabe |
|
||||
| `-V`, `--version` | — | Version anzeigen |
|
||||
|
||||
### Unterbefehle
|
||||
|
||||
| Befehl | |
|
||||
|---|---|
|
||||
| `status` | Übersicht über Gruppen, letzte und nächste Läufe — **auch die Vorgabe ohne Befehl** |
|
||||
| `vms` | alle VMs und Container mit den Gruppen, in denen sie stecken |
|
||||
| `list` | vorhandene pvesnap-Snapshots |
|
||||
| `check` | Konfiguration prüfen |
|
||||
| `config` (oder `edit`) | [ncurses-Editor](../sichern/editor.md) |
|
||||
| `run` | fällige Gruppen jetzt ausführen |
|
||||
| `prune` | nur aufräumen, nichts anlegen |
|
||||
| `daemon` | Dienst im Vordergrund starten (für systemd) |
|
||||
|
||||
### `run`
|
||||
|
||||
| Option | |
|
||||
|---|---|
|
||||
| `-g`, `--group <name>` | nur diese Gruppe (mehrfach möglich) |
|
||||
| `-f`, `--force` | unabhängig vom Zeitplan ausführen |
|
||||
| `--no-prune` | nicht aufräumen |
|
||||
|
||||
```bash
|
||||
pvesnap run # was fällig ist
|
||||
pvesnap run --force -g taeglich # diese Gruppe sofort
|
||||
pvesnap run --force --dry-run # Probelauf
|
||||
pvesnap run -g taeglich -g monatlich # zwei Gruppen
|
||||
```
|
||||
|
||||
### `prune`
|
||||
|
||||
| Option | |
|
||||
|---|---|
|
||||
| `-g`, `--group <name>` | nur diese Gruppe |
|
||||
|
||||
### `list`
|
||||
|
||||
| Option | |
|
||||
|---|---|
|
||||
| `-g`, `--group <name>` | nur diese Gruppe |
|
||||
| `-a`, `--all` | auch fremde und von Hand angelegte Snapshots anzeigen |
|
||||
|
||||
---
|
||||
|
||||
## `pvesnap-explorer`
|
||||
|
||||
```bash
|
||||
pvesnap-explorer [vmid] [snapshot] [optionen]
|
||||
```
|
||||
|
||||
| Parameter | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `vmid` | — | Gast direkt vorwählen |
|
||||
| `snapshot` | — | Snapshot direkt vorwählen |
|
||||
| `-l`, `--local <pfad>` | aktuelles Verzeichnis | Startverzeichnis im rechten Fenster |
|
||||
| `-p`, `--path <pfad>` | — | beliebiges Verzeichnis öffnen, ohne Proxmox zu fragen |
|
||||
| `--cleanup` | — | hängengebliebene Einbindungen lösen und beenden |
|
||||
| `-v`, `--verbose` | — | ausführliches Protokoll |
|
||||
| `-V`, `--version` | — | Version anzeigen |
|
||||
|
||||
```bash
|
||||
pvesnap-explorer # alles auswählen
|
||||
pvesnap-explorer 101 # Snapshot von VM 101 wählen
|
||||
pvesnap-explorer 101 auto-taeglich-20260809-023000 # direkt öffnen
|
||||
pvesnap-explorer --local /srv/restore # rechtes Fenster startet dort
|
||||
pvesnap-explorer --path /mnt/x # ohne Proxmox
|
||||
pvesnap-explorer --cleanup # aufräumen
|
||||
```
|
||||
|
||||
Braucht `root`, außer bei `--path`.
|
||||
|
||||
---
|
||||
|
||||
## `pvesnap-web`
|
||||
|
||||
```bash
|
||||
pvesnap-web [vmid] [snapshot] [optionen]
|
||||
```
|
||||
|
||||
| Parameter | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `-P`, `--port <nummer>` | `8823` | Port, auf dem gelauscht wird |
|
||||
| `-b`, `--bind <adresse>` | `0.0.0.0` | Netzwerkadresse; `127.0.0.1` = nur lokal |
|
||||
| `-a`, `--auth pve\|token\|none` | `pve` | Anmeldeart |
|
||||
| `--require-privilege <recht>` | `VM.Snapshot` | nötiges Recht auf dem Gast |
|
||||
| `--allow-user <user@realm>` | — | dieser Benutzer darf alles (mehrfach möglich) |
|
||||
| `-t`, `--token <schlüssel>` | zufällig | Zugangsschlüssel selbst vorgeben |
|
||||
| `--no-token` | — | Kurzform für `--auth none` |
|
||||
| `-p`, `--path <verzeichnis>` | — | beliebiges Verzeichnis statt eines Snapshots |
|
||||
| `--cleanup` | — | hängengebliebene Einbindungen lösen und beenden |
|
||||
| `-v`, `--verbose` | — | ausführliches Protokoll |
|
||||
| `-V`, `--version` | — | Version anzeigen |
|
||||
|
||||
Als Dienst stehen dieselben Parameter in `/etc/pvesnap/web.conf`:
|
||||
|
||||
```
|
||||
PVESNAP_WEB_ARGS=--bind 0.0.0.0 --port 8823 --auth pve
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## `pvesnap-recovery`
|
||||
|
||||
```bash
|
||||
pvesnap-recovery # ncurses-Oberfläche
|
||||
pvesnap-recovery <befehl> [optionen]
|
||||
```
|
||||
|
||||
### Unterbefehle
|
||||
|
||||
| Befehl | |
|
||||
|---|---|
|
||||
| `live <VMID> [snapshot]` | abgeschottet starten (ohne Snapshot: der neueste) |
|
||||
| `recover <VMID> [snapshot]` | mit Netzwerk und gleicher Identität starten |
|
||||
| `list` | vorhandene Wiederherstellungen anzeigen |
|
||||
| `start <VMID>` | starten |
|
||||
| `stop <VMID>` | herunterfahren |
|
||||
| `console <VMID>` | noVNC-Adresse ausgeben |
|
||||
| `spice <VMID>` | Verbindungsdatei für `remote-viewer` |
|
||||
| `flatten <VMID>` | [vom Quell-Snapshot lösen](../wiederherstellen/loesen.md) |
|
||||
| `cleanup` | [Klone entfernen, zu denen es keinen Gast mehr gibt](../wiederherstellen/verwerfen.md#cleanup) |
|
||||
| `destroy <VMID>` | [restlos verwerfen](../wiederherstellen/verwerfen.md) |
|
||||
|
||||
### Optionen von `live` und `recover`
|
||||
|
||||
| Parameter | |
|
||||
|---|---|
|
||||
| `--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](../wiederherstellen/transfer.md) 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>` | abweichender Arbeitsspeicher (nicht mit `--resume`) |
|
||||
| `--cores <n>` | abweichende Kernzahl (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 |
|
||||
|
||||
!!! danger "`-y` deckt `--force` nicht ab"
|
||||
|
||||
`recover` mit `-y` bei laufendem Original wird **abgewiesen** (Rückgabewert
|
||||
2). Siehe [Mit Netzwerk](../wiederherstellen/netzwerk.md).
|
||||
|
||||
### Optionen der übrigen Befehle
|
||||
|
||||
| Befehl | Option | |
|
||||
|---|---|---|
|
||||
| `spice` | `-o <datei>` | in eine Datei schreiben statt auf die Standardausgabe |
|
||||
| `flatten` | `--force` | auch bei knappem Speicherplatz |
|
||||
| `cleanup` | `--all` | auch Datenträger ohne Elternteil |
|
||||
| `cleanup`, `destroy`, `flatten` | `-y`, `--yes` | ohne Rückfrage |
|
||||
|
||||
### Beispiele
|
||||
|
||||
```bash
|
||||
# Kurz hineinschauen, mit Werkzeugen
|
||||
pvesnap-recovery live 101 --transfer werkzeuge
|
||||
|
||||
# Ein bestimmter Snapshot, kalt gestartet, mit Dongle
|
||||
pvesnap-recovery live 105 auto-taeglich-20260809-023000 --usb 2 --no-resume
|
||||
|
||||
# Ernstfall: Original steht, Wiederherstellung übernimmt
|
||||
qm stop 101
|
||||
pvesnap-recovery recover 101 --newid 9101
|
||||
pvesnap-recovery flatten 9101
|
||||
|
||||
# Verbindungsdatei für den Arbeitsplatz
|
||||
ssh root@pve2 pvesnap-recovery spice 9104 > vm.vv && remote-viewer vm.vv
|
||||
|
||||
# Aufräumen
|
||||
pvesnap-recovery destroy 9101
|
||||
pvesnap-recovery cleanup
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## systemd
|
||||
|
||||
```bash
|
||||
systemctl status pvesnap
|
||||
systemctl reload pvesnap # Konfiguration neu einlesen (SIGHUP)
|
||||
systemctl restart pvesnap
|
||||
journalctl -u pvesnap -f
|
||||
|
||||
systemctl status pvesnap-web
|
||||
systemctl restart pvesnap-web # nach Änderungen in web.conf
|
||||
systemctl stop pvesnap-web
|
||||
journalctl -u pvesnap-web -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
./install.sh [optionen]
|
||||
./uninstall.sh [--purge]
|
||||
```
|
||||
|
||||
| Option | |
|
||||
|---|---|
|
||||
| `--with-webexplorer` | Web-Oberfläche als Dienst einrichten (erfordert `--port`) |
|
||||
| `--port <nummer>` | Port der Web-Oberfläche |
|
||||
| `--bind <adresse>` | Adresse, auf der sie lauscht (Vorgabe `0.0.0.0`) |
|
||||
| `--no-start` | installieren, aber Dienste nicht starten |
|
||||
| `--no-install-deps` | `parted` und `exfatprogs` nicht nachinstallieren |
|
||||
| `--force` | auch ohne erkanntes Proxmox VE installieren |
|
||||
| `--help` | Übersicht |
|
||||
|
||||
---
|
||||
|
||||
## Hilfswerkzeug
|
||||
|
||||
```bash
|
||||
tools/get-guest-tools.sh <iso-storage>
|
||||
```
|
||||
|
||||
Holt die virtio-win-Treiber auf einen ISO-Storage — für Windows-Gäste, die
|
||||
Treiber brauchen, oder für Zwischenablage und Mauszeiger unter
|
||||
[SPICE](../wiederherstellen/dongle.md).
|
||||
@@ -0,0 +1,281 @@
|
||||
# Fehlersuche
|
||||
|
||||
## Es passiert gar nichts
|
||||
|
||||
Der Dienst läuft, das Protokoll ist ruhig, und trotzdem entstehen keine
|
||||
Snapshots.
|
||||
|
||||
```bash
|
||||
pvesnap status # hat eine Gruppe einen nächsten Termin?
|
||||
pvesnap vms # steht überhaupt eine VM in einer Gruppe?
|
||||
pvesnap check
|
||||
```
|
||||
|
||||
| Ursache | |
|
||||
|---|---|
|
||||
| **Alle Gruppen auf `enabled = no`** | So wird ausgeliefert. Der häufigste Fall. |
|
||||
| Auswahl trifft auf nichts zu | Tag falsch geschrieben? `pvesnap vms` zeigt es. |
|
||||
| `dry_run = yes` in `[global]` | Es wird nur protokolliert. |
|
||||
| Konfiguration nach der Änderung nicht neu geladen | `systemctl reload pvesnap` |
|
||||
|
||||
---
|
||||
|
||||
## Storage-Lock
|
||||
|
||||
```
|
||||
trying to acquire cfs lock 'storage-data' ...
|
||||
TASK ERROR: cfs-lock 'storage-data' error: got lock request timeout
|
||||
```
|
||||
|
||||
!!! note "`storage-data` ist kein falsch gelesener Name"
|
||||
|
||||
In pmxcfs heißen Storage-Sperren immer `storage-<name>`. Gemeint ist also
|
||||
das Storage `data`.
|
||||
|
||||
Proxmox nimmt diese Sperre beim Anlegen eines Snapshots und gibt nach 60
|
||||
Sekunden auf, wenn sie jemand anderes hält.
|
||||
|
||||
pvesnap geht damit so um:
|
||||
|
||||
* Der Aufruf **wartet, bis der Proxmox-Task wirklich fertig ist**, bevor die
|
||||
nächste VM drankommt — sonst würden sich die eigenen Läufe aussperren
|
||||
* Sperr-Fehler gelten als vorübergehend und werden `retries`-mal mit
|
||||
`retry_delay` Abstand wiederholt
|
||||
* Echte Fehler (etwa „storage does not support snapshots") werden **nicht**
|
||||
wiederholt
|
||||
* `pause_between = 10s` nimmt zusätzlich Druck vom Storage
|
||||
|
||||
### Der Dienst scheitert, von Hand geht es
|
||||
|
||||
Das ist der Fall, an dem man am längsten sucht — und er hat mit dem Storage
|
||||
nichts zu tun.
|
||||
|
||||
!!! danger "Sandbox-Optionen in der systemd-Unit"
|
||||
|
||||
`pvesh` führt die Proxmox-API im eigenen Prozess aus. Der Snapshot-Task ist
|
||||
also ein **Kindprozess von pvesnap** und erbt alles, was in der Unit
|
||||
eingeschränkt wurde.
|
||||
|
||||
`ProtectSystem=` hängt `/etc` schreibgeschützt ein — und pmxcfs legt seine
|
||||
Sperren als **Verzeichnisse** unter `/etc/pve/priv/lock/` an. Das `mkdir`
|
||||
scheitert, Proxmox wiederholt es erfolglos und meldet am Ende einen
|
||||
Lock-Timeout statt eines Rechtefehlers.
|
||||
|
||||
Prüfen:
|
||||
|
||||
```bash
|
||||
systemctl show pvesnap -p ProtectSystem -p ProtectHome -p PrivateTmp -p ReadOnlyPaths
|
||||
pvesnap check # meldet so etwas von sich aus
|
||||
```
|
||||
|
||||
Alle müssen leer bzw. `no` sein. Die mitgelieferte Unit enthält deshalb
|
||||
**bewusst keine** Sandbox-Optionen.
|
||||
|
||||
`ProtectHome=yes` hat denselben Effekt an anderer Stelle: Es ersetzt `/root`
|
||||
durch ein leeres Verzeichnis — und Proxmox erreicht andere Cluster-Nodes über
|
||||
die SSH-Schlüssel in `/root/.ssh`.
|
||||
|
||||
### Wenn die Sperre wirklich belegt ist
|
||||
|
||||
```bash
|
||||
pvesm status # ist das Storage online und erreichbar?
|
||||
grep -A6 "^[a-z]*: data" /etc/pve/storage.cfg
|
||||
pvesh get /cluster/tasks --output-format json | head # hängt noch ein Task?
|
||||
systemctl status pvestatd pve-cluster
|
||||
journalctl -u pvestatd -n 50
|
||||
```
|
||||
|
||||
Häufigste Ursachen: ein hängender Backup- oder Replikationsjob auf demselben
|
||||
Storage, ein nicht erreichbares NFS/CIFS-Storage (dann blockiert `pvestatd`),
|
||||
oder ein abgebrochener Task, der die Sperre nicht freigegeben hat.
|
||||
|
||||
---
|
||||
|
||||
## `snapshot is protected`
|
||||
|
||||
```
|
||||
TASK ERROR: rbd snapshot 'auto-taeglich-20260809-023000' is protected from removal
|
||||
```
|
||||
|
||||
Am Snapshot hängt ein Klon — also eine
|
||||
[Wiederherstellung](../wiederherstellen/index.md). Das ist zunächst richtig so:
|
||||
Ceph verlangt den Schutz, solange ein Klon existiert.
|
||||
|
||||
| Lage | |
|
||||
|---|---|
|
||||
| Die Wiederherstellung wird noch gebraucht | Nichts tun. Der Snapshot bleibt eben liegen. |
|
||||
| Sie wird nicht mehr gebraucht | `pvesnap-recovery destroy <VMID>` |
|
||||
| Sie soll bleiben | `pvesnap-recovery flatten <VMID>` |
|
||||
| Sie wurde in der **Weboberfläche** gelöscht | `pvesnap-recovery cleanup` |
|
||||
|
||||
Der letzte Fall ist der, den man sonst nicht findet: Der Klon ist weg, der
|
||||
Schutz steht noch, und die Vorhaltezeit scheitert für immer.
|
||||
|
||||
Nachsehen:
|
||||
|
||||
```bash
|
||||
rbd -p <pool> snap ls vm-101-disk-0 # Spalte PROTECTED
|
||||
rbd -p <pool> ls -l | grep vm-101 # gibt es noch Klone?
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## `storage does not support snapshots`
|
||||
|
||||
Die VM liegt auf LVM-thick oder auf einem `raw`-Image in einem
|
||||
Verzeichnis-Storage. Dort kann Proxmox keine Snapshots — pvesnap überspringt sie
|
||||
und macht mit den übrigen weiter.
|
||||
|
||||
Der Ausweg ist ein Umzug:
|
||||
|
||||
```bash
|
||||
qm move-disk 101 scsi0 <thin-oder-ceph-storage>
|
||||
```
|
||||
|
||||
Siehe [Speicherarten](speicher.md).
|
||||
|
||||
---
|
||||
|
||||
## Der Snapshot lässt sich nicht einbinden
|
||||
|
||||
```bash
|
||||
pvesnap-explorer --cleanup # erst einmal aufräumen
|
||||
pvesnap-explorer -v 101 # dann mit ausführlichem Protokoll
|
||||
```
|
||||
|
||||
| Meldung | |
|
||||
|---|---|
|
||||
| `rbd: image uses unsupported features` | Der Kernel kann das Image nicht direkt; pvesnap weicht auf `rbd-nbd` aus. Fehlt das Paket `rbd-nbd`, nachinstallieren. |
|
||||
| `unknown filesystem type` | Das Dateisystem im Gast kennt der Host nicht (z. B. Btrfs ohne Modul, oder ReFS). |
|
||||
| `wrong fs type … or superblock corrupt` | Meist eine verschlüsselte Partition (LUKS, BitLocker). Dort führt nur der Weg über eine [laufende Maschine](../wiederherstellen/index.md). |
|
||||
| Es wird gar kein Dateisystem angeboten | Reine Datenplatte ohne Partitionstabelle, oder LVM im Gast, das nicht aktiviert werden konnte. |
|
||||
|
||||
Reste nach einem Absturz aufspüren:
|
||||
|
||||
```bash
|
||||
findmnt | grep pvesnap
|
||||
rbd showmapped
|
||||
losetup -a
|
||||
ls /run/pvesnap/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Die Maschine startet, aber der RAM-Zustand fehlt
|
||||
|
||||
Symptom: Die Wiederherstellung bootet, statt weiterzulaufen. Die Uhr im Gast
|
||||
zeigt die aktuelle Zeit statt der Snapshot-Zeit.
|
||||
|
||||
!!! warning "Proxmox meldet das als `TASK OK`"
|
||||
|
||||
Schlägt das Laden fehl, quittiert Proxmox den Start trotzdem mit Erfolg und
|
||||
lässt die Maschine in `prelaunch` stehen. `pvesnap-recovery` liest das
|
||||
Task-Protokoll mit, setzt sie fort und sagt es deutlich.
|
||||
|
||||
| Meldung im Task-Protokoll | |
|
||||
|---|---|
|
||||
| `Size mismatch: vga.vram` | SPICE (`vga: qxl`) und geladener Arbeitsspeicher schließen sich aus. Siehe [Dongle und USB](../wiederherstellen/dongle.md#spice-und-geladener-arbeitsspeicher-schlieen-sich-aus). |
|
||||
| `Unknown savevm section or instance 'vmgenid'` | Die Geräteausstattung passt nicht zum gespeicherten Zustand. Tritt bei von Hand veränderten Konfigurationen auf. |
|
||||
| `unable to open vmstate` | Der Arbeitsspeicher-Datenträger ist nicht mehr da — Proxmox gibt ihn nach dem **ersten** Start frei. Ein zweiter Start bootet immer kalt. |
|
||||
|
||||
Der letzte Punkt ist kein Fehler, sondern das erwartete Verhalten. Wer den
|
||||
warmen Zustand braucht, arbeitet damit **beim ersten Start**.
|
||||
|
||||
---
|
||||
|
||||
## Das Austauschlaufwerk lässt sich nicht auswerfen
|
||||
|
||||
```
|
||||
'dumps' liess sich nicht abziehen: ...
|
||||
Meist haelt der Gast es noch - dort erst aushaengen
|
||||
(Linux: umount, Windows: Auswerfen im Explorer).
|
||||
```
|
||||
|
||||
Genau das ist es meistens. Im Gast aushängen, dann noch einmal ++e++.
|
||||
|
||||
Weitere Fälle:
|
||||
|
||||
| Meldung | |
|
||||
|---|---|
|
||||
| `ist gerade in Benutzung von 9101` | Das Laufwerk steckt in einer anderen Maschine. Dort auswerfen. |
|
||||
| `ist gerade am Host eingehängt` | Mit ++u++ in der Laufwerksübersicht aushängen. |
|
||||
| `Bei Containern gibt es nichts auszuwerfen` | Dort ist es ein durchgereichtes Verzeichnis — Host und Gast sehen dieselben Dateien ohnehin gleichzeitig. |
|
||||
|
||||
---
|
||||
|
||||
## SPICE oder USB gehen nicht
|
||||
|
||||
| Symptom | |
|
||||
|---|---|
|
||||
| Maschine startet nicht, `no spice port` | `vga: qxl` fehlt. Detailansicht ++p++ → SPICE ein. |
|
||||
| Kein Eintrag unter „USB-Geräteauswahl" | Der `remote-viewer` läuft nicht auf dem Rechner, an dem der Dongle steckt. |
|
||||
| `.vv`-Datei wird abgewiesen | Sie ist zu alt — das Kennwort darin gilt nur wenige Sekunden. Neu erzeugen. |
|
||||
| `remote-viewer` nicht gefunden | Paket `virt-viewer` installieren. |
|
||||
|
||||
Mehr unter [Dongle und USB](../wiederherstellen/dongle.md#wenn-der-dongle-nicht-auftaucht).
|
||||
|
||||
---
|
||||
|
||||
## Die Web-Oberfläche zeigt keine Gäste
|
||||
|
||||
Ein angemeldeter Benutzer sieht nur Gäste, auf denen er das Recht
|
||||
**`VM.Snapshot`** hat. Ist die Liste leer, fehlt genau das.
|
||||
|
||||
```bash
|
||||
pveum user permissions <benutzer>@<realm>
|
||||
```
|
||||
|
||||
Anpassen mit `--require-privilege VM.Backup` oder
|
||||
`--allow-user <benutzer>@<realm>` in `/etc/pvesnap/web.conf`, danach
|
||||
`systemctl restart pvesnap-web`.
|
||||
|
||||
Fehlgeschlagene Anmeldungen stehen mit Absender-IP im Journal:
|
||||
|
||||
```bash
|
||||
journalctl -u pvesnap-web -n 50
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Der Port ist belegt
|
||||
|
||||
Beim Installieren:
|
||||
|
||||
```
|
||||
Auf Port 8823 laeuft bereits ein anderer Prozess (PID 12345)
|
||||
```
|
||||
|
||||
Das ist eine Warnung, kein Abbruch — es könnte etwas ganz anderes sein. Nachsehen:
|
||||
|
||||
```bash
|
||||
ss -lntp | grep 8823
|
||||
```
|
||||
|
||||
Eine bereits laufende `pvesnap-web` wird dagegen von selbst sauber angehalten
|
||||
und danach wieder gestartet.
|
||||
|
||||
---
|
||||
|
||||
## Zeitpläne stimmen nicht
|
||||
|
||||
| Beobachtung | |
|
||||
|---|---|
|
||||
| Der Termin liegt eine Stunde daneben | Zeitumstellung. Es wird mit lokaler Zeit gerechnet. |
|
||||
| Nach einem Neustart kam sofort ein Lauf | Ein verpasster Termin wird nachgeholt — einmal, nicht für jeden ausgefallenen. |
|
||||
| Im Februar fiel der Monatslauf aus | Sollte nicht passieren: `day_of_month = 31` wird auf den Monatsletzten gezogen. Prüfen mit der Vorschauzeile in der [Gruppenmaske](../sichern/editor.md#eine-gruppe-bearbeiten). |
|
||||
| Die Snapshots liegen auf krummen Zeiten | `align = no`. Mit `align = yes` richten sie sich an der Uhr aus. |
|
||||
|
||||
---
|
||||
|
||||
## Wenn gar nichts mehr hilft
|
||||
|
||||
```bash
|
||||
pvesnap -v check # ausführlich
|
||||
pvesnap -v run --force --dry-run # zeigt jeden pvesh-Aufruf
|
||||
journalctl -u pvesnap -n 200 --no-pager
|
||||
```
|
||||
|
||||
Mit `log_level = DEBUG` in `[global]` protokolliert der Dienst jeden
|
||||
`pvesh`-Aufruf mit allen Argumenten. Damit lässt sich der fehlschlagende Aufruf
|
||||
von Hand nachstellen — und dann sieht man die echte Meldung von Proxmox statt
|
||||
der aufbereiteten.
|
||||
@@ -0,0 +1,89 @@
|
||||
# Nachschlagen
|
||||
|
||||
Der Teil zum Blättern, wenn man schon weiß, was man sucht.
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
|
||||
- **[Alle Befehle](befehle.md)**
|
||||
|
||||
Jeder Unterbefehl und jeder Parameter der vier Werkzeuge.
|
||||
|
||||
- **[Alle Einstellungen](konfiguration.md)**
|
||||
|
||||
Jeder Schlüssel der INI-Datei, mit Vorgabe und Bedeutung.
|
||||
|
||||
- **[Tastenkürzel](tasten.md)**
|
||||
|
||||
Alle Tasten aller Oberflächen auf einer Seite.
|
||||
|
||||
- **[Speicherarten](speicher.md)**
|
||||
|
||||
Was Ceph, ZFS, LVM-thin und Datei-Storages jeweils können.
|
||||
|
||||
- **[Fehlersuche](fehlersuche.md)**
|
||||
|
||||
Meldungen, ihre Ursachen und was dagegen hilft.
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
## Wo was liegt
|
||||
|
||||
| Pfad | |
|
||||
|---|---|
|
||||
| `/etc/pvesnap/pvesnap.conf` | die Konfiguration |
|
||||
| `/etc/pvesnap/web.conf` | Parameter der Web-Oberfläche |
|
||||
| `/var/lib/pvesnap/state.json` | wann welche Gruppe zuletzt lief |
|
||||
| `/var/lib/pvesnap/recovery.json` | Merkliste der Wiederherstellungen |
|
||||
| `/var/lib/pvesnap/transfer/` | Austauschlaufwerke (Abbilddateien) |
|
||||
| `/run/pvesnap/mnt/` | eingebundene Snapshots |
|
||||
| `/run/pvesnap/transfer/` | am Host eingehängte Austauschlaufwerke |
|
||||
| `/usr/lib/pvesnap/` | Programmcode |
|
||||
| `/usr/local/bin/pvesnap*` | die vier Werkzeuge |
|
||||
|
||||
---
|
||||
|
||||
## Rückgabewerte
|
||||
|
||||
Für Skripte:
|
||||
|
||||
| Wert | |
|
||||
|---|---|
|
||||
| `0` | in Ordnung |
|
||||
| `1` | abgebrochen (Rückfrage verneint) |
|
||||
| `2` | Fehler in der Konfiguration oder in den Parametern |
|
||||
| `3` | Proxmox-Fehler |
|
||||
| `4` | Laufzeitfehler |
|
||||
| `130` | mit ++ctrl+c++ abgebrochen |
|
||||
|
||||
---
|
||||
|
||||
## Aufbau des Programms
|
||||
|
||||
```
|
||||
pvesnap/
|
||||
config.py INI lesen und schreiben, Gruppen- und Globaleinstellungen
|
||||
schedule.py Berechnung des nächsten Termins
|
||||
naming.py Namensschema und Beschreibungs-Vorlagen
|
||||
proxmox.py pvesh-Anbindung (Inventar, Snapshots anlegen/löschen)
|
||||
engine.py Auswahl der Gäste, Anlegen, Aufräumen
|
||||
daemon.py Hauptschleife, Signale, Sperren
|
||||
state.py merkt sich die letzten Läufe
|
||||
preflight.py prüft die Umgebung (root, /etc/pve beschreibbar, /root)
|
||||
cli.py Kommandozeile
|
||||
curses_util.py gemeinsame curses-Bausteine
|
||||
tui.py ncurses-Konfigurationseditor
|
||||
snapfs.py Snapshots einbinden und mounten (rbd/zfs/lvm/qcow2)
|
||||
explorer.py Zwei-Fenster-Explorer im Terminal
|
||||
recovery.py Snapshot als Maschine starten (Klone, Konfiguration, Aufräumen)
|
||||
recovery_ui.py ncurses-Oberfläche und Kommandozeile dazu
|
||||
transfer.py Austauschlaufwerke: anlegen, ein-/aushängen, Verriegelung
|
||||
transfer_ui.py deren Bildschirm (Taste v in pvesnap-recovery)
|
||||
web/ Web-Oberfläche zum Herunterladen
|
||||
```
|
||||
|
||||
Alle vier Werkzeuge teilen sich `proxmox.py`. `snapfs.py` liefert Explorer und
|
||||
Web-Oberfläche einen ganz gewöhnlichen Pfad, sodass sie nichts über Ceph, ZFS
|
||||
oder LVM wissen müssen; `recovery.py` geht den anderen Weg und überlässt das
|
||||
Klonen der Storage-Schicht von Proxmox selbst.
|
||||
@@ -0,0 +1,256 @@
|
||||
# Alle Einstellungen
|
||||
|
||||
Die Datei liegt unter `/etc/pvesnap/pvesnap.conf` und ist eine gewöhnliche
|
||||
INI-Datei mit drei Arten von Abschnitten:
|
||||
|
||||
```ini
|
||||
[global] # gilt für alles
|
||||
[defaults] # Vorgaben für alle Gruppen (optional)
|
||||
[group:NAME] # eine Gruppe, beliebig viele davon
|
||||
```
|
||||
|
||||
Nach jeder Änderung:
|
||||
|
||||
```bash
|
||||
pvesnap check
|
||||
systemctl reload pvesnap
|
||||
```
|
||||
|
||||
!!! note "Zeitangaben"
|
||||
|
||||
Überall dasselbe Format: `30s`, `15m`, `1h`, `6h`, `2d12h`, `1w`.
|
||||
`0` heißt „unbegrenzt" bzw. „keine".
|
||||
|
||||
!!! note "Kommentare am Zeilenende"
|
||||
|
||||
Hinter jedem Wert darf ein Kommentar stehen:
|
||||
|
||||
```ini
|
||||
keep_time = 7d # eine Woche
|
||||
```
|
||||
|
||||
Einzige Ausnahme ist `description` — dort bleibt die Zeile unverändert,
|
||||
damit ein `#` in der Beschreibung erhalten bleibt.
|
||||
|
||||
---
|
||||
|
||||
## `[global]`
|
||||
|
||||
| Schlüssel | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `prefix` | `auto` | Namenspräfix aller pvesnap-Snapshots. Bestimmt zugleich, was jemals gelöscht wird — siehe [Namensschema](../sichern/index.md#namensschema). |
|
||||
| `check_interval` | `60s` | wie oft der Dienst nach Fälligem schaut |
|
||||
| `state_file` | `/var/lib/pvesnap/state.json` | merkt sich die letzten Läufe |
|
||||
| `log_level` | `INFO` | `DEBUG`, `INFO`, `WARNING`, `ERROR` |
|
||||
| `log_file` | — | zusätzliche Protokolldatei; ohne sie geht alles ins Journal |
|
||||
| `task_timeout` | `15m` | Geduld mit einem einzelnen Proxmox-Task |
|
||||
| `retries` | `2` | zusätzliche Versuche, wenn eine Sperre belegt ist |
|
||||
| `retry_delay` | `60s` | Wartezeit vor dem nächsten Versuch |
|
||||
| `pause_between` | `0s` | Pause zwischen zwei Gästen |
|
||||
| `run_on_start` | `no` | beim Dienststart sofort einen Durchlauf machen |
|
||||
| `dry_run` | `no` | `yes` = nichts wirklich tun, nur protokollieren |
|
||||
| `description` | siehe unten | Standard-Beschreibung aller Snapshots |
|
||||
|
||||
```ini
|
||||
[global]
|
||||
prefix = auto
|
||||
check_interval = 60s
|
||||
state_file = /var/lib/pvesnap/state.json
|
||||
log_level = INFO
|
||||
task_timeout = 15m
|
||||
retries = 2
|
||||
retry_delay = 60s
|
||||
pause_between = 0s
|
||||
run_on_start = no
|
||||
dry_run = no
|
||||
description = pvesnap | Gruppe: {group} | erstellt: {datetime} | Vorhaltezeit: {keep_time} | max: {keep_count}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## `[defaults]`
|
||||
|
||||
Vorgaben für **alle** Gruppen. Jede Gruppe darf sie einzeln überschreiben.
|
||||
|
||||
```ini
|
||||
[defaults]
|
||||
enabled = yes
|
||||
skip_stopped = no
|
||||
vmstate = no
|
||||
```
|
||||
|
||||
Erlaubt sind hier dieselben Schlüssel wie in einer Gruppe.
|
||||
|
||||
!!! warning "Der Editor löst `[defaults]` auf"
|
||||
|
||||
Beim Speichern im [ncurses-Editor](../sichern/editor.md) verschwindet der
|
||||
Abschnitt — die Werte stehen danach in jeder Gruppe einzeln. Inhaltlich
|
||||
ändert sich nichts.
|
||||
|
||||
---
|
||||
|
||||
## `[group:NAME]`
|
||||
|
||||
### Allgemein
|
||||
|
||||
| Schlüssel | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `enabled` | `yes` | Gruppe aktiv. In der Auslieferung stehen alle auf `no`. |
|
||||
|
||||
### Zeitplan
|
||||
|
||||
Entweder `interval` **oder** `schedule` — nicht beides.
|
||||
|
||||
| Schlüssel | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `interval` | — | `30m`, `1h`, `6h`, `2d12h`, `1w` |
|
||||
| `align` | `no` | `yes` = an der Uhr ausgerichtet (00:00, 00:30 …) |
|
||||
| `schedule` | — | `hourly`, `daily`, `weekly`, `monthly`, `yearly` |
|
||||
| `at` | — | Uhrzeit `HH:MM` bei `daily` und größer |
|
||||
| `minute` | `0` | Minute bei `hourly` |
|
||||
| `day_of_week` | `mo` | `mo di mi do fr sa so` bei `weekly` |
|
||||
| `day_of_month` | `1` | 1–31 bei `monthly`; zu große Werte fallen auf den Monatsletzten |
|
||||
| `month` | `1` | 1–12 bei `yearly` |
|
||||
|
||||
Einzelheiten unter [Zeitpläne](../sichern/zeitplan.md).
|
||||
|
||||
### Vorhaltezeit
|
||||
|
||||
| Schlüssel | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `keep_count` | `0` | höchstens so viele je VM und Gruppe (`0` = unbegrenzt) |
|
||||
| `keep_time` | `0` | nichts älter als (`0` = unbegrenzt) |
|
||||
| `keep_min` | `0` | so viele bleiben in jedem Fall stehen |
|
||||
|
||||
**Mindestens eine von `keep_count` und `keep_time` muss gesetzt sein.**
|
||||
Einzelheiten unter [Vorhaltezeit](../sichern/vorhaltezeit.md).
|
||||
|
||||
### Auswahl der Gäste
|
||||
|
||||
| Schlüssel | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `all` | `no` | alle VMs und Container |
|
||||
| `vmids` | — | `100,101,105-110` |
|
||||
| `names` | — | `web-*, db-0?` — mit `*`, `?`, `[abc]` |
|
||||
| `tags` | — | `produktion, wichtig` |
|
||||
| `pools` | — | `Kunden` |
|
||||
| `types` | — | `qemu` oder `lxc`; leer = beides |
|
||||
| `exclude_vmids` | — | |
|
||||
| `exclude_names` | — | |
|
||||
| `exclude_tags` | — | |
|
||||
|
||||
Einschlüsse wirken als **ODER**, Ausschlüsse gewinnen immer. Einzelheiten unter
|
||||
[Welche Gäste?](../sichern/auswahl.md).
|
||||
|
||||
### Snapshot-Optionen
|
||||
|
||||
| Schlüssel | Vorgabe | |
|
||||
|---|---|---|
|
||||
| `vmstate` | `no` | Arbeitsspeicher mitsichern — nur QEMU, nur bei laufender VM |
|
||||
| `skip_stopped` | `no` | gestoppte Gäste überspringen |
|
||||
| `description` | aus `[global]` | eigene Beschreibung für diese Gruppe |
|
||||
|
||||
---
|
||||
|
||||
## Platzhalter der Beschreibung
|
||||
|
||||
| | | |
|
||||
|---|---|---|
|
||||
| `{group}` | Name der Gruppe | `täglich` |
|
||||
| `{group_slug}` | Kurzname im Snapshot | `taeglich` |
|
||||
| `{vmid}` | VMID | `101` |
|
||||
| `{name}` | Name des Gastes | `db01` |
|
||||
| `{type}` | `VM` oder `LXC` | `VM` |
|
||||
| `{node}` | Cluster-Knoten | `pve1` |
|
||||
| `{pool}` | Proxmox-Pool | `Hausnetz` |
|
||||
| `{tags}` | Tags des Gastes | `produktion,datenbank` |
|
||||
| `{date}` | Datum | `2026-08-09` |
|
||||
| `{time}` | Uhrzeit | `02:30:00` |
|
||||
| `{datetime}` | beides | `2026-08-09 02:30:00` |
|
||||
| `{timestamp}` | Unix-Zeit | `1786257000` |
|
||||
| `{keep_time}` | Vorhaltezeit der Gruppe | `3w` |
|
||||
| `{keep_count}` | Anzahl | `14` |
|
||||
| `{schedule}` | Zeitplan im Klartext | `täglich um 02:30` |
|
||||
|
||||
Ein unbekannter Platzhalter führt nicht zum Abbruch — dann wird eine
|
||||
Ersatzbeschreibung eingesetzt.
|
||||
|
||||
---
|
||||
|
||||
## Deutsche Schreibweisen
|
||||
|
||||
Damit die Datei lesbar bleibt, versteht pvesnap eine Reihe deutscher Synonyme:
|
||||
|
||||
| deutsch | entspricht |
|
||||
|---|---|
|
||||
| `aktiv`, `aktiviert` | `enabled` |
|
||||
| `intervall` | `interval` |
|
||||
| `zeitplan` | `schedule` |
|
||||
| `uhrzeit`, `zeit` | `at` |
|
||||
| `wochentag` | `day_of_week` |
|
||||
| `monatstag` | `day_of_month` |
|
||||
| `monat` | `month` |
|
||||
| `anzahl`, `max_anzahl`, `behalte_anzahl` | `keep_count` |
|
||||
| `vorhaltezeit`, `behalte_zeit`, `max_alter` | `keep_time` |
|
||||
| `mindestens` | `keep_min` |
|
||||
| `alle` | `all` |
|
||||
| `namen` | `names` |
|
||||
| `typen` | `types` |
|
||||
| `beschreibung` | `description` |
|
||||
| `ausschluss_vmids` | `exclude_vmids` |
|
||||
| `ausschluss_namen` | `exclude_names` |
|
||||
| `gestoppte_ueberspringen` | `skip_stopped` |
|
||||
|
||||
Bindestriche und Unterstriche sind austauschbar, Groß- und Kleinschreibung egal.
|
||||
|
||||
---
|
||||
|
||||
## Eine vollständige Beispieldatei
|
||||
|
||||
```ini
|
||||
[global]
|
||||
prefix = auto
|
||||
check_interval = 60s
|
||||
state_file = /var/lib/pvesnap/state.json
|
||||
log_level = INFO
|
||||
task_timeout = 15m
|
||||
retries = 2
|
||||
retry_delay = 60s
|
||||
pause_between = 0s
|
||||
run_on_start = no
|
||||
dry_run = no
|
||||
description = pvesnap | Gruppe: {group} | erstellt: {datetime} | Vorhaltezeit: {keep_time} | max: {keep_count}
|
||||
|
||||
[defaults]
|
||||
enabled = yes
|
||||
skip_stopped = no
|
||||
vmstate = no
|
||||
|
||||
[group:stuendlich]
|
||||
interval = 1h
|
||||
align = yes
|
||||
keep_count = 24
|
||||
keep_time = 2d
|
||||
keep_min = 1
|
||||
tags = stuendlich
|
||||
skip_stopped = yes
|
||||
|
||||
[group:taeglich]
|
||||
schedule = daily
|
||||
at = 02:30
|
||||
keep_count = 14
|
||||
keep_time = 21d
|
||||
keep_min = 1
|
||||
tags = produktion
|
||||
exclude_tags = nosnap
|
||||
|
||||
[group:monatlich]
|
||||
schedule = monthly
|
||||
day_of_month = 1
|
||||
at = 04:00
|
||||
keep_count = 6
|
||||
keep_time = 400d
|
||||
all = yes
|
||||
exclude_tags = nosnap, pvesnap-recovery
|
||||
description = Monatssicherung {name} ({vmid}) vom {date}
|
||||
```
|
||||
@@ -0,0 +1,192 @@
|
||||
# Speicherarten
|
||||
|
||||
Nicht jedes Proxmox-Storage kann alles. Diese Seite fasst zusammen, was wo geht.
|
||||
|
||||
---
|
||||
|
||||
## Die Übersicht
|
||||
|
||||
| Storage | Snapshots | Dateien lesen | Als Maschine starten | Vom Snapshot lösen |
|
||||
|---|---|---|---|---|
|
||||
| **`rbd`** (Ceph) | ✅ | ✅ | ✅ | ✅ nötig |
|
||||
| **`zfspool`** | ✅ | ✅ | ✅ | ❌ nicht möglich |
|
||||
| **`lvmthin`** | ✅ | ✅ | ✅ | — nicht nötig |
|
||||
| **`lvm`** (dick) | ❌ | — | — | — |
|
||||
| **`dir`, `nfs`, `cifs`** (qcow2) | ✅ | ✅ | ❌ | — |
|
||||
| **`dir`, `nfs`, `cifs`** (raw) | ❌ | — | — | — |
|
||||
|
||||
---
|
||||
|
||||
## Ceph / RBD
|
||||
|
||||
**Die beste Grundlage für pvesnap.** Alles geht, und es geht clusterweit.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Snapshot | `rbd snap create`, sofort |
|
||||
| Hineinsehen | `rbd map pool/image@snap`, bei nicht unterstützten Image-Features über `rbd-nbd` |
|
||||
| Klonen | `rbd clone`, in etwa einer Sekunde — unabhängig von der Größe |
|
||||
| Wiederherstellung startbar auf | **jedem Node des Clusters** (geteiltes Storage) |
|
||||
|
||||
### Die eine Eigenheit
|
||||
|
||||
RBD verlangt für einen Klon, dass der Quell-Snapshot **geschützt** ist
|
||||
(`rbd snap protect`). Solange ein Klon existiert, ist der Snapshot damit
|
||||
unlöschbar, und die [Vorhaltezeit](../sichern/vorhaltezeit.md) scheitert an ihm
|
||||
mit `snapshot is protected`.
|
||||
|
||||
pvesnap geht damit sauber um: Beim [Verwerfen](../wiederherstellen/verwerfen.md)
|
||||
wird der Schutz wieder aufgehoben, und
|
||||
[`flatten`](../wiederherstellen/loesen.md) löst die Abhängigkeit ganz.
|
||||
|
||||
### Platz im Blick
|
||||
|
||||
```bash
|
||||
ceph df # MAX AVAIL beachten
|
||||
rbd -p <pool> du
|
||||
rbd -p <pool> ls -l # Spalte PARENT zeigt Klone
|
||||
```
|
||||
|
||||
!!! danger "`% RAW USED` täuscht"
|
||||
|
||||
Es berücksichtigt die Replikation nicht. Bei dreifacher Replikation kosten
|
||||
13 GB Nutzdaten 39 GB im Pool. **`MAX AVAIL`** ist die Zahl, die zählt.
|
||||
|
||||
Läuft ein Pool voll, blockiert er jeden Schreibvorgang — und damit alle VMs
|
||||
darauf. Selbst das Aufräumen wird dann schwierig, weil Löschen ebenfalls
|
||||
ein Schreibvorgang ist.
|
||||
|
||||
---
|
||||
|
||||
## ZFS
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| Snapshot | `zfs snapshot`, sofort |
|
||||
| Hineinsehen | Container direkt über `.zfs/snapshot/…`, VMs über einen temporären Klon |
|
||||
| Klonen | `zfs clone`, sofort |
|
||||
| Wiederherstellung startbar auf | dem Node mit dem Pool (bzw. clusterweit bei ZFS over iSCSI) |
|
||||
|
||||
### Lösen geht nicht
|
||||
|
||||
Der Klon hängt wie bei Ceph am Snapshot. `zfs promote` würde die Abhängigkeit
|
||||
nur **umdrehen** — danach hinge das Original am Klon. Das verschiebt das
|
||||
Problem, statt es zu lösen.
|
||||
|
||||
Echte Unabhängigkeit ginge nur über `zfs send | zfs recv` in einen neuen
|
||||
Datenträger. Das macht `flatten` nicht und sagt es auch so.
|
||||
|
||||
```bash
|
||||
zfs list -o space # USEDSNAP zeigt, was die Snapshots kosten
|
||||
zfs list -t snapshot
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## LVM-thin
|
||||
|
||||
**In einem Punkt angenehmer als Ceph:** Ein Thin-Snapshot ist ein
|
||||
eigenständiges Volume, das sich mit anderen nur die Blöcke im Pool teilt.
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
Platzsparend geteilt **und** trotzdem frei löschbar. Es gibt dort weder
|
||||
geschützte Snapshots noch etwas zu flatten.
|
||||
|
||||
### Der Preis: lokaler Speicher
|
||||
|
||||
`lvmthin` liegt auf einem einzelnen Node. Die Wiederherstellung muss auf
|
||||
demselben Node laufen wie das Original; `pvesnap-recovery` prüft das und lehnt
|
||||
einen anderen Node ab.
|
||||
|
||||
!!! 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
|
||||
```
|
||||
|
||||
Besonders die **Metadaten** — läuft der Metadatenbereich voll, ist der Pool
|
||||
nicht mehr zu retten, auch wenn noch Datenplatz frei ist.
|
||||
|
||||
---
|
||||
|
||||
## LVM (dick)
|
||||
|
||||
Proxmox kann dort **gar keine Snapshots**. Betroffene VMs melden im Protokoll:
|
||||
|
||||
```
|
||||
storage does not support snapshots
|
||||
```
|
||||
|
||||
Sie werden übersprungen, die übrigen laufen normal weiter.
|
||||
|
||||
Der Ausweg ist ein Umzug auf `lvmthin` — technisch derselbe Speicher, nur mit
|
||||
Thin-Provisioning:
|
||||
|
||||
```bash
|
||||
qm move-disk 101 scsi0 <thin-storage>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Verzeichnis-Storages (`dir`, `nfs`, `cifs`)
|
||||
|
||||
Hier kommt es auf das **Dateiformat** an:
|
||||
|
||||
| Format | Snapshots | |
|
||||
|---|---|---|
|
||||
| `qcow2` | ✅ | interne Snapshots im Abbild selbst |
|
||||
| `raw` | ❌ | keine Snapshot-Fähigkeit |
|
||||
| `vmdk` | ❌ | |
|
||||
|
||||
### Hineinsehen: ja
|
||||
|
||||
`qemu-nbd --load-snapshot` bindet den Snapshot schreibgeschützt ein. Explorer
|
||||
und Web-Oberfläche funktionieren also.
|
||||
|
||||
### Als Maschine starten: nein
|
||||
|
||||
!!! warning "Kein Klon aus einem qcow2-internen Snapshot"
|
||||
|
||||
Ein qcow2-interner Snapshot lässt sich nicht als eigenständiges Volume
|
||||
klonen. `pvesnap-recovery` lehnt das ab und verweist auf den Explorer.
|
||||
|
||||
Wer die Fähigkeit braucht, verschiebt die VM auf ein Storage, das Klone
|
||||
kann — Ceph, ZFS oder LVM-thin.
|
||||
|
||||
---
|
||||
|
||||
## Was passiert bei gemischten Datenträgern?
|
||||
|
||||
Hat eine VM Platten auf verschiedenen Storages, gilt für die
|
||||
**Wiederherstellung** die strengste Regel:
|
||||
|
||||
* Liegt eine Platte auf einem Storage, das keine Klone kann, geht es gar nicht
|
||||
* Liegt eine Platte auf lokalem Storage, ist der Node festgelegt
|
||||
* Ist ein Storage auf dem Zielnode nicht verfügbar, wird abgelehnt
|
||||
|
||||
Die [Zusammenfassung](../wiederherstellen/einrichten.md#die-zusammenfassung)
|
||||
nennt den Grund, bevor etwas angelegt wird.
|
||||
|
||||
---
|
||||
|
||||
## Empfehlung
|
||||
|
||||
| Lage | |
|
||||
|---|---|
|
||||
| **Cluster mit Ceph** | Ideal. Alles geht, von jedem Node aus. Nur an `flatten` denken, wenn eine Wiederherstellung bleibt. |
|
||||
| **Einzelner Host** | `lvmthin` oder ZFS. LVM-thin ist beim Lösen unkomplizierter, ZFS bietet dafür Prüfsummen und `zfs send`. |
|
||||
| **NFS-Storage** | qcow2 statt raw verwenden, dann geht wenigstens das Lesen. Für Wiederherstellungen ist es die falsche Grundlage. |
|
||||
| **LVM dick** | Auf `lvmthin` umstellen. Ohne Snapshot-Fähigkeit hat pvesnap dort nichts zu tun. |
|
||||
@@ -0,0 +1,148 @@
|
||||
# Tastenkürzel
|
||||
|
||||
Alle Oberflächen auf einer Seite. Zum Ausdrucken und Danebenlegen.
|
||||
|
||||
---
|
||||
|
||||
## `pvesnap config` — Gruppenliste
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++enter++ | Gruppe bearbeiten |
|
||||
| ++space++ | Gruppe ein- oder ausschalten |
|
||||
| ++n++ | neue Gruppe |
|
||||
| ++c++ | Gruppe kopieren |
|
||||
| ++d++ | Gruppe löschen |
|
||||
| ++g++ | globale Einstellungen |
|
||||
| ++v++ | Übersicht: welche VM in welcher Gruppe |
|
||||
| ++s++ | speichern |
|
||||
| ++r++ | Dienst neu laden |
|
||||
| ++q++ | Ende |
|
||||
|
||||
### Gruppenmaske
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++up++ ++down++ | Feld wählen |
|
||||
| ++page-up++ ++page-down++ | zehn Felder weiter |
|
||||
| ++enter++ ++space++ | Feld ändern bzw. umschalten |
|
||||
| ++v++ | VM-Auswahl öffnen |
|
||||
| ++q++ ++esc++ | zurück |
|
||||
|
||||
### VM-Auswahl
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++space++ | Gast an- oder abwählen |
|
||||
| ++a++ | alle |
|
||||
| ++n++ | keine |
|
||||
| ++i++ | Auswahl umkehren |
|
||||
| ++slash++ | filtern |
|
||||
| ++enter++ | übernehmen |
|
||||
| ++esc++ | abbrechen |
|
||||
|
||||
---
|
||||
|
||||
## `pvesnap-explorer`
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++tab++ | Fenster wechseln |
|
||||
| ++up++ ++down++ | bewegen |
|
||||
| ++enter++ | Verzeichnis öffnen oder Datei ansehen |
|
||||
| ++backspace++ ++left++ | ein Verzeichnis hoch |
|
||||
| ++home++ ++end++ | Anfang / Ende |
|
||||
| ++page-up++ ++page-down++ | seitenweise |
|
||||
| ++space++ | markieren |
|
||||
| ++asterisk++ | Markierung umkehren |
|
||||
| ++a++ | alle markieren |
|
||||
| ++u++ | Markierung aufheben |
|
||||
| ++f5++ ++c++ | Markiertes ins andere Fenster kopieren |
|
||||
| ++f3++ ++v++ | Datei ansehen (Text oder Hex) |
|
||||
| ++f7++ ++n++ | neues Verzeichnis (nur lokal) |
|
||||
| ++f6++ ++g++ | Verzeichnis direkt eingeben |
|
||||
| ++f2++ ++m++ | anderes Dateisystem des Snapshots wählen |
|
||||
| ++r++ | neu einlesen |
|
||||
| ++f1++ ++question++ | Hilfe |
|
||||
| ++f10++ ++q++ | eine Ebene zurück |
|
||||
|
||||
Während des Kopierens bricht ++esc++ ab.
|
||||
|
||||
---
|
||||
|
||||
## `pvesnap-recovery` — Übersicht
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++enter++ | Detailansicht |
|
||||
| ++n++ | neue Wiederherstellung |
|
||||
| ++s++ | starten |
|
||||
| ++h++ | herunterfahren |
|
||||
| ++x++ | verwerfen |
|
||||
| ++v++ | Austauschlaufwerke |
|
||||
| ++r++ | neu einlesen |
|
||||
| ++q++ | Ende |
|
||||
|
||||
### Detailansicht
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++s++ | starten |
|
||||
| ++h++ | herunterfahren |
|
||||
| ++e++ | Austauschlaufwerk auswerfen / einklinken |
|
||||
| ++v++ | Austauschlaufwerke verwalten |
|
||||
| ++p++ | SPICE und USB |
|
||||
| ++f++ | vom Quell-Snapshot lösen |
|
||||
| ++x++ | verwerfen |
|
||||
| ++q++ | zurück |
|
||||
|
||||
### Optionsmaske
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++up++ ++down++ | Feld wählen |
|
||||
| ++enter++ ++space++ | Feld ändern |
|
||||
| ++v++ | Austauschlaufwerke verwalten |
|
||||
| ++f10++ | anlegen |
|
||||
| ++q++ | abbrechen |
|
||||
|
||||
### Zusammenfassung
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++j++ | anlegen |
|
||||
| ++n++ ++q++ | abbrechen |
|
||||
| beliebige Taste | weiterblättern, wenn der Text länger ist als der Bildschirm |
|
||||
|
||||
---
|
||||
|
||||
## Austauschlaufwerke
|
||||
|
||||
| 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 |
|
||||
|
||||
### Mehrfachauswahl beim Anlegen einer Maschine
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++space++ | aus- oder abwählen |
|
||||
| ++enter++ | übernehmen |
|
||||
| ++q++ | abbrechen |
|
||||
|
||||
---
|
||||
|
||||
## Überall gleich
|
||||
|
||||
| Taste | |
|
||||
|---|---|
|
||||
| ++up++ ++down++ oder ++k++ ++j++ | in Auswahlfenstern bewegen |
|
||||
| ++enter++ | bestätigen |
|
||||
| ++esc++ ++q++ | abbrechen / zurück |
|
||||
| ++j++ ++n++ | Ja/Nein-Rückfragen |
|
||||
| ++ctrl+u++ | Eingabezeile leeren |
|
||||
Reference in New Issue
Block a user