opennet / FSBackup

File system backup and synchronization utility
http://www.opennet.ru/dev/fsbackup/
GNU General Public License v2.0
28 stars 19 forks source link
FSBACKUP - file system backup and synchronization utility.

 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY WARRANTIES *

For english documentation type 'perldoc fsbackip.pl'


FSBACKUP - система инкрементального резервного копирования и синхронизации ФС. http://www.opennet.ru/dev/fsbackup/

По всем вопросам обращайтесь к автору: Maxim Chirkov mc@tyumen.ru


СОДЕРЖАНИЕ: Назначение. Комплект поставки. Выполняемые функции. Установка. Файл конфигурации. Восстановление данных. Виды бэкапа. Типы хранилища для архива бэкапа. Шифрование бэкапа. Благодарности.


Назначение:

Система fsbackup была создана для обеспечения резервного копирования серверов 

разного масштаба на специально отведенном сервере бэкапа.

Достоинствами метода резервного копирования на специально отведенном сервере,

с использованием fsbackup, является:


Комплект поставки:

create_backup.sh
    Скрипт для периодического запуска всей подсистемы резервного
    копирования из crontab.

install.pl
    Скрипт для установки программы и всех недостающих Perl модулей.

fsbackup.pl
        Основной скрипт для бэкапа и синхронизации.

cfg_example
        Пример файла конфигурации и документация по всем конфигурационным 
    директивам. 

cache/
    Образ директории для помещения временных хэшей. 

sys_backup/
    Образ директории для помещения бэкапов созданных sysbackup.sh. 

modules/
    Perl модули которые требуются для функционирования fsbackup.pl.

scripts/
    Директория со вспомогательными скриптами.

scripts/mysql_backup.sh
scripts/pgsql_backup.sh
    Скрипты для создания полного и частичного бэкапа базы данных 
    хранимой в PostgreSQL или MySQL. 
    Поддерживаются режимы работы:
    1. полный бэкап всех баз и структур;
    2. полный бэкап структур всех баз + бэкап данных в избранных базах/таблицах;
    3. полный бэкап структур всех баз + бэкап данных во всех базах, 
       кроме избранных баз/таблиц;

scripts/sysbackup.sh
    Скрипт для сохранения списка всех установленных в системе пакетов 
    для FreeBSD и Linux, для Linux использующих rpm - сохранение файлов 
    конфигурации всех установленных в системе пакетов.

scripts/sysrestore.sh
    Скрипт для автоматической установки всех пакетов, список которых 
    был сохранен скриптом sysbackup.sh, в свеже-установленной системе.

scripts/fsrestore.sh
    Скрипт для восстановления данных из инкрементального бэкапа.

Выполняемые функции:

- 2 метода вычисления контрольных сумм: 
timesize - по атрибутам (дата, время, размер, права доступа...)
md5 - по содержимому файла.

- 4 вида бэкапа:
backup - инкрементальный бэкап в архив (т.е. копируются только 
     изменившиеся с момента последнего бэкапа файлы).
full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются 
     все файлы).
sync - синхронизация дерева.
hash - только генерация хэша, без помещения файлов в архив (может
    использоваться для определения какие файлы были изменены)

- 3 типа хранилища бэкапа:
    local      - хранение бэкапа в локальной файловой системе.
remote_ssh - копирование бэкапа на удаленную машину с использованием SSH
remote_ftp - копирование бэкапа на удаленную машину по FTP.

- 8 встроенных операторов (можно использовать regex) для описания 
  помещаемых в бэкап (или игнорируемых для помещения в бэкап) файлов:
        /dir[/file] - путь к файлу/директории для бэкапа.
    !/dir[/file] - отрицание пути, не помещать в бэкап (не маска, а реальный путь).
    # - комментарий
    =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
    f~ - маска для файла. Первый или второй символ.
    d~ - маска для директории. Первый или второй символ.
    =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
    f! - "НЕ" маска для файла. Первый или второй символ.
    d! - "НЕ" маска для директории. Первый или второй символ.
    Ограничен по времени создания и размеру

- Возможность шифрования бэкапа с помощью PGP.

