BackUp/DayOfDayBackUp: различия между версиями
Нет описания правки |
мНет описания правки |
||
(не показано 11 промежуточных версий 6 участников) | |||
Строка 1: | Строка 1: | ||
[[ | [[Категория:Admin]] | ||
__TOC__ | |||
== Ежедневное инкрементальное архивирование файлов и каталогов == | |||
'''Цель:''' Создать систему архивирования файлов на отдельный жесткий диск. | : '''Цель:''' Создать систему архивирования файлов на отдельный жесткий диск. | ||
'''Дано:''' Диск находится в том же системном блоке, что и весь сервер, но не используется | : '''Дано:''' Диск находится в том же системном блоке, что и весь сервер, но не используется постоянно… Круглосуточно он отмонтирован, и монтируется только при создании архива. | ||
Круглосуточно он отмонтирован, и монтируется только при создании архива. | : '''Примечания:''' Файлы, удаляемые из основных каталогов, размещаются в отдельных подкаталогах, из которых их можно восстанавливать. | ||
'''Примечания:''' Файлы, удаляемые из основных каталогов, размещаются в отдельных подкаталогах, из которых их можно восстанавливать. | |||
В ходе продолжительных поисков в Интернете | === Скрипт === | ||
Каждый фрагмент скрипта | В ходе продолжительных поисков в Интернете было надёргано различных фрагментов, которые, в результате, сложились в представленный далее скрипт. Каждый фрагмент скрипта хорошо прокоментирован, поэтому приводится тут целиком: | ||
< | <source lang="bash"> | ||
#!/bin/sh | |||
# Скрипт для | # Скрипт для инкрементального архивирования rsync backups | ||
# Этот скрипт распространяется под лицензией GPL | # Этот скрипт распространяется под лицензией GPL | ||
# Я использую дополнительный диск, который монтирую при архивировании | # Я использую дополнительный диск, который монтирую при архивировании | ||
Строка 124: | Строка 122: | ||
do_accounting() | do_accounting() | ||
{ | { | ||
echo "##Использование файловых систем ##">>/tmp/rsync_script_tmpfile | echo "## Использование файловых систем ##">>/tmp/rsync_script_tmpfile | ||
df -kH >> /tmp/rsync_script_tmpfile | df -kH >> /tmp/rsync_script_tmpfile | ||
echo >> /tmp/rsync_script_tmpfile | echo >> /tmp/rsync_script_tmpfile | ||
Строка 133: | Строка 131: | ||
cat $EXCLUDES >> /tmp/rsync_script_tmpfile | cat $EXCLUDES >> /tmp/rsync_script_tmpfile | ||
echo >> /tmp/rsync_script_tmpfile | echo >> /tmp/rsync_script_tmpfile | ||
echo "##Удаляется устаревшая копия ##">>/tmp/rsync_script_tmpfile | echo "## Удаляется устаревшая копия ##">>/tmp/rsync_script_tmpfile | ||
echo $ARCHIVEROOT/$CLEAREDDIR >> /tmp/rsync_script_tmpfile | echo $ARCHIVEROOT/$CLEAREDDIR >> /tmp/rsync_script_tmpfile | ||
echo >> /tmp/rsync_script_tmpfile | echo >> /tmp/rsync_script_tmpfile | ||
echo "##Размеры резервных копий ##">>/tmp/rsync_script_tmpfile | echo "## Размеры резервных копий ##">>/tmp/rsync_script_tmpfile | ||
du -sxh $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile | du -sxh $ARCHIVEROOT/* >> /tmp/rsync_script_tmpfile | ||
echo >> /tmp/rsync_script_tmpfile | echo >> /tmp/rsync_script_tmpfile | ||
Строка 162: | Строка 160: | ||
else | else | ||
echo "cant find $EXCLUDES"; exit | echo "cant find $EXCLUDES"; exit | ||
fi</ | fi | ||
Осталось привести примеры файлов, в которых находятся собственно списки, что архивировать, и что пропускать при этом | </source> | ||
=== Настройки === | |||
Осталось привести примеры файлов, в которых находятся собственно списки, что архивировать, и что пропускать при этом … | |||
Архивируем: | Архивируем: | ||
: {{cmd|# cat /etc/backup.lst}} | |||
/home | <pre>/home | ||
/etc | /etc | ||
/var/lib/bind | /var/lib/bind | ||
Строка 172: | Строка 173: | ||
/usr/local/blockit</pre> | /usr/local/blockit</pre> | ||
И пропускаем при этом: | И пропускаем при этом: | ||
# cat /etc/backup-exclude.lst | : {{cmd|# cat /etc/backup-exclude.lst}} | ||
<pre>*.mp3 | <pre>*.mp3 | ||
*.MP3 | *.MP3 | ||
Строка 189: | Строка 190: | ||
*.WMV | *.WMV | ||
~* | ~* | ||
/home/ | /home/trash/*</pre> | ||
Вот, собственно, и | Вот, собственно, и всё… | ||
Может быть кто-нибудь сочтет этот скрипт достойным | Может быть кто-нибудь сочтет этот скрипт достойным исправления… | ||
Все это | Все это приветствуется… | ||
P.S. | P.S. | ||
К сожалению, я забыл, кто был автором исходного скрипта и не могу выразить ему личную благодарность, но все таки ... :) | К сожалению, я забыл, кто был автором исходного скрипта и не могу выразить ему личную благодарность, но все таки ... :) | ||
=== Другие системы === | |||
* [http://packages.debian.org/ru/sid/mrb Manage incremental data snapshots with make/rsync] | |||
[[Категория:Backup]] | |||
{{Category navigation|title=Резервное копирование|category=Backup|sortkey={{SUBPAGENAME}}}} |
Текущая версия от 16:21, 30 марта 2022
Ежедневное инкрементальное архивирование файлов и каталогов
- Цель: Создать систему архивирования файлов на отдельный жесткий диск.
- Дано: Диск находится в том же системном блоке, что и весь сервер, но не используется постоянно… Круглосуточно он отмонтирован, и монтируется только при создании архива.
- Примечания: Файлы, удаляемые из основных каталогов, размещаются в отдельных подкаталогах, из которых их можно восстанавливать.
Скрипт
В ходе продолжительных поисков в Интернете было надёргано различных фрагментов, которые, в результате, сложились в представленный далее скрипт. Каждый фрагмент скрипта хорошо прокоментирован, поэтому приводится тут целиком:
#!/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. К сожалению, я забыл, кто был автором исходного скрипта и не могу выразить ему личную благодарность, но все таки ... :)