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/pomoyka/*
Вот, собственно, и всё....
Может быть кто-нибудь сочтет этот скрипт достойным исправления ... Все это приветствуется ...
P.S. К сожалению, я забыл, кто был автором исходного скрипта и не могу выразить ему личную благодарность, но все таки ... :)