- Гибкое задание уровня инкрементальности. Например, при = 7 - 6 раз 
  будут помещаться только изменения, на 7 раз бэкап будет объединен в 
  один файл.

- Скрипт для сохранения списка всех установленных в системе пакетов 
  для FreeBSD и Linux.

-  Скрипты для создания полного и частичного бэкапа базы данных 
   хранимой в PostgreSQL или MySQL. Поддерживаются режимы работы:
     - полный бэкап всех баз и структур;
     - полный бэкап структур всех баз + бэкап данных в избранных базах;
     - полный бэкап структур всех баз + бэкап данных во всех базах, 
     кроме избранных баз;

Установка:

Для установки достаточно запустить скрипт ./install.pl
Программа автоматически скопируется в заданный директивой --prefix каталог,
по умолчанию установка производится в каталог /usr/local/fsbackup.

После установки достаточно переименовать и отредактировать файл конфигурации
cfg_example, следуя приведенным внутри cfg_example инструкциям. 
Затем, отредактируйте скрипт запуска "create_backup.sh", при необходимости
измените путь к хранилищу бэкапа и название список используемых файлов 
конфигурации.
Активируйте периодический запуск подсистема бэкапа в crontab:
18 4 * * * /usr/local/fsbackup/create_backup.sh| mail -s"`uname -n` backup report" root
При использовании бэкапа SQL сервера или системы отредактируйте скрипты
в директории ./scripts (mysql_backup.sh, pgsql_backup.sh, sysbackup.sh).

Например:
>su
# ./install.pl 
# cd /usr/local/fsbackup
# vi cfg_example
# mv cfg_example server_backup.conf
# vi create_backup.sh
# crontab -e
# cd scripts
# vi sysbackup.sh
# vi pgsql_backup.sh
# exit
>

Файл конфигурации:

Подробное описание всех параметров файла конфигурации смотрите в файле cfg_example.

Внимание, при описании директорий для бэкапа нельзя указывать путь к символической ссылке, только полный путь к реальной директории. Например, если указано /home, а это символическая ссылка на /usr/home, то в бэкап будет помещены данные о символической ссылке, а не содержание директории.

Рекомендуется, описать бэкап разных участков файловой системы в нескольких файлах конфигурации. Например, мной используется следующие несколько файлов конфигурации: server_etc.conf - описывает создание бэкапа директории /etc и секретных данных с использованием PGP шифрования; server_local.conf - бэкап /usr/local, за исключением временных файлов, бэкап БД. server_home.conf - бэкап директорий пользователей (/home или /usr/home)

Внимание, директории для сохранения бэкапа в каждом конфигурационном файле должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и той же директории нескольких, описанных разными .conf файлами, бэкапов не допустимо.


Восстановление данных:

Полная резервная копия может быть восстановлена в короткий промежуток времени без использования дополнительных, входящих в комплект fsbackup утилит. Например, если архив бэкапа сохранен в директории /mnt/full_backup, для полного восстановления достаточно набрать:

cd /

# tar xzf /mnt/full_backup/full_backup.tar.gz
# sh /mnt/full_backup/full_backup.dir

Для полного восстановления данных из инкрементального бэкапа может использоваться скрипт scripts/fsrestore.sh, для восстановления просто отредактируйте пути внутри скрипта и запустите его.

В случае частичного бэкапа файловой системы, без бэкапа файлов операционный системы, восстановить исходный набор установленных в момент бэкапа пакетов (должен быть разрешен запуск scripts/sysbackup.sh в create_backup.sh) поможет скрипт scripts/sysrestore.sh. После установки ОС, скрипт автоматически установит недостающие пакеты для FreeBSD и Linux.

При бэкапе данных с SQL сервера PostgreSQL или Mysql, восстановление производится командами: psql -d template1 -f sqlbackupfile или mysql < sqlbackupfile.

Таким образом можно привести типовой процесс полного восстановления системы:

Назначение файлов при инкрементальном бэкапе (для не инкрементального - формат "имя.ext"): имя-время-том.tar.gz архив - бэкапа (имя_бэкапа-YYYY.MM.DD.HH.MM.SS-номер_тома.tar.gz). имя-время.del список удаленных с момента предыдущего бэкапа файлов имя-время.hash хэш таблица с контрольными суммами. имя-время.list список файлов в архиве. имя-время.dir команды для восстановления прав доступа и пустых директорий.


