From 9ece30fa7c70f7e31ce9e3f37ef202b582c7c88c Mon Sep 17 00:00:00 2001 From: root <root@pontos01.fi.muni.cz> Date: Sat, 7 Mar 2020 11:21:55 +0100 Subject: [PATCH] tar backup type autodetect + parallel compression --- backup-tar/backup.sh | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/backup-tar/backup.sh b/backup-tar/backup.sh index dd8f4a7..5165156 100755 --- a/backup-tar/backup.sh +++ b/backup-tar/backup.sh @@ -2,18 +2,38 @@ set -e +COMPRESS_THRS=$(($(nproc) / 4)) +[[ $COMPRESS_THRS -eq 0 ]] && COMPRESS_THRS=1 +[[ $COMPRESS_THRS -gt 8 ]] && COMPRESS_THRS=8 + fail() { echo "$1" >&2 exit 1 } -[[ "$1" = "full" ]] || [[ "$1" = "weekly" ]] || [[ "$1" = "daily" ]] || \ +TYPE=$1 +[[ "$TYPE" ]] || { + set -x + LAST_FULL=$(date --date=$(ls *.snar | sort | grep full | tail -n1 | sed 's/[.].*$//') +%s) + LAST_BIG=$(date --date=$(ls *.snar | sort | grep '\(full\|weekly\)' | tail -n1 | sed 's/[.].*$//') +%s) + NOW=$(date +%s) + # do a full backup every 8 weeks + if [[ $(($NOW - $LAST_FULL)) -ge $((3600 * 24 * 7 * 8)) ]]; then + TYPE=full + elif [[ $(($NOW - $LAST_BIG)) -ge $((3600 * 24 * 7)) ]]; then + TYPE=weekly + else + TYPE=daily + fi + set +x + echo "Performing $TYPE backup (autodetected)" >&2 +} +[[ "$TYPE" = "full" ]] || [[ "$TYPE" = "weekly" ]] || [[ "$TYPE" = "daily" ]] || \ fail "usage: $0 [full|weekly|daily]" TARGET=backup-$HOSTNAME@antea LOCAL_HOME_ID=$(stat -c %d /home) SOURCES=$(comm -12 <(getent passwd | cut -d: -f6 | sort) <(for i in /home/*; do [[ $(stat -c %d $i) -eq $LOCAL_HOME_ID ]] && echo $i; done)) -TYPE=$1 TIMESTAMP=$(date +"%Y-%m-%d") BACKUP_FILE=${TYPE}/${TIMESTAMP}.tar.xz @@ -36,5 +56,6 @@ fi set -x ssh $TARGET "mkdir -p $TYPE" -tar --create --xz --xattrs --acls --listed-incremental=$INCFILE $SOURCES | ssh $TARGET "cat > $BACKUP_FILE" +tar --create --xattrs --acls --listed-incremental=$INCFILE $SOURCES | \ + xz -T$COMPRESS_THRS -3 | ssh $TARGET "cat > $BACKUP_FILE" scp $INCFILE $TARGET:$INCFILE_TGT -- GitLab