BackUp/DayOfDayBackUp
Ежедневное инкрементальное архивирование файлов и каталогов
- Цель: Создать систему архивирования файлов на отдельный жесткий диск.
- Дано: Диск находится в том же системном блоке, что и весь сервер, но не используется постоянно… Круглосуточно он отмонтирован, и монтируется только при создании архива.
- Примечания: Файлы, удаляемые из основных каталогов, размещаются в отдельных подкаталогах, из которых их можно восстанавливать.
Скрипт
В ходе продолжительных поисков в Интернете было надёргано различных фрагментов, которые, в результате, сложились в представленный далее скрипт. Каждый фрагмент скрипта хорошо прокоментирован, поэтому приводится тут целиком:
#!/bin/sh
# Скрипт для инкрементального архивирования rsync backups
# Этот скрипт распространяется под лицензией GPL
# Я использую дополнительный диск, который монтирую при архивировании
# системы, и в случае необходимости, восстановления файлов.
# В другое время диск отключен.
# Примечания: В Linux и FreeBSD команда date работает по разному
# Настройки переменных скрипта
# Почтовый адрес получателя отчета
MAILADDR=your_address@firma.com.ua
# HOSTNAME
# - Используется в поле "Subj"
HOSTNAME=Linux-Server
# Список каталогов для копирования
# - Это файл со списком каталогов
# по одному на строку.
# Не ставье "/" в конце строки
# Для добавления нового каталога в архив
# просто добавьте новую строку в файл
# и запустите скрипт
BACKUPLIST=/etc/backup.lst
# Файл, содержащий одну маску пропускаемых файлов на строку
# - Смотрите MAN-страницу для примеров
EXCLUDES=/etc/backup-exclude.lst
# корневой каталог для резервных копий
ARCHIVEROOT=/backup
# Начиная с этого места не рискуйте
# изменять скрипт, если вы не знаете
# точно как он работает и что вы хотите
# Каталог, в котором хранится текущая копия файлов
CURRENT=main
# Каталоги, в которых хранятся инкрементарные изменения относительно основного архива
INCREMENTDIR=Deleted-`date +%Y-%m-%d`
# Каталог, который удаляется за ненедобностью. Старше чем 30 дней.
CLEAREDDIR=Deleted-`date -d "-30 day" +%Y-%m-%d`
# Опции, которые передаются rsync
OPTIONS="--force \
--ignore-errors \
--delete \
--delete-excluded \
--exclude-from=$EXCLUDES \
--backup \
--backup-dir=$ARCHIVEROOT/$INCREMENTDIR \
-aqRS"
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin
export LANG=ru_RU.KOI8-R
# Убедимся, что диск смонтирован и
# необходимые каталоги существуют.
if [ `grep backup /etc/mtab | wc -l` = 1 ]; then
install -d $ARCHIVEROOT/$CURRENT
else
mount /backup && install -d $ARCHIVEROOT/$CURRENT
fi
do_mount()
{
if [ -d $ARCHIVEROOT/$CURRENT ]; then
echo "Диск был смонтирован..."
else
mount /backup
fi
}
# Отмонтируем диск, потому как он нам пока не нужен ...
do_umount()
{
if [ -d $ARCHIVEROOT/$CURRENT ]; then
umount /backup
else
echo "Диск не был смонтирован... А мы куда сохранялись?"
fi
}
# Вот это настоящая функция архивирования
do_rsync()
{
cat ${BACKUPLIST} | while read BACKUPDIR; do
rsync $OPTIONS $BACKUPDIR $ARCHIVEROOT/$CURRENT
done
}
# Очистим каталог от старых резервных копий...
# Удаляем каталоги вида Deleted-`date +%Y-%m-%d`
# древностью более 30 дней.
do_clear()
{
if [ -d $ARCHIVEROOT/$CLEAREDDIR ]; then
rm -rf $ARCHIVEROOT/$CLEAREDDIR
else
echo "Такого каталога не было в архиве. Нечего удалять..."
fi
}
# Формирование отчета о работе скрипта
do_accounting()
{
echo "## Использование файловых систем ##">>/tmp/rsync_script_tmpfile
df -kH >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "## Список сохраняемых каталогов ##">>/tmp/rsync_script_tmpfile
cat $BACKUPLIST >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "## Игнорируются ##">>/tmp/rsync_script_tmpfile
cat $EXCLUDES >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "## Удаляется устаревшая копия ##">>/tmp/rsync_script_tmpfile
echo $ARCHIVEROOT/$CLEAREDDIR >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "## Размеры резервных копий ##">>/tmp/rsync_script_tmpfile
du -sxh $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "## Размеры домашних каталогов пользователей ##">>/tmp/rsync_script_tmpfile
du -sxh $ARCHIVEROOT/$CURRENT/home/* >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "## Создание резервных копий выполнено. ##">>/tmp/rsync_script_tmpfile
}
# Проверим на мелкие ошибки и начнем...
# Вот тут все и происходит. Монтируем, копируем, создаем отчет и отмонтируем диск
if [ -f $EXCLUDES ]; then
if [ -d $BACKUPDIR ]; then
echo "Отчет о резервном копировании на $HOSTNAME " > /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
echo "Копирование начато в `date +%H:%M:%S`, `date +%A`, `date +%d` `date +%B` `date +%Y` :" >> /tmp/rsync_script_tmpfile
echo >> /tmp/rsync_script_tmpfile
do_mount && do_rsync && do_clear && do_accounting && do_umount
echo "Копирование завершено в `date +%H:%M:%S`" >> /tmp/rsync_script_tmpfile
Mail $MAILADDR -s "$HOSTNAME backup report of `date +%d-%m-%y`" < /tmp/rsync_script_tmpfile
rm -f /tmp/rsync_script_tmpfile
else
echo "cant find $BACKUPDIR"; exit
fi
else
echo "cant find $EXCLUDES"; exit
fi
Настройки
Осталось привести примеры файлов, в которых находятся собственно списки, что архивировать, и что пропускать при этом … Архивируем:
- # cat /etc/backup.lst
/home /etc /var/lib/bind /usr/local/bin /usr/local/blockit
И пропускаем при этом:
- # cat /etc/backup-exclude.lst
*.mp3 *.MP3 *.Mp3 *.avi *.AVI *.Avi *.mdf *.tmp *.TMP *.ASF *.asf *.MPG *.mpg *.wmv *.WMV ~* /home/trash/*
Вот, собственно, и всё…
Может быть кто-нибудь сочтет этот скрипт достойным исправления… Все это приветствуется…
P.S. К сожалению, я забыл, кто был автором исходного скрипта и не могу выразить ему личную благодарность, но все таки ... :)