Виды бэкапа:

Вид бэкапа в файле конфигурации определяется параметром $cfg_backup_style: backup - инкрементальный бэкап в архив. Копируются только изменившиеся с момента последнего бэкапа файлы, уровень инкрементальности задается параметром $cfg_increment_level, параметр определяет через какого числа итераций файлы с инкрементальными копиями будут объединены в один файл. Например, при $cfg_increment_level = 7 - 6 раз будут помещаться только изменения, на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз, без объединения. Достоинства - возможность отследить изменения (и восстановить данные) на любой момент со времени первой итерации, в архив копируются только измененные и новые данные, что значительно экономит трафик и место на диске. Подходит для ежедневного бэкапа динамично меняющейся или критичной к потере информации.

full_backup - полный бэкап в архив, без хэша. В бэкап всегда помещаются
     все файлы отмеченные в файле конфигурации для резервного 
     копирования). На сервере где сохраняется бэкап рекомендуется
     проводить вторичное резервирование, например, в crontab раз
     в неделю дублировать бэкап в другую директорию. Недостатки - 
     огромный трафик для копирования бэкапа по сети и высокие 
     требования к объему хранилища бэкапа. Достоинство - экономия
     процессорных ресурсов и памяти на создание и поддерживание хэша.
     Прекрасно подходит для бэкапа маломощных машин с ограниченными 
     ресурсами или при статичности резервируемых данных (например, 
     бэкап выносных рутеров раз в месяц).

sync     - синхронизация дерева (только для типа хранилища ssh или local).
     Почти то же, что и full_backup или backup (в зависимости от задания 
     ключа -c при запуске fsbackup.pl), за исключением того, что копия 
     не хранится в архиве, а область файловой системы отмеченная для 
     бэкапа полностью воссоздается в заданной директории на бэкап сервере.
     Предназначено для параллельного хранения (синхронизации дерева)
     исходных текстов, содержимого web-сервера, синхронизации проектов
     с рабочей машины разработчика на сервер и т.д.

hash    - только генерация хэша, без помещения файлов в архив (опция -h).
          Может применяться для пометки помещения файлов в бэкап, без 
      физического их перемещения, для отслеживания изменений в файловой
      системе для обнаружения подмены файлов злоумышленниками и т.д.

Скрипт fsbackup.pl, поддерживает ряд ключей задаваемых в командной строке: fsbackup.pl [-n|-f|-h|-c] файл_конфигурации -n - создаем новый архив независимо от состояния хэша. -f - full_backup - полный бэкап в архив, без хэша. -h - hash - только генерация хэша, без помещения файлов в архив. -c - clean - очистка хранилища с инкрементальным бэкапом и создание нового бэкапа.


Типы хранилища для архива бэкапа:

Определение типа хранилища для бэкапа определяется в файле конфигурации переменной $cfg_type. Поддерживается 3 типа хранилищ: local, remote_ssh и remote_ftp.

- local - сохранение бэкапа в локальной файловой системе.
Конфигурация:
$cfg_type="local";
$cfg_local_path="/var/backup"; # Путь к хранилищу.

- remote_ssh - сохранение бэкапа на удаленном компьютере, данные передаются
через шифрованное соединение организованное с использованием SSH.
На системе с которой производится бэкап должен быть установлен ssh клиент,
на удаленном - ssh сервер. Метод remote_ssh является наиболее защищенным,
но и достаточно ресурсоемким. Предварительно необходимо настроить доступ
бэкап клиента на сервер с использованием шифрованных ключей, без ввода 
пароля. Это делается следующим образом:

