File system backup and synchronization utility
Switch branches/tags
Nothing to show
Clone or download
xorader Fix old bug with parameter in the pgsql_backup.sh. Add the 'pg_dumpal…
…l -s' execution then empty in the pgsql_backup.sh.
Latest commit 38b1714 Nov 16, 2017
Permalink
Failed to load latest commit information.
contrib
modules
rpms
scripts
CHANGES
COPYING
FAQ
README
TODO
VERSION
cfg_example
cfg_example_sql
cfg_example_users
create_backup.sh
fsbackup.pl
fsbackup_eng_guide.txt
install.pl

README

 	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"`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.

Таким образом можно привести типовой процесс полного восстановления системы:
    - базовая установка ОС (без дополнительных пакетов)
    - монтирование диска с бэкапом.
    - редактирование путей и запуск 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"; # Директория куда должны помещаться файлы бэкапа, директория должна присутствовать.
	$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 <UserID> <файл куда будет записан ключ>
pgp5.0> pgpk -ax <UserID> <файл куда будет записан ключ>
gnupg> gpg --export -a <UserID> > <файл куда будет записан ключ>

Затем, добавте созданный публичный ключ (на локальной машине):
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>
	- Предложение о введении уровней говорливости (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

Valeriy Zavolodko <vals@pa.ktts.kharkov.ua>
	- Сообщение о недоработке при установке $cfg_root_path отличных от "/".

Руслан Стельмаченко <xak2000@gmail.com>
	- Исправление досадной ошибки в скрипте бэкапа MySQL таблиц.