Skip to content

Instantly share code, notes, and snippets.

@shimarin
Last active August 18, 2018 16:25
Show Gist options
  • Save shimarin/9660210 to your computer and use it in GitHub Desktop.
Save shimarin/9660210 to your computer and use it in GitHub Desktop.
backup script using rsync and btrfs
#!/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
#!/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
#!/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
#!/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