BackUp/DayOfDayBackUp

Материал из ALT Linux Wiki
Версия от 18:55, 28 июля 2008; PhpCoder (обсуждение | вклад) (Import from freesource.info)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Freesource-logo.png Blue Glass Arrow.svg MediaWiki logo.png
Эта страница была перемещена с freesource.info.
Эта страница наверняка требует чистки и улучшения — смело правьте разметку и ссылки.
Просьба по окончанию убрать этот шаблон со страницы.


Ежедневное инкрементарное архивирование файлов и каталогов

Цель: Создать систему архивирования файлов на отдельный жесткий диск. Дано: Диск находится в том же системном блоке, что и весь сервер, но не используется постоянно ... Круглосуточно он отмонтирован, и монтируется только при создании архива. Примечания: Файлы, удаляемые из основных каталогов, размещаются в отдельных подкаталогах, из которых их можно восстанавливать.

В ходе продолжительных поисков в Интернете надёргал различных фрагментов, которые, в результате, сложились в такой вот скрипт. Каждый фрагмент скрипта я кратко откоментировал, поэтому тут привожу его целиком:

#!/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

И пропускаем при этом:

  1. cat /etc/backup-exclude.lst
*.mp3
*.MP3
*.Mp3
*.avi
*.AVI
*.Avi
*.mdf
*.tmp
*.TMP
*.ASF
*.asf
*.MPG
*.mpg
*.wmv
*.WMV
~*
/home/pomoyka/*

Вот, собственно, и всё....

Может быть кто-нибудь сочтет этот скрипт достойным исправления ... Все это приветствуется ...

P.S. К сожалению, я забыл, кто был автором исходного скрипта и не могу выразить ему личную благодарность, но все таки ... :)