Skip to content

Instantly share code, notes, and snippets.

@tomfanning
Last active October 25, 2017 10:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomfanning/c7a9b16f70c55210f1ffc534847e463f to your computer and use it in GitHub Desktop.
Save tomfanning/c7a9b16f70c55210f1ffc534847e463f to your computer and use it in GitHub Desktop.
ZFS snapshot
# unproven as yet
# initial backup
zfs snapshot -r tank1@backup
zfs send -R tank1@backup | zfs receive -vF usb5tb
# incrementals
# it is optional to delete snapshots - in which case just create a snapshot with name base on time.
zfs rename -r tank1@backup tank1@previous_backup # rename the "old" snapshot
zfs snapshot -r tank1@backup # take a new snapshot
zfs send -Ri tank1@previous_backup tank1@backup | zfs receive -Fduv usb5tb # incremental replication
zfs destroy -r tank1@previous_backup # get rid of the previous snapshot
# https://web.archive.org/web/20120822104120/http://www.aisecure.net/2012/01/11/automated-zfs-incremental-backups-over-ssh/
# https://forums.freebsd.org/threads/30325/
# create target
zpool create usb5tb /dev/disk/by-path/pci-0000\:00\:1a.0-usb-0\:1.4\:1.0-scsi-0\:0\:0\:0 -O compression=lz4 -O mountpoint=/mnt/usb5tb
zfs create usb5tb/backup
# initial
zfs send -R tank1@backup | zfs receive -Fduv usb5tb/backup
# incremental
zfs snapshot -r tank1@backup2
zfs send -R -i tank1@backup tank1@backup2 | zfs receive -Fduv usb5tb/backup
# When sending, -R allows me to send the snapshots, their children and their properties.
# When receiving, -F forces a rollback to the most recent snapshot, -d maintains my naming scheme and -u makes sure that the associated file systems do not get mounted.
zfs destroy -r tank1@backup
zfs destroy -r usb5tb/backup@backup
zfs rename -r tank1@backup2 tank1@backup
zfs rename -r usb5tb/backup@backup2 usb5tb/backup@backup
# a bit of a script:
#!/bin/sh
pool="tank1"
destination="usb5tb/backup"
now=`date +"%Y-%m-%d-%H%M%S"`
# create now snapshot
snapshot_now="$pool@backup_$now"
echo "Taking now snapshot, $snapshot_now"
zfs snapshot -r $snapshot_now
# look for previous snapshot
if zfs list -H -o name -t snapshot | grep "$pool@backup_" > /dev/null; then
snapshot_yesterday=`zfs list -H -o name -t snapshot | grep "$pool@backup_" | sort -r | tail -n +2`
echo "Previous snapshot, $snapshot_yesterday, exists, lets proceed with backup"
zfs send -R -i $snapshot_yesterday $snapshot_now | zfs receive -Fduv $destination
echo "Backup complete, destroying previous snapshot on source"
zfs destroy -r $snapshot_yesterday
echo "and on destination"
dest_prev_snapshot=`zfs list -H -o name -t snapshot | grep "$destination@backup_" | sort -r | tail -n +2`
zfs destroy -r $dest_prev_snapshot
exit 0
else
echo " missing previous snapshot, $snapshot_yesterday, doing initial non-incremental transfer"
zfs send -R $snapshot_now | zfs receive -Fduv $destination
exit 0
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment