Last active
August 18, 2018 16:25
-
-
Save shimarin/9660210 to your computer and use it in GitHub Desktop.
backup script using rsync and btrfs
This file contains 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
#!/bin/bash | |
BACKUP_ROOT=rsync://backup.local/backup | |
LOGFILE=/var/log/backup.log | |
PIDFILE=/run/backup.pid | |
FAILFILE=/run/backup.fail | |
exec_rsync() { | |
local name=$1 | |
local source=$2 | |
rsync -avx --delete-excluded $source $BACKUP_ROOT/$name | |
} | |
exec_backup() { | |
local name=$1 | |
local source=$2 | |
local snapshot_size=$3 | |
echo "Taking backup of $name..." | |
if [ -d $source ]; then | |
exec_rsync $name $source/ | |
elif [ -b $source ] && lvs $source; then | |
lvcreate --snapshot --size=$snapshot_size --name $source-ss4backup $source && | |
( | |
local tmpdir=`mktemp -d` && | |
( | |
mount -o ro $source-ss4backup $tmpdir && | |
( | |
exec_rsync $name $tmpdir/ | |
RET=$? | |
umount $tmpdir | |
exit $RET | |
) | |
RET=$? | |
rmdir $tmpdir | |
exit $RET | |
) | |
RET=$? | |
lvremove -f $source-ss4backup | |
exit $RET | |
) | |
else | |
echo "Unknown source type" | |
false | |
fi | |
} | |
[ -f $PIDFILE ] && exit | |
echo $$ > $PIDFILE | |
tty -s || exec >$LOGFILE 2>&1 | |
trap 'rm $PIDFILE; [ "$?" = "0" ] && rm -f $FAILFILE || touch $FAILFILE' EXIT | |
date | |
exec_backup `hostname` / | |
lvs --noheadings --nameprefixes -o lv_name,lv_path @need-backup | while read line; do | |
eval $line | |
exec_backup $LVM2_LV_NAME $LVM2_LV_PATH 1G | |
done | |
date |
This file contains 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
#!/bin/bash | |
DOW=`date +%a` | |
BACKUP_ROOT=/var/backup | |
LOGFILE=$BACKUP_ROOT/head/00backup.log | |
PIDFILE=/run/backup.pid | |
FAILFILE=/run/backup.fail | |
exec_rsync() { | |
local name=$1 | |
local source=$2 | |
[ -f $BACKUP_ROOT/head/$name.exclude ] && local exclude_option="--exclude-from=$BACKUP_ROOT/head/$name.exclude" || local exclude_option="" | |
mkdir -p $BACKUP_ROOT/head/$name && rsync -avx --delete-excluded $exclude_option $source $BACKUP_ROOT/head/$name >$BACKUP_ROOT/head/$name.log 2>&1 | |
} | |
exec_dd() { | |
local name=$1 | |
local source=$2 | |
dd if=$source of=$BACKUP_ROOT/head/$name.bin bs=4096 > $BACKUP_ROOT/head/$name.log 2>&1 | |
} | |
exec_backup() { | |
local conf=$1 | |
local name=$(basename $conf .conf) | |
unset source snapshot_size | |
. $conf | |
echo "Taking backup of $name..." | |
[[ -v source ]] || source=`wb vm-device $name` | |
[[ -v snapshot_size ]] || snapshot_size="1G" | |
if [ -d $source ]; then | |
exec_rsync $name $source/ | |
elif [ -b $source ] && lvs $source; then | |
lvcreate --snapshot --size=$snapshot_size --name $source-ss4backup $source && | |
( | |
local tmpdir=`mktemp -d` && | |
( | |
mount -o ro $source-ss4backup $tmpdir && | |
( | |
exec_rsync $name $tmpdir/ | |
RET=$? | |
umount $tmpdir | |
exit $RET | |
) || | |
( | |
exec_dd $name $source-ss4backup | |
) | |
RET=$? | |
rmdir $tmpdir | |
exit $RET | |
) | |
RET=$? | |
lvremove -f $source-ss4backup | |
exit $RET | |
) | |
else | |
echo "Unknown source type" | |
false | |
fi | |
[ $? -eq 0 ] && rm -f $BACKUP_ROOT/head/$name.fail || touch $BACKUP_ROOT/head/$name.fail | |
} | |
[ -f $PIDFILE -o ! -d $BACKUP_ROOT ] && exit | |
echo $$ > $PIDFILE | |
trap 'rm $PIDFILE; [ "$?" = "0" ] && rm -f $FAILFILE || touch $FAILFILE' EXIT | |
btrfs filesystem sync $BACKUP_ROOT > /dev/null || { echo "$BACKUP_ROOT is not mounted as a btrfs volume" 1>&2 ; exit 1; } | |
tty -s || exec >$LOGFILE 2>&1 | |
date | |
[ -d $BACKUP_ROOT/head ] || btrfs subvolume create $BACKUP_ROOT/head | |
btrfs filesystem sync $BACKUP_ROOT/head || { echo "$BACKUP_ROOT/head is not a valid btrfs subvolume" 1>&2 ; exit 1; } | |
shopt -s nullglob | |
for i in $BACKUP_ROOT/head/*.conf; do | |
exec_backup $i | |
done | |
[ -d $BACKUP_ROOT/$DOW ] && btrfs filesystem sync $BACKUP_ROOT/$DOW && btrfs subvolume delete $BACKUP_ROOT/$DOW | |
[ -d $BACKUP_ROOT/$DOW ] && { echo "Unable to create a snapshot due to already existing directory $BACKUP_ROOT/$DOW" 1>&2 ; exit 1; } | |
btrfs subvolume snapshot -r $BACKUP_ROOT/head $BACKUP_ROOT/$DOW || { echo "Failed to create snapshot $BACKUP_ROOT/$DOW" 1>&2; exit 1; } | |
date |
This file contains 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
#!/bin/sh | |
BACKUP_ROOT=/var/lib/backup | |
HEAD=$BACKUP_ROOT/head | |
EXPORT_DIR=$BACKUP_ROOT/export | |
LOGFILE=/var/log/export.log | |
tty -s || exec >$LOGFILE 2>&1 | |
[ -f $EXPORT_DIR/.export_here ] || exit 1 | |
for i in `find $HEAD -maxdepth 1 -mindepth 1 -type d -printf "%f\n"`;do | |
tar zcvpf $EXPORT_DIR/$i.tar.gz.tmp -C $HEAD/$i . && mv $EXPORT_DIR/$i.tar.gz.tmp $EXPORT_DIR/$i.tar.gz | |
done | |
for i in `find $HEAD -maxdepth 1 -mindepth 1 -type f -name '*.bin' -printf "%f\n"`; do | |
gzip -c $HEAD/$i > $EXPORT_DIR/$i.gz.tmp && mv $EXPORT_DIR/$i.gz.tmp $EXPORT_DIR/$i.gz | |
done |
This file contains 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
#!/bin/sh | |
BACKUP_ROOT=/var/lib/backup | |
LOGFILE=/var/log/snapshot.log | |
DOW=`LANG=C date +%a` | |
tty -s || exec >$LOGFILE 2>&1 | |
btrfs filesystem sync $BACKUP_ROOT/head || exit 1 | |
[ -d $BACKUP_ROOT/$DOW ] && btrfs filesystem sync $BACKUP_ROOT/$DOW && btrfs subvolume delete $BACKUP_ROOT/$DOW | |
[ -d $BACKUP_ROOT/$DOW ] && { echo "Unable to create a snapshot due to already existing directory $BACKUP_ROOT/$DOW"; exit 1; } | |
btrfs subvolume snapshot -r $BACKUP_ROOT/head $BACKUP_ROOT/$DOW || { echo "Failed to create snapshot $BACKUP_ROOT/$DOW"; exit 1; } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment