Volle Ceph-Pools legen alle VMs darauf lahm. Vor jedem Snapshot gilt jetzt je Storage des Gastes: frei >= sofortiger Verbrauch + space_min_free (Vorgabe 20 %). Die Reserve bleibt also auch nach dem Snapshot frei. Reicht es nicht, wird der aelteste pvesnap-Snapshot des Gastes geloescht und neu geprueft, bis es reicht. Sind nur noch die neuesten space_keep (Vorgabe 7) uebrig, entfaellt der Snapshot und der naechste Gast kommt dran. Gezaehlt wird je Gast ueber alle Gruppen, anders als bei der Vorhaltezeit. Auf dem Testhost haette eine Grenze je Gruppe nie gegriffen: keep_count = 5 liegt unter 7, und 13 GiB steckten in einer Gruppe, die es nicht mehr gibt. Sofortiger Verbrauch: Dicke ZFS-Zvols muessen ihre Reservierung auch nach dem Snapshot garantieren, das kostet alles seit dem letzten Snapshot Geschriebene. Exakt ist das refreservation - usedbyrefreservation; die Werte kommen per zfs get, bei anderen Nodes per ssh ueber die IP aus dem Clusterstatus, weil Node-Namen nicht ueberall aufloesen. Dazu kommt der RAM bei vmstate. --dry-run zeigt die Rechnung je Storage. Ceph und ZFS geben Platz erst im Hintergrund frei. Deshalb wird nach jedem Loeschen gewartet, solange der Platz waechst, und erst nach space_settle (Vorgabe 30s) ohne Zuwachs weitergemacht. Ohne das wurde auf Ceph ein Snapshot zu viel geloescht. Laesst sich der Platz nicht feststellen, wird nichts geloescht und der Snapshot trotzdem versucht. Neu ist [mail]: eine Alarm-Mail je Gruppe und Lauf, wenn ein Snapshot wegen Platzmangels ausfaellt. STARTTLS oder SSL/TLS mit Zertifikatspruefung, ohne Rueckfall auf Klartext. Einzurichten im Editor (Taste m) oder von Hand, Test mit pvesnap mail-test. Liegt ein Passwort in der Datei, setzt der Editor die Rechte auf 600, auch fuer die .bak. Das Handbuch beschreibt, wie man Ceph (Ratios) und ZFS (Notreserve) frueher "voll" sagen laesst und was im Notfall zu tun ist. Ausserdem war "pvesnap run --dry-run" ueberall falsch: Die Option ist global und muss vor dem Unterbefehl stehen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
309 lines
9.2 KiB
Markdown
309 lines
9.2 KiB
Markdown
# 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 |
|
||
| `space_settle` | `30s` | Geduld, bis nach dem Löschen bei Platzmangel der Platz zurückkommt |
|
||
| `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}
|
||
```
|
||
|
||
---
|
||
|
||
## `[mail]`
|
||
|
||
Meldet per Mail, wenn wegen Platzmangels ein Snapshot ausfällt. Am bequemsten
|
||
im Editor: `pvesnap config`, Taste ++m++, dort sendet ++t++ eine Test-Mail. Von
|
||
der Kommandozeile geht das mit `pvesnap mail-test`.
|
||
|
||
```ini
|
||
[mail]
|
||
enabled = yes
|
||
server = mail.example.org
|
||
security = starttls
|
||
user = pvesnap@example.org
|
||
password = geheim
|
||
sender = pvesnap@example.org
|
||
recipients = admin@example.org, technik@example.org
|
||
```
|
||
|
||
| Schlüssel | Vorgabe | |
|
||
|---|---|---|
|
||
| `enabled` | `no` | Alarm einschalten |
|
||
| `server` | — | SMTP-Server |
|
||
| `security` | `starttls` | `starttls` (TLS nach dem Verbinden), `ssl` (SSL/TLS von Anfang an) oder `none` |
|
||
| `port` | passend zu `security` | `587`, `465` bzw. `25` |
|
||
| `tls_verify` | `yes` | Zertifikat des Servers prüfen; `no` nur bei selbstsignierten Zertifikaten |
|
||
| `user`, `password` | — | Anmeldung; ohne `user` wird nicht angemeldet |
|
||
| `sender` | — | Absender |
|
||
| `recipients` | — | Empfänger, mehrere mit Komma |
|
||
|
||
* Bietet der Server kein STARTTLS an, schlägt der Versand fehl. Auf Klartext
|
||
ausgewichen wird nie.
|
||
* Eine Anmeldung mit `security = none` lehnt `pvesnap check` ab, weil das Passwort
|
||
sonst im Klartext übertragen würde.
|
||
* Das Passwort steht im Klartext in der Datei. Der Editor setzt beim Speichern
|
||
die Rechte `600`; wer von Hand einträgt, macht das selbst. `pvesnap check` warnt,
|
||
wenn jeder die Datei lesen darf.
|
||
* Je Gruppe und Lauf geht höchstens eine Mail heraus, in der alle betroffenen
|
||
Gäste stehen. Bleibt das Problem bestehen, kommt sie bei jedem Lauf erneut.
|
||
* Scheitert der Versand, steht das im Protokoll. Die Snapshots laufen weiter.
|
||
|
||
---
|
||
|
||
## `[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 |
|
||
| `space_min_free` | `20%` | so viel muss vor dem Snapshot frei sein, auch absolut (`20G`); `0` = keine Prüfung |
|
||
| `space_keep` | `7` | so viele bleiben je VM auch bei Platzmangel stehen, über alle Gruppen gezählt |
|
||
|
||
**Mindestens eine von `keep_count` und `keep_time` muss gesetzt sein.**
|
||
Einzelheiten unter [Vorhaltezeit](../sichern/vorhaltezeit.md) und
|
||
[Platz vor dem Snapshot](../sichern/vorhaltezeit.md#platz-vor-dem-snapshot).
|
||
|
||
### 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` |
|
||
| `mindestens_frei` | `space_min_free` |
|
||
| `verschluesselung` | `security` |
|
||
| `benutzer` | `user` |
|
||
| `passwort` | `password` |
|
||
| `absender` | `sender` |
|
||
| `empfaenger` | `recipients` |
|
||
| `platzmangel_behalten` | `space_keep` |
|
||
| `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}
|
||
```
|