104 lines
4.0 KiB
Bash
104 lines
4.0 KiB
Bash
|
#!/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
|