HxHippy

ZFS Snapshots and Clones

Working with ZFS snapshots for backups, rollbacks, and cloning.

Last updated: 2025-01-15

Creating Snapshots

# Basic snapshot
zfs snapshot tank/data@snap1

# Recursive snapshot (all child datasets)
zfs snapshot -r tank@daily-2025-01-15

# Naming convention recommendation
zfs snapshot tank/data@$(date +%Y-%m-%d-%H%M)

Listing Snapshots

# List all snapshots
zfs list -t snapshot

# Snapshots for specific dataset
zfs list -t snapshot -r tank/data

# Show snapshot sizes
zfs list -t snapshot -o name,used,refer

# Show creation time
zfs list -t snapshot -o name,creation

Accessing Snapshot Data

# Snapshots accessible via .zfs hidden directory
ls /tank/data/.zfs/snapshot/

# Browse specific snapshot
ls /tank/data/.zfs/snapshot/snap1/

# Copy file from snapshot
cp /tank/data/.zfs/snapshot/snap1/important.txt /tank/data/

# Make .zfs visible
zfs set snapdir=visible tank/data

Rolling Back

# Rollback to snapshot (destroys changes since snapshot)
zfs rollback tank/data@snap1

# Rollback with intermediate snapshots
zfs rollback -r tank/data@snap1

# Force rollback (destroys clones too)
zfs rollback -Rf tank/data@snap1

Cloning

# Create writable clone from snapshot
zfs clone tank/data@snap1 tank/data-clone

# Promote clone (make it independent)
zfs promote tank/data-clone

# Now original depends on clone's snapshots

Destroying Snapshots

# Destroy single snapshot
zfs destroy tank/data@snap1

# Destroy range of snapshots
zfs destroy tank/data@snap1%snap5

# Destroy with dependencies
zfs destroy -R tank/data@snap1

Automated Snapshots

Using zfs-auto-snapshot

# Install
pkg install zfs-auto-snapshot

# Configure in crontab
# Frequent (every 15 min, keep 4)
*/15 * * * * root /usr/local/sbin/zfs-auto-snapshot -q -g --label=frequent --keep=4 //

# Hourly (keep 24)
0 * * * * root /usr/local/sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //

# Daily (keep 7)
0 0 * * * root /usr/local/sbin/zfs-auto-snapshot -q -g --label=daily --keep=7 //

# Weekly (keep 4)
0 0 * * 0 root /usr/local/sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //

# Monthly (keep 12)
0 0 1 * * root /usr/local/sbin/zfs-auto-snapshot -q -g --label=monthly --keep=12 //

Simple Script

#!/bin/sh
# /usr/local/bin/zfs-snap.sh

DATASET="tank/data"
KEEP=7
DATE=$(date +%Y-%m-%d)

# Create snapshot
zfs snapshot ${DATASET}@daily-${DATE}

# Remove old snapshots
zfs list -t snapshot -o name -H | grep "${DATASET}@daily-" | \
  head -n -${KEEP} | xargs -n 1 zfs destroy

Snapshot Best Practices

  1. Naming convention - Use dates and labels: @daily-2025-01-15
  2. Regular schedule - Automate frequent snapshots
  3. Retention policy - Don't keep too many (uses space)
  4. Test restores - Verify you can recover
  5. Monitor space - Watch for snapshot space growth
  6. Recursive - Use -r for consistent multi-dataset snapshots
intermediate ZFS Updated 2025-01-15
  • zfs
  • snapshots
  • backup
  • rollback
  • clone
  • restore