Automatische zfs snapshots mit sanoid

Einer der Gründe für mich auf FreeBSD zu wechseln war das integrierte Dateisystem zfs mit den Möglichkeiten Snapshots zu erstellen. Um diese Snapshots bequem per Konfiguration zu steuern gibt es sanoid.

Unter FreeBSD ist das schnell installiert.

 sudo pkg install sanoid

Um den Namen seiner Dateisysteme zu sehen kann man einfach

sudo zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
zroot               51,0G   395G    96K  /zroot
zroot/ROOT          4,91G   395G    96K  none
zroot/ROOT/default  4,91G   395G  4,90G  /
zroot/tmp           13,3M   395G  12,0M  /tmp
zroot/usr           46,1G   395G    96K  /usr
zroot/usr/home      44,1G   395G  44,0G  /usr/home

Die Konfiguration ist recht simple. Ich möchte alle 5 Minuten einen Snapshot und davon 5 vorhalten. Dann 36 stündliche und 7 tägliche. Einmal pro Woche mache ich noch ein externes Backup mit restic.

vi /usr/local/etc/sanoid/sanoid.conf

[zroot/usr/home]
        use_template = production

### templates below this line ###

[template_production]
        frequent_period = 5
        frequently = 5
        hourly = 36
        daily = 7
        autosnap = yes
        autoprune = yes

Das ganze einmal manuell starten und das Ergebnis betrachten.

sudo /usr/local/bin/sanoid --cron

zfs list -t snapshot | grep auto
zroot/usr/home@autosnap_2021-02-14_08:05:39_daily           0      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_08:05:39_hourly          0      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_10:07:08_hourly          0      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_10:07:08_frequently      0      -  44,0G  -

Zum Testen mal ein Testfile das wir gleich löschen und restaurieren wollen

cd tmp
~/tmp]$ touch test2be-deleted

Nach einem schönen Sontagsspaziergang sah es dann so aus:

zroot/usr/home@autosnap_2021-02-14_08:05:39_daily           0      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_08:05:39_hourly          0      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_10:07:08_hourly      26,4M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:00:00_hourly      22,6M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:30:00_frequently  1,67M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:35:00_frequently  1,41M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:40:00_frequently  1,59M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:45:00_frequently  1,43M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:50:00_frequently  1,34M      -  44,0G  -
zroot/usr/home@autosnap_2021-02-14_11:55:00_frequently  1,28M      -  44,0G  -

Jetzt das Testfile löschen und aus einem älteren Snapshot restaurieren. Über ein .zfs Verzeichnis kann man einfach auf seine Snapshots zugreifen

rm test2be-deleted

ls /usr/home/.zfs/snapshot
total 14
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_08:05:39_daily
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_08:05:39_hourly
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_10:07:08_hourly
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_11:00:00_hourly
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_11:35:00_frequently
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_11:40:00_frequently
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_11:45:00_frequently
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_11:50:00_frequently
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_11:55:00_frequently
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_12:00:00_frequently
1 drwxr-xr-x  3 root  wheel  3  5 Jan. 19:20 autosnap_2021-02-14_12:00:00_hourly

ls /usr/home/.zfs/snapshot/autosnap_2021-02-14_12:00:00_frequently/hbauer/tmp
total 1
1 -rw-r--r--  1 hbauer  hbauer  0 14 Feb. 10:14 test2be-deleted

Man kann diese Snapshots dann auch noch mit Syncoid automatisch an andere zfs Server über ssh versenden. Eine Aufgabe für einen der nächsten Sonntage.