Skip to content

Instantly share code, notes, and snippets.

@ertug
Created July 17, 2011 18:26
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save ertug/1087896 to your computer and use it in GitHub Desktop.
Save ertug/1087896 to your computer and use it in GitHub Desktop.
Automatic ZFS Snapshot Rotation
#!/bin/bash
##
# original code: http://andyleonard.com/2010/04/07/automatic-zfs-snapshot-rotation-on-freebsd/
# 07/17/2011 - ertug: made it compatible with zfs-fuse which doesn't have .zfs directories
##
# Path to ZFS executable:
ZFS=/usr/local/sbin/zfs
# Parse arguments:
TARGET=$1
SNAP=$2
COUNT=$3
# Function to display usage:
usage() {
scriptname=`/usr/bin/basename $0`
echo "$scriptname: Take and rotate snapshots on a ZFS file system"
echo
echo " Usage:"
echo " $scriptname target snap_name count"
echo
echo " target: ZFS file system to act on"
echo " snap_name: Base name for snapshots, to be followed by a '.' and"
echo " an integer indicating relative age of the snapshot"
echo " count: Number of snapshots in the snap_name.number format to"
echo " keep at one time. Newest snapshot ends in '.0'."
echo
exit
}
# Basic argument checks:
if [ -z $COUNT ] ; then
usage
fi
if [ ! -z $4 ] ; then
usage
fi
# Snapshots are number starting at 0; $max_snap is the highest numbered
# snapshot that will be kept.
max_snap=$(($COUNT -1))
# Clean up oldest snapshot:
$ZFS list -t snapshot | grep -q ^${TARGET}@${SNAP}\.${max_snap}
if [ $? -eq 0 ] ; then
$ZFS destroy -r ${TARGET}@${SNAP}.${max_snap}
fi
# Rename existing snapshots:
dest=$max_snap
while [ $dest -gt 0 ] ; do
src=$(($dest - 1))
$ZFS list -t snapshot | grep -q ^${TARGET}@${SNAP}\.${src}
if [ $? -eq 0 ] ; then
$ZFS rename -r ${TARGET}@${SNAP}.${src} ${TARGET}@${SNAP}.${dest}
fi
dest=$(($dest - 1))
done
# Create new snapshot:
$ZFS snapshot -r ${TARGET}@${SNAP}.0
@LVLAaron
Copy link

LVLAaron commented Feb 7, 2012

Just wanted to say that this also works on www.zfsonlinux.org since it lacks the .zfs directory structure.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment