Blame | Last modification | View Log | RSS feed
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, является:
- высокая производительность (скорость передачи по 100Мбит сети намного
выше скорости записи на ленточный накопитель), низкая себестоимость
(цена Мб на современных жестких IDE дисках достаточно низкая);
- надежность (возможность параллельного хранения нескольких резервных
копий за разные моменты времени);
- безопасность (применение PGP шифрования резервных копий перед записью на
бэкап сервер);
- автономность (один раз настроив систему бэкап будет производится
автоматически, не нужно обслуживать стриммер),
- возможность сохранения только измененных с последнего бэкапа данных, без
затрат на копирования не изменившейся информации.
- простота настройки и установки (как правило система способна
функционировать сразу после запуска инсталляционного скрипта)
- простота восстановления (открытый формат для хранения резервных копий
(tar), позволяет восстановить данные без использования входящих в
комплект утилит восстановления).
- гибкость задания масок для помещения файлов и каталогов в архив.
- поддержка бэкапа баз данных хранимых в MySQL и PostgreSQL.
fsbackup может выполнять создание как полного образа сервера, так и резервных
копий основных подсистем, исключая операционную систему. В случае полного бэкапа,
полное восстановление работоспособности происходит в течении нескольких десятков
минут, в случае частичного бэкапа для восстановления требуется несколько часов.
В отличие от многих систем автоматического резервного копирования, в fsbackup
применяется гибкая система построения масок (с использованием regex) для
принятия решения о помещении файлов в бэкап.
---------------------------------------------------------------------------
Комплект поставки:
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"`name -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.
Таким образом можно привести типовой процесс полного восстановления системы:
- базовая установка ОС (без дополнительных пакетов)
- монтирование диска с бэкапом.
- редактирование путей и запуск scripts/sysrestore.sh для установки нужных
пакетов.
- редактирование путей и запуск scripts/fsrestore.sh
- запуск SQL сервера и восстановление баз.
Назначение файлов при инкрементальном бэкапе (для не инкрементального - формат
"имя.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"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
---------------------------------------------------------------------------
Шифрование бэкапа:
Для шифрования бэкапа в системе должна быть установлена программа 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 <UserID> <файл куда будет записан ключ>
pgp5.0> pgpk -ax <UserID> <файл куда будет записан ключ>
gnupg> gpg --export -a <UserID> > <файл куда будет записан ключ>
Затем, добавте созданный публичный ключ (на локальной машине):
pgp2.6>pgp -ka <файл с ключом с удаленной машины>
pgp5.0>pgpk -a <файл с ключом с удаленной машины>
gnupg>gpg --import <файл куда будет записан ключ>
# Для pgupg необходимо заверить ключ:
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>
- Предложение о введении уровней говорливости (verbose mode).
- Изменить запуск программы (ввести проверку на длину
письма), вынести ее в файл fsbackup.cron.
- Написал небольшой скрипт fsfind.pl для поиска файла в архивах он
просматривает файлы list в директории с архивами. Может кому-то
будет полезен. Работает с локальными архивами.
- скрипт для бэкапа Interbase баз.
Oleg S. Gints <oleg@cec.amur.elektra.ru>:
- Предложение по введению дополнительного резервирования при
использовании инкрементального бэкапа.
- Обнаружение ошибки в mysql_backup.sh (для варианта полного архива
пропущен ключ --all-databases)
- Сообщение о неправильном определении уровня инкрементальности для
локального бэкапа.
- Замечание об отсутствии лидирующих нулей в новом формате именования
файлов в бэкапе.
Носков Илья <phantom@highway.ru>, Сергей Баукин <teq@highway.ru>:
- Идея разбивки слишком больших файлов на несколько частей,
предложения и патчи по создания архивов занимающих несколько Гб.
Aleksey Kuznetsov <ahk@spb.edu>
- Сообщение о пропуске ключа --all-databases в mysql_backup.sh
Pavel Stoliarov <admin@tzto.infopac.ru>
- Исправление ошибки приводящей к некорректной работе при локальном
бэкапе.
- Предложение по сохранению старых бэкапов после инкремента.
Alexandr Zhukov <sacha@ic.vrn.ru>
- Замечание по неправильной работе правила для исключения
директории из бэкапа.
Zherdev Anatoly <tolyar@mx.ru>
- Патч и идея введения директивы $cfg_stopdir_prune, для отключения
рекурсивного просмотра директорий, запрещаемых для помещения в бэкап.
Priamikov Alexei <apriam@info.novsu.ac.ru>
- Обнаружение ошибки в fsrestore.sh