#!/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