Примем: локальная машина -  машина с которой будет производиться бэкап и 
на которой будем запускать скрипт fsbackup.pl. Удаленная машина - машина
на которую будут копироваться файлы с бэкапом.
Запускаем на локальной машине программу ssh-keygen, на все задаваемые 
вопросы принимаем значения по умолчанию (поле passphrase оставляем 
пустым). Далее, запускаем программу ssh-copy-id user@remotehost, где 
user - пользователь удаленной машины remotehost - адрес удаленной машины,
( или вручную, на удаленной машине в директории ~/.ssh, создаем файл 
authorized_keys, куда копируем содержимое файла identity.pub с локальной 
машины). Для увеличения безопасности в файл ~/.ssh/authorized_keys на 
удаленной машине добавляем перед ключом (разделив пробелом) строку
from="localhost", где localhost - адрес локальной машины 
(from="localhost" 1024 23 1343.....).

Конфигурация:

$cfg_type="remote_ssh";
$cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап.
$cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап.
$cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.

- remote_ftp - сохранение бэкапа на удаленном компьютере, данные передаются
по протоколу ftp, на удаленном хосте должен быть запущен ftp сервер.
Так как пароль хранится в файле конфигурации в открытом виде, желательно
ограничить доступ к хосту к удаленному хосту через tcpwrapper или firewall,
а так же ограничить вход пользователя, под которым будет храниться бэкап,
только через chroot ftp. Положительными сторонами копирования по ftp, 
является высокая производительность закачки и небольшая нагрузка на CPU.

Конфигурация:

$cfg_type="remote_ftp";
$cfg_remote_host="server.remote.ru"; # Сервер на который будет копироваться бэкап.
$cfg_remote_password="Test1234"; # пароль для входа по ftp.
$cfg_remote_login="backup_login"; # Логин под которым будет сохранятся бэкап.
$cfg_remote_path="/home/backup_login/backup"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
$cfg_remote_ftp_mode=0; # Active (0) или Passive (1) соединение.

Шифрование бэкапа:

Для шифрования бэкапа в системе должна быть установлена программа PGP шифрования GnuPG: http://www.gnupg.org (рекомендуется) или PGP: http://www.pgpi.org

Далее: Локальная машина - машина на которой производится резервное копирование. Удаленная машина - машина куда сохраняется архив бэкапа.

Рекомендации по работе с PGP программами для создания шифрованного бэкапа (для pgp2.6, pgp5.0, gnupg):

Для создания публичного и секретного ключей наберите (на удаленной машине): pgp2.6> pgp -kg pgp5.0> pgpk -g gnupg> gpg --gen-key # если генерация ключа занимает слишком много времени воспользуйтесь ключом gpg --quick-random

Экспортируйте созданный публичный ключ в файл (на удаленной машине): pgp2.6> pgp -akx <файл куда будет записан ключ> pgp5.0> pgpk -ax <файл куда будет записан ключ> gnupg> gpg --export -a > <файл куда будет записан ключ>

Затем, добавте созданный публичный ключ (на локальной машине): pgp2.6>pgp -ka <файл с ключом с удаленной машины> pgp5.0>pgpk -a <файл с ключом с удаленной машины> gnupg>gpg --import <файл куда будет записан ключ>

Для pgupg необходимо заверить ключ (gpg --gen-key на локльной машине не забудте):

gnupg>gpg --sign-key <имя ключа>

Для расшифровки необходимо запустить (на удаленной машине): pgp2.6>cat encrypted.tar.gz | pgp -f -z'пароль' > расшифрованный.tar.gz pgp5.0>cat encrypted.tar.gz | pgpv -f -z'пароль' > расшифрованный.tar.gz gnupg>cat encrypted.tar.gz | gpg --decrypt > расшифрованный.tar.gz

Для шифрования используется (на локальной машине): pgp2.6>cat input| pgp -ef userid > output pgp5.0>cat input| pgpe -f userid > output gnupg>cat input| gpg -e -r userid > output


Благодарности: Alex Sokoloff. sokoloff@mail.ru

Oleg S. Gints oleg@cec.amur.elektra.ru:

Носков Илья phantom@highway.ru, Сергей Баукин teq@highway.ru:

Aleksey Kuznetsov ahk@spb.edu

Pavel Stoliarov admin@tzto.infopac.ru

Alexandr Zhukov sacha@ic.vrn.ru

Zherdev Anatoly tolyar@mx.ru

Priamikov Alexei apriam@info.novsu.ac.ru

Valeriy Zavolodko vals@pa.ktts.kharkov.ua

Руслан Стельмаченко xak2000@gmail.com