ZFS Autosnapshot auf zvol und Datasets mounten

You would like to show your appreciation for our help 8-o. Gladly. 🙏 We thank you for your donation!

In-house Apt-Repo: https://apt.iteas.at
GITLAB Enterprise:

  • Automatische Snapshots von VM's und CT's in definierten Zeiten anfertigen lassen, z.B. alle 10 Minuten
  • Rollback einzelner virtuellen Festplatten, z.B. nur Laufwerk C:\ bei Windows
  • Direktes recovern von Dateien in VM-Images via cp oder Filezilla
  • Klonen von bestimmten Snapshotständen um z.B. Tests durchzuführen
  • Verschlüsselungstrojaner haben keine Chance
  • Proxmoxsnapshots und Replicationen sind weiterhin nutzbar

Annahme hier ist ein Proxmox 7.3 System mit Kernel 5.19. Für Installation benutzen wir wie immer „apt“.

apt install zfs-auto-snapshot

Nach der Installation ist Autosnapshot bereits für alle Zvol's und Datasets aktiviert. Viel wichtiger ist die Frage ob ich die Autosnapshots überall haben möchte. Ich mach das genau umgekehrt. Ich deaktiviere global und aktiviere dann einzelne Disks wo ich das für sinnvoll halte.

Um das ganze manuell unter Kontrolle zu haben musst gleich nach der Installation die Autosnapshotfunktion für alle Pool's deaktivieren. Damit kannst du danach einzelen Disks aktivieren.

zfs set com.sun:auto-snapshot=false rpool
zfs set com.sun:auto-snapshot=false Poolname-was-auch-immer
rpool                   com.sun:auto-snapshot  false    local
rpool/ROOT              com.sun:auto-snapshot  false    inherited from rpool
rpool/ROOT/pve-1        com.sun:auto-snapshot  false    inherited from rpool
rpool/data              com.sun:auto-snapshot  false    inherited from rpool

Enzellene Disks aktivierst du so:

zfs set com.sun:auto-snapshot=true pool/data/vm-110-disk-0

Umgekehrt gehts auch mit zfs inherit

Welche virtuellen HDD's nun für Autosnapshot aktiviert sind, siehts du mit

zfs get com.sun:auto-snapshot | grep true

Zeiten für die Snapshots kannst du hier konfigurieren:

/etc/cron.d/zfs-auto-snapshot # hier stelle ich gerne 10 Minuten ein
/etc/cron.daily/zfs-auto-snapshot # nach blieben anpassen
/etc/cron.hourly/zfs-auto-snapshot # nach blieben anpassen
/etc/cron.monthly/zfs-auto-snapshot # nach blieben anpassen
/etc/cron.weekly/zfs-auto-snapshot # nach blieben anpassen

Die Files sind selbsterklärend.

Achtung: Snapshot Zeit ist immer UTC damit man bei Zeitumstellungen nicht durcheinander kommt.

Achtung2: Du kannst weiterhin Snapshots in Proxmox nutzen. Vor der Nutzung Autosnapshot global deaktivieren, weil du bei einem Rollback des Proxmoxsnapshots alle in der Zwischenzeit getätige Snaps von Autosnapshot manuell auf der CMD löschen musst.

Autosnapshot deaktivieren:

chmod -x /usr/sbin/zfs-auto-snapshot

Autosnapshot wieder aktivieren:

chmod +x /usr/sbin/zfs-auto-snapshot

Natürlich möchtest du auch wieder Daten aus den Snapshots herausholen. Hierfür muss Snapshots als DEV sichtbar machen. Du kannst das auf ganze Pools oder auf einzellne Disks anwenden.

zfs set snapdev=visible pool/data/vm-110-disk-0

Danach kannst du das DEV read only mounten. z.B.

mount -o noload,ro /dev/zvol/rpool/data/vm-110-disk-0@zfs-auto-snap-2022-12-31-0638-part1 /mnt/snapshots   #Linux
mount -o ro /dev/zvol/rpool/data/vm-110-disk-0@zfs-auto-snap-2022-12-31-0638-part1 /mnt/snapshots   #Windows

In beiden Fällen muss die virtuelle Maschine herunter gefahren werden um eine Beschädigung des Filesystems zu vermeiden. Um eine virtuelle HDD direkt zurück zu spielen, machst du einfach ein Rollback.

zfs rollback rpool/data/vm-115-disk-2@zfs-auto-snap-2023-01-23-1130 -r

Dabei müssen auch alle neueren Snapshots gelöscht werden. Sollte das nicht gewollt sein, erstelle einen Klon. z.B.

zfs clone rpool/data/vm-115-disk-2@zfs-auto-snap-2023-01-23-1130 rpool/data/vm-999-disk-2

Nach dem Rollback kannst deine Maschine wieder starten. Möchtest du nur ein paar Daten aus einem Snapshot herausholen, musst du die VDEVS mounten. Erster Mountbefehl (siehe oben). Nun möchtest du ja die Daten auch direkt ohne Umwege zurückspielen. Deshalb mounten wir auch das aktuelle LiveVDEV der VM dazu. Hierzu muss die VM herunter gefahren werden.

mount /dev/zvol/rpool/data/vm-110-disk-0 /mnt/snaplive

Daten kannst du dann ganze einfach mit z.B. cp von A nach B übertragen. Danach zuerst das Snaplive und dann Snapshot unmounten. VM starten, fertig.

umount /mnt/snaplive
umount /mnt/snapshot

Daten eine laufende VM recovern

Auch das ist möglich. Dann eben über das Netzwerk. In Linux kannst du hierfür SSH verwenden, in Windows verwendest du Filezilla. Sollten die Proxmoxserver so eingestellt sein das eine Auth nur mittels SSH-Key möglich ist, muss die Passwortauth vor dem Kopiervorgang temporär freigeschalten werden.

sshd_config
...
# To disable tunneled clear text passwords, change to no here!
- PasswordAuthentication no
+ PasswordAuthentication yes
#PermitEmptyPasswords no
...

Danach den SSH-Server neustarten. Nach dem Kopieren sind die Einstellungen wieder zurück zu setzten. Möglicherweise macht das auch Puppet für dich ;-)

Bei Datasets ist es einfacher, kann mit z.B.

mount -t zfs rpool/data/home@rep_home_2022-07-05_00:36:48 /mnt/snapshots

eingebunden werden.

Um das ganze automatisch und elegant mit ZFS zu gestalten machten den Ordner .zfs in Datasets sichtbar. Z.B.

zfs set snapdir=visible  rpool/data/home

Danach wird das gewünschte Snapshot automatisch beim Zugriff auf .zfs/snapshot/rep_home_2022-07-16_00:01:25 gemountet.