Es gibt Dinge die funktionieren einfach und dann gibt es jene die brauchen etwas Handarbeit und jede Menge Zeit zum Ausarbeiten der einen funktionierenden Lösung.
Shadow Copy für einen Samba Server im Zusammenspiel mit ZFS Snapshots (via zfs-auto-snapshot) ist so ein Ding das nicht auf Anhieb laufen wollte.
Ziel war es die „Vorgängerversionen“-Funktion am Kunden Server zum Laufen zu bringen:
Als erstes habe ich zfs-auto-snapshot installiert (apt install zfs-auto-snapshot) und die bei der Installation angelegten default Cron Einträge wieder gleich entfernt (z.B. /etc/cron.daily/zfs-auto-snapshot – aber auch in cron.monthly und cron.weekly). Anschließend habe ich in der /etc/cron.d/zfs-auto-snapshot den vorhandenen Eintrag auskommentiert und durch folgende ersetzt:
*/5 * * * * root zfs-auto-snapshot -q -g -p zfsautosnap --label=frequent --keep=24 //
00 * * * * root zfs-auto-snapshot -q -g -p zfsautosnap --label=hourly --keep=24 //
00 4 * * * root zfs-auto-snapshot -q -g -p zfsautosnap --label=daily --keep=14 //
00 4 * * 0 root zfs-auto-snapshot -q -g -p zfsautosnap --label=weekly --keep=4 //
00 4 1 * * root zfs-auto-snapshot -q -g -p zfsautosnap --label=monthly --keep=18 //
In der Datei /usr/sbin/zfs-auto-snap mussten auch ein paar Anpassungen gemacht werden, hier das „diff“ meiner Änderungen:
37c37
< opt_sep=''
---
> opt_sep='_'
537,538c537
< #DATE=$(date --utc +%F-%H%M)
< DATE=$(date +%Y%m%d%H%M%S)
---
> DATE=$(date --utc +%F-%H%M)
541c540
< SNAPNAME="$opt_prefix${opt_label:+$opt_sep$opt_label}_$DATE"
---
> SNAPNAME="$opt_prefix${opt_label:+$opt_sep$opt_label}-$DATE"
Ich habe also in Zeile 37 den opt_sep geleert, das Datums Format in Zeile 537 auskommentiert und eine neue eingefügt – Jahr, Monat, Tag, Stunde, Minute und Sekunde ohne irgendwelche Leerräume. Zuletzt war dann noch eine kleine Anpassung im SNAPNAME in Zeile 540 nötig, der Bindestrich wurde durch ein „_“ ersetzt.
Somit bekommen die ZFS Snapshots dann folgendes Format:
daten@zfsautosnapdaily_20221118052500 0B - 1,29T -
daten@zfsautosnapweekly_20221124121300 238M - 1,30T -
daten@zfsautosnapmonthly_20221124121800 240M - 1,30T -
daten@zfsautosnaphourly_20221130130000 341M - 1,30T -
daten@zfsautosnaphourly_20221130140000 337M - 1,30T -
daten@zfsautosnaphourly_20221130150000 354M - 1,30T -
daten@zfsautosnapfrequent_20221201000000 233M - 1,30T -
daten@zfsautosnapfrequent_20221201010000 240M - 1,30T -
daten@zfsautosnapfrequent_20221201020000 240M - 1,30T -
daten@zfsautosnapfrequent_20221201030000 1,88M - 1,30T -
Ich habe wirklich viel getestet, aber mit keiner anderen Variante konnte ich die vfs_shadow_copy2 Funktion so zum Laufen bekommen dass auch wirklich alle Varianten (frequent/hourly/daily/…) funktioniert haben!
Da ich nicht für jede Freigabe ein eigenes ZFS Filesystem angelegt habe sonder meine Samba Daten in einem einzigen ZFS Filesystem liegen, reicht jetzt ebenso ein einziger Eintrag in der /etc/samba/smb.conf Datei (in der [global] Sektion) damit für alle Freigaben und Dateien die Shadow Copy Funktion zur Verfügung steht:
# global settings for vfs shadow_copy2
vfs objects = shadow_copy2
shadow:snapdir = .zfs/snapshot
shadow:sort = desc
shadow:format = _%Y%m%d%H%M%S
shadow:snapprefix = ^zfsautosnap\(daily\)\{0,1\}\(hourly\)\{0,1\}\(frequent\)\{0,1\}\(monthly\)\{0,1\}\(weekly\)\{0,1\}
shadow:delimiter = _
shadow:localtime = no
Ich habe etliche Varianten im Internet gefunden die mit anderen Regex und delimiter Werten arbeiten, aber keine Einzige davon hat bei mir funktioniert! Diese hier war die Einzige die das gewünschte Ergebnis brachte. Ein Grund zum Feiern. 🙂
Wichtig bei den Änderungen an der Samba Config – ein „smbcontrol smbd reload-config“ reicht zwar um die Konfiguration zu aktivieren, beim User kommt’s allerdings erst an wenn dessen Verbindungs-Prozess beendet und neu gestartet wurde.
Mit „smbstatus -p“ die passende PID heraussuchen und „kill [PID]“ schon wurde die Verbindung getrennt…
Der Speicherbedarf von den ZFS Snapshots hält sich in Grenzen, kann natürlich je nach Workload auch gravierend ausfallen – hier könnte es dann durchaus auch mal nötig sein dass man die Snapshots auf mancher Freigabe abschaltet oder den Zyklus verändert, beides bedingt dann allerdings ein ZFS Filesystem für die jeweilige Freigabe!
Ich hoffe diese kurze Anleitung ist auch für euch hilfreich, beim nächsten Mal habe ich das in deutlich kürzerer Zeit am Start!
… dass du Schwierigkeiten hattest, wundert mich nicht. Ich musste erst den Code von shadow_copy2 lesen, um zu verstehen, was Samba hier macht. Um es kurz zu machen – es geht viel einfacher, auch mit dem Standardnamensschema von zfs-auto-snapshot. Snapprefix sind fast irrelevant und delimiter funktioniert vollkommen anders als man es erwartet bzw. die Doku von samba es beschreiben.
shadow:snapprefix = zfs
shadow:delimiter = -20
shadow:format = -%Y-%m-%d-%H%M
Hab das ganze mal hier aufgeschrieben:
https://gist.github.com/sporkus/2dfaafe582b9385b09a1ad7809189b43?permalink_comment_id=4884543#gistcomment-4884543
Hallo Michael,
danke für’s Feedback – beim nächsten Mal wenn ich einen Server mit ZFS/Samba aufsetze werde ich das berücksichtigen und testen! 🙂
Schöne Grüße
Manfred