#!/bin/sh -euf MOUNT_DIRECTORY="/var/backups/dataset-snapshots" SNAPSHOT_LABEL="snap" usage() ( echo "snap.sh " echo echo "Creates or destroys a snapshot of a ZFS dataset, labelled with @$SNAPSHOT_LABEL." echo "Snapshots are automatically mounted in $MOUNT_DIRECTORY." echo "If a snapshot already exists, it is replaced." echo ) create_snapshot() ( DATASET="$1" SNAPSHOT_NAME="$DATASET@$SNAPSHOT_LABEL" SNAPSHOT_DIRECTORY="$MOUNT_DIRECTORY/$DATASET" if zfs list "$SNAPSHOT_NAME" >/dev/null 2>/dev/null; then echo "Snapshot already exists. Overwriting." destroy_snapshot "$DATASET" fi zfs snapshot "$SNAPSHOT_NAME" mkdir -p "$SNAPSHOT_DIRECTORY" mount -t zfs "$SNAPSHOT_NAME" "$SNAPSHOT_DIRECTORY" ) destroy_snapshot() ( DATASET="$1" SNAPSHOT_NAME="$DATASET@$SNAPSHOT_LABEL" umount "$SNAPSHOT_NAME" 2>/dev/null || true zfs destroy "$SNAPSHOT_NAME" ) case "${1:-help}" in "help") usage;; "snap") create_snapshot "$2";; "free") destroy_snapshot "$2";; esac