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
- Naming convention - Use dates and labels:
@daily-2025-01-15
- Regular schedule - Automate frequent snapshots
- Retention policy - Don't keep too many (uses space)
- Test restores - Verify you can recover
- Monitor space - Watch for snapshot space growth
- Recursive - Use
-r for consistent multi-dataset snapshots
intermediate | ZFS | Updated 2025-01-15
- zfs
- snapshots
- backup
- rollback
- clone
- restore