dev/bash/backup/backup.sh

104 lines
4.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# -------------------- НАСТРОЙКИ --------------------
#ARC_DIR="/home/bkp" # хранилище резервных копий
ARC_DIR="./bkp_dir" # хранилище резервных копий
#ARC_SYNC_DIR="/mnt/smb.backbone/bkp" # зеркало хранилища
ARC_SYNC_DIR="./remote_dir" # зеркало хранилища
#USR_DIRS="/home/kolan /home/tanya /home/ftp" # пользовательские директории для резервирования
USR_DIRS="./usr_data" # пользовательские директории для резервирования
USR_EXCL="" # исключения
#SYS_DIRS="/bin /boot /etc /lib32 /lib64 /opt /root /sbin /usr /var" # системные директории для резервирования
SYS_DIRS="./sys_data" # системные директории для резервирования
SYS_EXCL="/var/tmp" # исключения
FULL_NUM=2 # кол-во хранимых полных копий
#INCR_NUM=8 # кол-во инкр. копий между полными копиями
INCR_NUM=4 # кол-во инкр. копий между полными копиями
TAR="nice -n 19 ionice -c2 -n7 tar czp --one-file-system -f" # команда архивирования
EXT="tgz"
# -------------------- ПЕРЕМЕННЫЕ --------------------
NOW=`date +%Y%m%d\ %H:%M:%S`
HOSTNAME=`hostname`
ARC_DIR_HOST="$ARC_DIR/$HOSTNAME"
ARC_SYNC_DIR_HOST="$ARC_SYNC_DIR/$HOSTNAME"
DIRS="$SYS_DIRS $USR_DIRS"
EXCL="$SYS_EXCL $USR_EXCL"
# -------------------- ФУНКЦИИ --------------------
# Удаление "сломанных" инкрементальных копий,
# для которых не найдена полная копия
function rm_brok_incr
{
for dir in `ls $ARC_DIR_HOST`; do
full_arc_dirname=`cat $ARC_DIR_HOST/$dir/full-arc-dirname 2>/dev/null`
if [[ ( "$?" != "0" || ! -d $ARC_DIR_HOST/$full_arc_dirname ) && "`echo $dir|grep full`" == "" ]]; then
rm -rf $ARC_DIR_HOST/$dir
fi
done
}
# -------------------- MAIN --------------------
# создаём необходимые каталоги
mkdir -p $ARC_DIR_HOST $ARC_SYNC_DIR_HOST
# удаляем мусор
rm_brok_incr
# дата последней полной копии
LAST_FULL_DIR=`ls $ARC_DIR_HOST|grep full|tail -n1`
LAST_FULL_TIME=`echo $LAST_FULL_DIR|sed 's/-full//;s/\.//g;s/_/ /'`
# кол-во сделанных инкр. копий
INCR_COUNT=0
for dir in `ls $ARC_DIR_HOST`; do
if [[ "`echo $dir|grep full`" != "" ]]; then
INCR_COUNT=0
else
INCR_COUNT=$(($INCR_COUNT+1))
fi
done
# если кол-во инкр. копий превысило INCR_NUM,
# то необходимо делать новую полную резервную копию
if [[ $INCR_COUNT -ge $INCR_NUM ]]; then
LAST_FULL_DIR=""
LAST_FULL_TIME=""
fi
# выбор копии - полная или инкр.
BKP_DIRNAME=`date -d "$NOW" +%Y.%m.%d_%H:%M:%S`
if [[ "$LAST_FULL_DIR" == "" ]]; then # ----- полная копия
BKP_DIRNAME=$BKP_DIRNAME-full
mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME
# создаём полную резервную копию
for dir in $DIRS; do
dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`"
$TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --exclude "$EXCL"
done
else # ----- инкрем. копия
mkdir -p $ARC_DIR_HOST/$BKP_DIRNAME
echo $LAST_FULL_DIR > $ARC_DIR_HOST/$BKP_DIRNAME/full-arc-dirname
NEWER=`date -d "$LAST_FULL_TIME" +%Y-%m-%d\ %H:%M:%S`
# создаём резервную копию
for dir in $DIRS; do
dir_compatible_name="`echo $dir|sed 's/^\.//; s/^\///; s/\//^/g'`"
$TAR $ARC_DIR_HOST/$BKP_DIRNAME/$dir_compatible_name.$EXT $dir --newer "$NEWER" --exclude "$EXCL"
done
fi
# удаление старых резервных копий
for dir in `ls $ARC_DIR_HOST|grep full|head -n -$FULL_NUM`; do
rm -rf $ARC_DIR_HOST/$dir
done
# удаляем мусор
rm_brok_incr
# синхронизируем с зеркалом
rsync -rt --delete $ARC_DIR_HOST/ $ARC_SYNC_DIR_HOST
rsync -rt --delete $ARC_SYNC_DIR/ $ARC_DIR