62 lines
1.7 KiB
Bash
62 lines
1.7 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
# this will take read-only btrfs snapshots and make it available in /srv/snapshots
|
||
|
|
||
|
# Information
|
||
|
NAME="btrfs-snapshots.sh"
|
||
|
VERSION="0.2.0"
|
||
|
AUTHOR="david@socialnerds.org"
|
||
|
LICENSE="MIT"
|
||
|
DESCRIPTION="$NAME (v$VERSION) takes snapshots of BTRFS volumes. It is written by $AUTHOR and published unter the $LICENSE license."
|
||
|
|
||
|
# variables
|
||
|
SUBVOLUMES="/"
|
||
|
DESTINATION_ROOT=/srv/snapshots
|
||
|
TIMESTAMP=$(date +%Y%m%d%H%M) #add %S if you want sub-minute snapshots
|
||
|
PREFIX="snapshot-"
|
||
|
NAME="$PREFIX$TIMESTAMP"
|
||
|
MAX_SNAPSHOTS=28 #how many snapshots should be kept?
|
||
|
|
||
|
# preflight checks
|
||
|
if [ $(whoami) != "root" ]; then
|
||
|
echo "error: you need to be root"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
# take the snapshots
|
||
|
for SUBVOLUME in $SUBVOLUMES; do
|
||
|
if [ -z ${SUBVOLUME#/} ]; then
|
||
|
SNAPSHOT_PATH="$DESTINATION_ROOT"
|
||
|
else
|
||
|
PATH="$DESTINATION_ROOT/${SUBVOLUME#/}"
|
||
|
fi
|
||
|
if [ ! -d $SNAPSHOT_PATH ]; then
|
||
|
echo "warning: snapshot path ($SNAPSHOT_PATH) does not yet exist. creating."
|
||
|
mkdir -p $SNAPSHOT_PATH
|
||
|
fi
|
||
|
if [ -d $SNAPSHOT_PATH/$NAME ]; then
|
||
|
echo "warning: snapshots with same name already exists. skipping."
|
||
|
else
|
||
|
#TODO: handle failed snapshots and failed link creations
|
||
|
btrfs -q subvolume snapshot -r $SUBVOLUME $SNAPSHOT_PATH/$NAME
|
||
|
if [ -h $SNAPSHOT_PATH/latest ]; then
|
||
|
rm $SNAPSHOT_PATH/latest
|
||
|
fi
|
||
|
ln -sf $SNAPSHOT_PATH/$NAME $SNAPSHOT_PATH/latest
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# prune old snapshots
|
||
|
SNAPSHOTS=$(ls -r $SNAPSHOT_PATH | grep $PREFIX)
|
||
|
i=0
|
||
|
for SNAPSHOT in $SNAPSHOTS; do
|
||
|
if [ $i -ge $MAX_SNAPSHOTS ]; then
|
||
|
#TODO: handle failed snapshot deletions
|
||
|
btrfs -q subvolume delete $SNAPSHOT_PATH/$SNAPSHOT
|
||
|
fi
|
||
|
i=$((i+1))
|
||
|
done
|
||
|
|
||
|
# end script successfully
|
||
|
exit 0
|