Last active
October 25, 2017 10:40
-
-
Save tomfanning/c7a9b16f70c55210f1ffc534847e463f to your computer and use it in GitHub Desktop.
ZFS snapshot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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