Простой скрипт для инкрементального бекапа директорий


Критерии:
1) Возможность делать бекапы на лету в условиях ограниченных системных ресурсов (например VPS)
2) Возможность нативно удалять устаревшие бекапы
3) Возможность работать с примонтированной файловой системой


Процесс
выбор пал на утилиту rdiff-backup (офф. сайт).
Все возможности данной утилиты вместе с примерами и документацией есть на сайте, скажу вкратце, что всем трем пунктам она соответствует.
В качестве хранилища для файлов я использую домашний роутер с внешним хардом (монтирую к серверу посредством sshfs), поэтому в скрипте использую именно ее. Кроме того, хотелось получать уведомления о результатах бекапа на почту — это также предусмотрено.


Результат

#!/bin/sh

REMOTE_ADDR='user@storage:/remote_path' # Путь до удаленного хранилища
MOUNTPOINT='/backup_remote' # Точка монтирования бекапного раздела
BACKUP_DIR='/somedir' # Директория которую хотим бекапить
MAILFROM='root@server' # Адрес, с которого посылать отчеты
MAILTO='mail@example.com' # Адрес, на который будут приходить отчеты
EXPIRE="1W" # Время, которое хранить инкрементальные файлы

TMP='/tmp/backup_tmp.tmp'

sshfs $REMOTE_ADDR $MOUNTPOINT > /dev/null 2>&1

if [ `mount | grep $MOUNTPOINT | grep -vc grep` = "0" ]; then
echo "Error mounting $MOUNTPOINT at `date +'%d/%m/%Y %H:%M'`" | mail -a "From: $MAILFROM" -s "Backup ERROR" $MAILTO
exit 1
fi

if [ ! -d $MOUNTPOINT/$BACKUP_DIR ]; then
mkdir -p $MOUNTPOINT/$BACKUP_DIR > /dev/null 2>&1
fi

printf "Processing $BACKUP_DIR... \n\n" >> $TMP
rdiff-backup --force --exclude-symbolic-links --exclude-sockets --exclude-special-files --exclude-fifos --exclude-device-files --no-hard-links --print-statistics $BACKUP_DIR $MOUNTPOINT/$BACKUP_DIR >> $TMP 2>&1
rdiff-backup --force --no-hard-links --remove-older-than $EXPIRE $MOUNTPOINT/$BACKUP_DIR >> $TMP 2>&1
printf "\n-----------------------\n\n" >> $TMP

ERRORS="no errors"

if [ `cat $TMP | grep 'Error' | grep -v 'Errors 0' | grep -cv grep` != "0" ]; then
ERRORS="errors detected"
fi

cat $TMP | mail -a "From: $MAILFROM" -s "Backup report (${ERRORS})" $MAILTO
rm -f $TMP
umount $MOUNTPOINT

exit 0


Итог
Поместив скрипт в крон получаем инкрементальные бекапы заданной директории с настраиваемым сроком хранения и отчетами о выполнении.
Восстановление файлов из последней версии можно производить простым копированием, для восстановления до определенной версии пользуемся утилитой rdiff-backup.

Приятного пользования!

Комментарии

Популярные сообщения из этого блога

Права на папки и файлы (unix/chmod)

Автоматическое монтирование дисков и разделов в Linux или что такое fstab? Проблема Debian

Как подключить сетевой диск Windows в Linux