Skip to content

A tool to (recursively) create ZFS snapshots and run a script for each such snapshot to e.g. create a backups

License

Notifications You must be signed in to change notification settings

meineerde/ohsnap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 

Repository files navigation

OHSNAP

CI

A tool to (recursively) create ZFS snapshots and run a script for each such snapshot (e.g. to create a backup). After all snapshots were handled, they are deleted again.

This tool is especially useful to create backups with borg or other tools.

Example invocation

/mnt/tank/local/ohsnap/ohsnap -v --recursive --mount /var/run/ohsnap -- tank /mnt/tank/local/backup_dataset

See ohsnap --help for details.

For this to work, you need a backup script to handle each snapshot. This script can look as follows. Of course, you can adapt it according to your specific needs. According to the above invocation, this script is in /mnt/tank/local/backup_dataset.

#!/bin/sh

BORG="/mnt/tank/local/borg_wrapper"

if [[ "$OHSNAP_DATASET" =~ ^tank/(\..*|backup|local)(/|$) ]]; then
  # Don't backup those datasets
  exit 0
fi

# Replace slashes in dataset name with a double-colon
# to form the borg archive name
archive="${OHSNAP_DATASET////::}"

"$BORG" create --verbose "::${archive}--${OHSNAP_TIMESTAMP}" .
"$BORG" prune --list --prefix "${archive}--" \
  --keep-daily=8 \
  --keep-weekly=5 \
  --keep-monthly=13

Finally, I found it useful to use a wrapper around borg to set the local environment on each invocation. That way. you can easily mount backups and adjust things as required. I have added the wrapper script in /mnt/tank/local/borg_wrapper

#!/bin/sh

export BORG_CACHE_DIR="/mnt/tank/local/.cache/borg"
export BORG_CONFIG_DIR="/mnt/tank/local/.config/borg"

export BORG_RSH="ssh -i /mnt/tank/local/.ssh/id_ed25519 -p 23 -o ChallengeResponseAuthentication=no -o PasswordAuthentication=no -o BatchMode=yes"
export BORG_REPO="[email protected]:borg"

export BORG_PASSPHRASE="SET_YOUR_PASSPHRASE_HERE"
export BORG_KEY_FILE="/mnt/tank/local/.config/borg/keys/u123456_your_storagebox_de__borg"

/mnt/tank/local/borg-freebsd64 "$@"

Restore

In FreeBSD (and FreeNAS), you need to mount the fuse kernel module first. Then, you can mount a borg archive using our wrapper

kldload fuse
/mnt/tank/local/borg_wrapper mount ::tank::work--2020-03-31T08:17:50 /var/run/mnt/

About

A tool to (recursively) create ZFS snapshots and run a script for each such snapshot to e.g. create a backups

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Languages