Достался в наследство от сенсея.
Изначально бэкап делался рсинком, но из-за высокой I/O нагрузки которую создавал рсинк серверу становилось очень плохо.
Переделал чтобы бэкапилось таром и гзипалось.
Основною попоболью было исключение каталогов. tar упорно не хотел принимать кучу --exclude, не брал их во внимание.
Оказывается exclude подходит для исключения файлов по маске, а для каталогов надо юзать --exclude-from и уже в файле описывать все нужные исключения.
Пример того как это все работает -
[root@srv bin]# cat increment.sh
#!/bin/sh
#Система резервного копирования контейнеров
#Каждое воскресенье делаем полный бэкап, с понедельника по субботу диференциальные
#проверка на root
#if [ $(id -u) -eq 0 ]; then echo "Root can't do that"; exit 1; fi
[ $# -lt 1 ] && { echo "Usage: ${0##*/}"; exit 1; }
TAR="/bin/tar --create --ignore-failed-read --one-file-system --numeric-owner --sparse --totals --wildcards --exclude-from=/usr/local/bin/excluded_dirs --gzip"
SRC_DIR=$1
DST_DIR=$2
[ ! -d $SRC_DIR ] && { echo "Directory $SRC_DIR not found."; exit 1; }
[ ! -d $DST_DIR ] && { echo "Directory $DST_DIR not found."; exit 1; }
VE_LIST=`ls -1 $SRC_DIR`
DOW=`date +%u` # day of week (1..7); 1 is Monday, 7 is Sunday
for VEID in $VE_LIST
do
[ ! -d $SRC_DIR/$VEID ] && continue; #если вдруг попался не каталог, пропускаем его
cd $SRC_DIR/$VEID #перейдем в каталог который будем копировать, что-бы пути в архиве были относительно текущего каталога
if [ $DOW = '7' ] #Еженедельный полный бэкап, создаем новый файл изменений, старый сохраняем.
then
INC_FILE=$DST_DIR/inc$VEID.0
BACKUP_FILE=$DST_DIR/full$VEID.$DOW.tgz
[ -f $INC_FILE ] && mv -f $INC_FILE $INC_FILE.old;
echo "VE $VEID weekly full backup"
else
INC_FILE=$DST_DIR/inc$VEID
if [ -f $INC_FILE.0 ] #Если основного файла изменений нет - создаем его.
then
cp $INC_FILE.0 $INC_FILE
BACKUP_FILE=$DST_DIR/arc$VEID.$DOW.tgz
echo "VE $VEID ${DOW}-s differential backup"
else #Делаем бэкап на основе файла изменений.
INC_FILE=$INC_FILE.0
BACKUP_FILE=$DST_DIR/full$VEID.$DOW.tgz
echo "Incremental file not found for VE $VEID, full backup"
fi
fi
$TAR --file=$BACKUP_FILE --listed-incremental=$INC_FILE ./ 2>&1
done
[root@vhn1 bin]# cat /usr/local/bin/excluded_dirs
proc
sys
var/spool/asterisk/monitor
usr/local/BGInetAccounting