Zum Inhalt springen

ZFS Snapshots und Samba Shadow Copy

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!

Schlagwörter:

2 Gedanken zu „ZFS Snapshots und Samba Shadow Copy“

  1. … 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

    1. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert