Rotera ZFS snapshots i FreeBSD
Denna guide beskriver hur man automatiskt roterar snapshots på ZFS system.
Snapshot skript
Ny version av skriptet som inte kör rename för att rotera snapshots:en:
\ while read name value; do [ $value -gt 0 ] 2>/dev/null
Skapa följande skript och spara som /root/bin/zfs-autosnap.sh:
#!/bin/sh usage() { cat <<EOF usage: ${0##*/} <label> Rotates filesystem snapshots. If filesystem has the property org.freebsd:snap:<label>=<count>, increments all existing snapshots labeled <label>.<num> and creates a new snapshot called <label>.0. Destroys snapshot numbered <label>.<count>. EOF exit } # Default values : ${PROP:=org.freebsd:snap} # Parse command line [ ${#} -ne 1 ] && usage label=${1} issnap() { [ "$(/sbin/zfs get -Ho value type "$1" 2>/dev/null)" = "snapshot" ] } # Iterate over all filesystems with ${PROP}:${label} > 0 /sbin/zfs list -Ho name,${PROP}:${label} -t filesystem | \ while read name value; do [ $value -gt 0 ] 2>/dev/null || continue # Destroy the oldest snapshot value=$((${value} - 1)) snap="${name}@${label}" issnap ${snap}.${value} && /sbin/zfs destroy ${snap}.${value} # Increment existing snapshots while [ ${value} -gt 0 ]; do next=$((${value} - 1)) issnap ${snap}.${next} && /sbin/zfs rename "${snap}.${next}" "${snap}.${value}" value=$next done # Make new snapshot /sbin/zfs snapshot ${snap}.0 done
Gör skriptet exekverbart av root:
Crontab
För att automatiskt rotera varje timme, dagligen och varje vecka, kör kommandot crontab och lägg till följande rader:
@hourly /root/bin/zfs-autosnap.sh hourly @daily /root/bin/zfs-autosnap.sh daily @weekly /root/bin/zfs-autosnap.sh weekly
Rotera snapshots
För att rotera snapshots på ett ZFS filsystem, sätter man egenskapen: org.freebsd:snap:{hourly|daily|weekly}=<count>. Antal snapshots innan rotering, styrs via <count> variabeln. Sätts t.ex. värdet till 7, kommer snapshots med nummer 0,1, ..., 6 dvs 7 stycken snapshots sparas. Den senaste snapshot:en är alltid nummer 0.
Exempel: Skapa snapshots av trunk/home/peter dagligen, spara 7 stycken innan den äldsta raderas: