dev/bash/backup/backup.sh

104 lines
4.0 KiB
Bash
Raw Normal View History

2011-04-09 19:06:44 +04:00
#!/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