ZFS, automatische Snapshots

TCM

Well-Known Member
Hi,

das hier ist mir grad so eingefallen. Das Script macht von allen datasets, die eine bestimmte user property haben, einen Snapshot, wobei es bei Filesystemen noch per zfs diff guckt, ob es Änderungen zu einem ggf. vorherigen Snapshot gibt, damit die Anzahl der Snapshots nicht ausufert.

Alte Snapshots zu recyclen ist noch nicht drin. Kann man evtl. auch über user properties machen.

Vielleicht findets ja einer hilfreich.

Edit: Die Idee ist natürlich, das alle x Minuten per cron zu starten. User properties sind solche, die ein : enthalten. Gängige Konvention ist, die Komponenten der Domain, unter der das läuft, umzudrehen und dann die property anzuhängen. Für einen Host unter foo.example also example.foo:autosnapshots.

Code:
#!/bin/sh -u
PATH=/usr/bin:/usr/sbin:/bin:/sbin

property='example.foo:autosnapshot'

zfs get -H -o name,value -r -t filesystem,volume ${property} \
| while read dataset value; do
    [ "${value}" = "on" ] || continue

    lastsnapshot=''
    snapshotrequired=0

    case $(zfs list -H -o type ${dataset}) in
        filesystem)
            lastsnapshot=$(zfs list -d 1 -H -o name -t snapshot ${dataset} | tail -n 1)

            if [ -n "${lastsnapshot}" ]; then
                # previous snapshot exists, check for changes
                [ -n "$(zfs diff -H ${lastsnapshot})" ] && snapshotrequired=1
            else
                # no previous snapshot exists, create one
                snapshotrequired=1
            fi
            ;;
        volume)
            # no diff checking for volumes
            snapshotrequired=1
            ;;
    esac
    [ ${snapshotrequired} -eq 1 ] && zfs snapshot ${dataset}@auto_$(date +'%Y%m%d-%H%M')
done
 
Zuletzt bearbeitet:
Hi,
[...]
Alte Snapshots zu recyclen ist noch nicht drin. Kann man evtl. auch über user properties machen.

Jupp, haben wir hier so gemacht.
Eine Userproperty, in der z.B. "monthly=6,weekly=8,daily=21" drin steht, entsprechend wird rotiert nach dem Erstellen der Snapshots.

Rob
 
[...], wobei es bei Filesystemen noch per zfs diff guckt, ob es Änderungen zu einem ggf. vorherigen Snapshot gibt, damit die Anzahl der Snapshots nicht ausufert.

Dazu könntest du auch das native property "written" abfragen. Das sind die Anzahl Bytes, die seit dem letzten Snapshot geschrieben wurden. Wenn es da 0 ist, gab es ergo keine Änderung. Ist performanter als das zfs diff.

Rob
 
Good point und naheliegend. War bei mir nicht so auf dem Radar bis jetzt.

Edit: Irgendwie habe ich aber auf manchen datasets winzige written-Werte von um die 112K, wo zfs diff nichts anzeigt.
 
Zuletzt bearbeitet:
Könnten das atime-Updates sein? Ich bin mir grad nicht schlüssig, was ich da mache.

1) atime abschalten? Sind immerhin Daten, die nützlich sein könnten
2) winzige Writes einfach ignorieren kommt nicht in Frage
3) bei zfs diff bleiben
 
Ich hab schon manchmal nachschauen wollen/müssen, wann eine Datei gelesen wurde, deswegen bin ich da etwas zögerlich, Daten einfach wegzuwerfen.

Was mich grad son bisschen wundert: zfs diff ignoriert atime anscheinend, was ja auch irgendwie Sinn ergibt, aber irgendwie auch nicht.
 
Ich mounte seit Jahren alles noatime. Wenn Du irgendeinen LRU Precaching Dienst hättest könnte der vielleicht was mit so einer Info anfangen. Aber sonst … ich hatte noch nie eine Verwendung dafür.
 
Zurück
Oben