Dauerhafter Schutz mit ZFS Auto Snapshots
ZFS-Snapshots in Proxmox: Aufbewahrung und Wiederherstellung
Wie wir mit ZFS Auto Snapshot ältere Datenstände erhalten und im Notfall VMs, LXC-Container und NAS-Dateien wiederherstellen.
Was ist ein ZFS-Snapshot?
Ein ZFS-Snapshot ist eine schreibgeschützte Momentaufnahme eines Dateisystems oder ZVOLs. ZFS nutzt Copy-on-Write: Änderungen werden in neue Blöcke geschrieben. Der Snapshot hält die Verweise auf die bisherigen Blöcke fest.
Es entsteht keine vollständige Datenkopie. Zusätzlichen Speicher benötigen vor allem ältere Blöcke, die nach Änderungen oder Löschungen nur noch für Snapshots erhalten bleiben. Unveränderte Blöcke werden gemeinsam genutzt.
ZFS-Snapshots und VMware-Snapshots
| Merkmal | ZFS | VMware vSphere / ESXi |
|---|---|---|
| Ebene | Dateisystem oder ZVOL | Virtuelle Maschine |
| Verfahren | Alte Datenblöcke bleiben referenziert. | Neue Schreibzugriffe landen bei klassischen Snapshots in Delta-Dateien. |
| Arbeitsspeicher | Wird nicht erfasst. | Kann optional erfasst werden. |
| Löschen | Gibt nicht mehr benötigte Blöcke frei. | Konsolidiert die Delta-Daten; der aktuelle Stand bleibt erhalten. |
Klassische VMware-Snapshots sind für kurzfristige Rückkehrpunkte gedacht; Broadcom empfiehlt höchstens 72 Stunden Aufbewahrung. Diese Empfehlung lässt sich nicht auf ZFS-Snapshots übertragen. Die VMware-Umsetzung kann je nach Speicherplattform abweichen. VMware-Empfehlungen
Unsere Snapshot-Aufbewahrung: ungefähr drei Monate
Die Crontab bestimmt die Ausführungszeitpunkte. Pro Zeitstufe behalten wir eine feste Anzahl von Snapshots:
| Intervall | Reihe | Anzahl | Ungefähres Fenster |
|---|---|---|---|
| Alle 15 Minuten | frequent |
12 | 3 Stunden |
| Stündlich | hourly |
96 | 4 Tage |
| Täglich | daily |
21 | 3 Wochen |
| Wöchentlich | weekly |
6 | 6 Wochen |
| Monatlich | monthly |
3 | 3 Monate |
Je neuer der Datenstand, desto feiner die Auswahl. Für heutige Fehler gibt es viele Rückkehrpunkte. Für spät bemerkte Fehler bleiben ältere Tages-, Wochen- und Monatsstände.
Die Fenster sind Richtwerte, keine garantierten Mindestzeiten. Die tatsächliche Reichweite hängt vom Cron-Zeitpunkt und erfolgreichen Ausführungen ab. Eine bestimmte Dateiversion ist nur wiederherstellbar, wenn mindestens ein noch vorhandener Snapshot sie erfasst hat.
Wie arbeitet ZFS Auto Snapshot?
Cron startet das Programm. Es wählt die vorgesehenen Datenbereiche aus, erstellt einen Snapshot mit Zeitstufe und Zeitstempel und entfernt ältere passende Snapshots nach der eingestellten Anzahl.
Bei der Stundenreihe bleibt beispielsweise mit --label=hourly --keep=96 nach dem Aufräumen eine Auswahl von 96 Stundenständen. Die Reihen sind unabhängig: Ein Viertelstunden-Snapshot wird nicht später zum Tages- oder Monatssnapshot umgewandelt.
Die verwendeten ZFS-Befehle
| Befehl | Aufgabe |
|---|---|
zpool status |
Poolzustand und laufende Scrubs prüfen. |
zfs list |
Datenbereiche, Auto-Snapshot-Eigenschaften und vorhandene Snapshots auslesen. |
zfs snapshot |
Neue Momentaufnahme erstellen; mit -r auch für untergeordnete Datasets. |
zfs destroy -d |
Alte Snapshots entfernen oder deren Löschung vormerken, wenn Holds oder Clones sie noch benötigen. |
zfs get |
Optional die seit dem letzten Snapshot geschriebenen Daten prüfen. |
Die Auswahl lässt sich über Eigenschaften wie com.sun:auto-snapshot und com.sun:auto-snapshot:hourly steuern. Diese Beschreibung bezieht sich auf die Linux-Implementierung von zfsonlinux/zfs-auto-snapshot.
Warum Snapshots auch bei SSD-TRIM erhalten bleiben
TRIM meldet der SSD, welche Speicherbereiche der Pool nicht mehr benötigt. Die SSD darf deren Inhalt anschließend intern verwerfen.
Blöcke, die ein Snapshot noch benötigt, bleiben für ZFS belegt und werden nicht zum Trimmen freigegeben. Eine im aktuellen Dateisystem gelöschte Datei bleibt dadurch aus einem vorhandenen Snapshot wiederherstellbar.
Erst wenn keine Referenz mehr besteht, können die Blöcke freigegeben und später getrimmt werden. Snapshot-Löschung und TRIM sind getrennte Vorgänge; Auto Snapshot führt keinen eigenen Pool-TRIM aus.
Proxmox: Rollback, Snapshot-Verzeichnis oder Clone?
Wir verwenden ZFS Auto Snapshot. Unsere Wiederherstellung erfolgt auf ZFS-Ebene; Proxmox stoppt und startet die Gäste.
| Ziel | Geeigneter Weg |
|---|---|
| Einzelne LXC- oder NAS-Dateien retten | Aus dem Snapshot-Verzeichnis herauskopieren. |
| Alten Stand untersuchen oder reparieren | Separaten beschreibbaren Clone erstellen. |
| Produktiven Speicher vollständig zurücksetzen | Gast stoppen, Rollback durchführen, Gast starten. |
Rollback einer VM oder eines LXC-Containers
Die folgenden Befehle sind Vorlagen. IDs, Speicherbereiche und Snapshot-Namen müssen zum Gast passen. Vorher wird sichergestellt, dass beispielsweise HA den Gast nicht automatisch neu startet.
VM mit ZVOL:
qm stop 100
zfs rollback rpool/data/vm-100-disk-0@SNAPSHOTNAME
# Erst nach erfolgreichem Rollback starten:
qm start 100
LXC mit Dateisystem-Dataset:
pct stop 200
zfs rollback rpool/data/subvol-200-disk-0@SNAPSHOTNAME
# Erst nach erfolgreichem Rollback starten:
pct start 200
qm stop und pct stop stoppen unmittelbar. Anwendungen werden vorher möglichst geordnet beendet. Bei mehreren Festplatten oder Datasets müssen alle benötigten Bereiche auf zusammenpassende Stände gebracht werden; erst danach startet der Gast.Ohne Zusatzoption erlaubt ZFS nur den neuesten Snapshot. Für einen älteren Stand ermöglicht zfs rollback -r das Zurücksetzen, löscht dabei aber neuere Snapshots und Bookmarks des betroffenen Speicherbereichs. Untergeordnete Datasets werden nicht automatisch zurückgesetzt. OpenZFS: Rollback
Snapshot-Verzeichnis für LXC und NAS
Bei Dateisystem-Datasets erreichen wir die alten Dateien auf dem Host unter:
<MOUNTPOINT>/.zfs/snapshot/<SNAPSHOTNAME>/
Der Inhalt ist schreibgeschützt. Wir kopieren benötigte Dateien zunächst in ein separates Wiederherstellungsverzeichnis. Beim Zurückkopieren bleiben Eigentümer und Rechte erhalten, insbesondere bei unprivilegierten LXC-Containern. Vor dem Ersetzen aktiver Anwendungsdateien stoppen wir die betroffene Anwendung.
snapdir=visible macht .zfs in Verzeichnislisten sichtbar. Bei hidden funktioniert normalerweise der direkte Pfad. Ein ZVOL für eine VM besitzt kein solches Dateiverzeichnis.
Clones für eine separate Wiederherstellung
Ein ZFS-Clone ist ein beschreibbarer Speicherbereich aus einem Snapshot. Für LXC oder NAS mounten wir ihn separat. Einen ZVOL-Clone können wir als zusätzliche Festplatte einer Wiederherstellungs-VM zuordnen und darin auf das Gast-Dateisystem zugreifen.
Der aktuelle Datenbestand bleibt erhalten. Clones benötigen anfangs kaum zusätzlichen Platz, eigene Änderungen belegen neue Blöcke. Der Ursprungssnapshot bleibt erforderlich, solange der Clone davon abhängt.
Ein manueller ZFS-Clone ist noch kein startfertiger Proxmox-Gast. Speicherzuordnung und Konfiguration müssen eingerichtet werden. Ein daraus gestarteter Testgast erhält zunächst ein getrenntes Netzwerk, damit keine doppelten IP-Adressen oder gleichzeitig aktiven Dienste entstehen.
OpenZFS: Snapshot-Zugriff und Clones
Grenzen der Wiederherstellung
Auto-Snapshots erfassen die ausgewählten Speicherbereiche. RAM, separat gespeicherte Proxmox-Gastkonfigurationen und externe Mounts gehören nicht automatisch dazu. Ein konsistenter ZFS-Snapshot garantiert außerdem keine Anwendungskonsistenz einer laufenden Datenbank.
zfs send und zfs receive auf ein anderes System muss zusätzlich eingerichtet werden.