mirror of
https://github.com/ItsDrike/dotfiles.git
synced 2024-11-10 02:39:40 +00:00
Add btrfs backup/snapshot script
This commit is contained in:
parent
dc4d6fd43f
commit
d7bf3a044d
110
root/usr/local/bin/btrfs-backup
Executable file
110
root/usr/local/bin/btrfs-backup
Executable file
|
@ -0,0 +1,110 @@
|
|||
#!/bin/bash
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Create a btrfs snapshot
|
||||
|
||||
Usage btrfs-backup <subvolume> <backup_dir> [options]
|
||||
|
||||
Will create a snapshot of given subvolume in given backup_dir.
|
||||
|
||||
Options:
|
||||
-h | --help: Display this message
|
||||
-t | --total: Total amount of allowed backups in the same backup_dir
|
||||
-n | --name: Name of the snapshot (appended after date)
|
||||
|
||||
Example for crontab (/etc/crontab):
|
||||
15,30,45 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/quaterly --total 4
|
||||
15,30,45 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/quaterly --total 4
|
||||
15,30,45 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/quaterly --total 4
|
||||
15,30,45 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/quaterly --total 4
|
||||
|
||||
0 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/hourly --total 8
|
||||
0 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/hourly --total 8
|
||||
0 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/hourly --total 8
|
||||
0 * * * * root /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/hourly --total 8
|
||||
|
||||
Example for Anacrontab (/etc/anacrontab):
|
||||
@daily 10 snapshot.daily.@ /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/daily --total 8
|
||||
@daily 10 snapshot.daily.@home /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/daily --total 8
|
||||
@daily 10 snapshot.daily.@data /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/daily --total 8
|
||||
@daily 10 snapshot.daily.@log /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/daily --total 8
|
||||
|
||||
@weekly 20 snapshot.weekly.@ /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/weekly --total 5
|
||||
@weekly 20 snapshot.weekly.@home /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/weekly --total 5
|
||||
@weekly 20 snapshot.weekly.@data /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/weekly --total 5
|
||||
@weekly 20 snapshot.weekly.@log /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/weekly --total 5
|
||||
|
||||
@monthly 30 snapshot.monthly.@ /usr/local/bin/btrfs-backup /.btrfs/@ /.btrfs/@snapshots/@/monthly --total 3
|
||||
@monthly 30 snapshot.monthly.@home /usr/local/bin/btrfs-backup /.btrfs/@home /.btrfs/@snapshots/@home/monthly --total 3
|
||||
@monthly 30 snapshot.monthly.@data /usr/local/bin/btrfs-backup /.btrfs/@data /.btrfs/@snapshots/@data/monthly --total 3
|
||||
@monthly 30 snapshot.monthly.@log /usr/local/bin/btrfs-backup /.btrfs/@log /.btrfs/@snapshots/@log/monthly --total 3
|
||||
EOF
|
||||
}
|
||||
|
||||
backup() {
|
||||
local now="$(date '+%Y_%M_%dT%H_%M_%S')"
|
||||
local name="$now"
|
||||
if [[ "$SNAPSHOT_NAME" ]]; then
|
||||
name="$name-$SNAPSHOT_NAME"
|
||||
fi
|
||||
btrfs subvolume snapshot -r "$SUBVOLUME" "$BACKUP_DIR/$name"
|
||||
|
||||
# Clean up older snapshots
|
||||
if [[ "$TOTAL_BACKUPS" -ne 0 ]]; then
|
||||
for i in $(find "$BACKUP_DIR" -maxdepth 1 | sort | head -n -"${TOTAL_BACKUPS}"); do
|
||||
btrfs subvolume delete "$i"
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
# Extract the last two arguments
|
||||
SUBVOLUME="$1"
|
||||
BACKUP_DIR="$2"
|
||||
shift
|
||||
shift
|
||||
|
||||
if [[ -z "$SUBVOLUME" || -z "$BACKUP_DIR" ]]; then
|
||||
echo "Error: Both subvolume and backup_dir must be provided."
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -d "$SUBVOLUME" ]]; then
|
||||
echo "Error: Specified subvolume path isn't a valid directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ ! -d "$BACKUP_DIR" ]]; then
|
||||
echo "Error: Specified backup directory path isn't a valid directory."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TOTAL_BACKUPS=0
|
||||
SNAPSHOT_NAME=""
|
||||
|
||||
while [[ "$1" ]]; do
|
||||
case "$1" in
|
||||
-h | --help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
-t | --total)
|
||||
shift
|
||||
TOTAL_BACKUPS="$1"
|
||||
shift
|
||||
;;
|
||||
-n | --name)
|
||||
shift
|
||||
SNAPSHOT_NAME="$1"
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
echo "Error: Unknown argument: $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
backup
|
Loading…
Reference in a new issue