/fsbackup/origin/sun_backup.conf |
---|
0,0 → 1,114 |
$cfg_backup_name = "sun_int_26th_net"; |
$cfg_cache_dir = "/home/root/fsbackup/cache"; |
$prog_md5sum = "/sbin/md5"; |
$prog_tar = "/usr/bin/tar"; |
$prog_ssh = "/usr/bin/ssh"; |
$prog_rm = "/bin/rm"; |
$prog_gzip = "/usr/bin/gzip"; |
$prog_pgp = ""; |
$cfg_checksum = "timesize"; |
$cfg_backup_style = "backup"; |
$cfg_increment_level = 100; |
$cfg_save_old_backup = 1; |
$cfg_type = "local"; |
$cfg_local_path = "/opt/backups/sun/sys"; |
$cfg_time_limit = 0; |
$cfg_size_limit = 0; |
$cfg_maximum_archive_size = 102400; |
$cfg_root_path = "/"; |
# $cfg_pgp_userid = "backup"; |
$cfg_verbose = 2; |
$cfg_stopdir_prune=0; |
1; |
#------------------- |
# List of backuped path and regexp mask. |
# /dir[/file] - backup file or directory. |
# !/dir[/file] - NOT include this file or directory to backup. |
# # - ignore this line. |
# Mask: |
# =~ - regexp mask for include file or directory to backup. |
# f~ - regexp file mask for include file to backup. |
# d~ - regexp directory mask for include directory to backup. |
# =! - regexp mask for NOT include file or directory to backup. |
# f! - regexp file mask for NOT include file to backup. |
# d! - regexp directory mask for NOT include directory to backup. |
# |
# Operation priority: |
# |
# 1. =! |
# 2. f! |
# 3. f~ |
# 4. d! |
# 5. =~ |
# 6. d~ |
# 7. ! |
# 8. path |
# |
__DATA__ |
/root/backup/temp/mnt |
!/root/backup/temp/mnt/tmp |
!/root/backup/temp/mnt/dev |
!/root/backup/temp/mnt/entropy |
!/root/backup/temp/mnt/mnt |
!/root/backup/temp/mnt/proc |
!/root/backup/temp/mnt/tmp |
d!/root/backup/temp/mnt/.*/\.snap |
d!/root/backup/temp/mnt/.*/\.svn |
!/root/backup/temp/mnt/var/tmp |
!/root/backup/temp/mnt/var/run |
!/root/backup/temp/mnt/var/lock |
!/root/backup/temp/mnt/var/log |
!/root/backup/temp/mnt/var/named/var/log |
!/root/backup/temp/mnt/var/spool/squid |
!/root/backup/temp/mnt/usr/compat/linux/proc |
!/root/backup/temp/mnt/usr/src |
!/root/backup/temp/mnt/usr/obj |
!/root/backup/temp/mnt/usr/ports |
d!/root/backup/temp/mnt/home/[^/]*/\.recycle |
!/root/backup/temp/mnt/var/db/entropy |
!/root/backup/temp/mnt/etc/ntp.drift |
!/root/backup/temp/mnt/var/db/portaudit/auditfile.tbz |
!/root/backup/temp/mnt/home/root/svn/repos |
# httpd logs and temp files |
!/root/backup/temp/mnt/usr/local/jakarta-tomcat5.0/work |
!/root/backup/temp/mnt/usr/local/jakarta-tomcat5.0/logs |
d!/root/backup/temp/mnt/home/www/[^/]*/logs |
# postgres databases |
!/root/backup/temp/mnt/var/db/pgsql/data/base |
!/root/backup/temp/mnt/var/db/pgsql/data/global |
!/root/backup/temp/mnt/var/db/pgsql/data/pg_clog |
!/root/backup/temp/mnt/var/db/pgsql/data/pg_xlog |
# backup temp files |
!/root/backup/temp/mnt/root/backup/backup.log |
!/root/backup/temp/mnt/root/backup/svn/backup.log |
!/root/backup/temp/mnt/backup_snapshot |
!/root/backup/temp/mnt/home/backup_snapshot |
!/root/backup/temp/mnt/usr/backup_snapshot |
!/root/backup/temp/mnt/var/backup_snapshot |
!/root/backup/temp/mnt/home/root/fsbackup |
# saturn temp files |
!/root/backup/temp/mnt/home/saturn |
#!/root/backup/temp/mnt/home/saturn/root/tmp |
#!/root/backup/temp/mnt/home/saturn/root/var/log |
#!/root/backup/temp/mnt/home/saturn/root/var/run |
#!/root/backup/temp/mnt/home/saturn/root/var/lock |
#!/root/backup/temp/mnt/home/saturn/root/var/cache |
#!/root/backup/temp/mnt/home/saturn/root/root/.freevo/vfs/mnt |
#!/root/backup/temp/mnt/home/saturn/root/root/log |
#!/root/backup/temp/mnt/home/saturn/root/root/.xine/catalog.cache |
/fsbackup/origin/create_backup.sh |
---|
0,0 → 1,70 |
#!/bin/sh |
# Backup planner running from crontab. |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
# |
#18 4 * * * /root/backup/fsbackup/create_backup.sh| mail -s"`name -n` backup report" root |
#-------------------------------------- |
# Path where fsbackup installed. |
#-------------------------------------- |
backup_path="/root/backup/fsbackup" |
#-------------------------------------- |
# List of fsbackup configuration files, delimited by spaces. |
# Directories for saving backup in each configuration file should differ |
# ($cfg_remote_path, $cfg_local_path). |
#-------------------------------------- |
config_files="sun_backup.conf" |
#-------------------------------------- |
# 1 - run mysql_backup.sh script (you need edit mysql_backup.sh first!), 0 - not run. |
#-------------------------------------- |
backup_mysql=0 |
#-------------------------------------- |
# 1 - run pgsql_backup.sh script (you need edit pgsql_backup.sh first!), 0 - not run. |
#-------------------------------------- |
backup_pgsql=0 |
#-------------------------------------- |
# 1 - run sysbackup.sh script (you need edit sysbackup.sh first!), 0 - not run. |
#-------------------------------------- |
backup_sys=0 |
############################################################################# |
cd $backup_path |
#ulimit -f 512000;ulimit -d 20000;ulimit -c 100;ulimit -m 25000;ulimit -l 15000 |
if [ $backup_mysql -eq 1 ]; then |
./scripts/mysql_backup.sh |
fi |
if [ $backup_pgsql -eq 1 ]; then |
./scripts/pgsql_backup.sh |
fi |
if [ $backup_sys -eq 1 ]; then |
./scripts/sysbackup.sh |
fi |
for cur_conf in $config_files; do |
nice -19 ./fsbackup.pl ./$cur_conf |
next_iter=`echo "$config_files"| grep "$cur_conf "` |
if [ -n "$next_iter" ]; then |
sleep 600 |
fi |
done |
/fsbackup/origin/VERSION |
---|
0,0 → 1,0 |
1.2 |
/fsbackup/origin/FAQ |
---|
0,0 → 1,134 |
FAQ - ОТВЕТЫ НА ЧАСТО-ЗАДАВАЕМЫЕ ВОПРОСЫ |
------------------------------------------------------------------------------- |
Как увеличить быстродействие и снизить нагрузку на процессор при шифровании |
бэкапа ? |
При использовании шифрования через gpg, рекомендуется установить значение |
$prog_gzip="" (т.е. отключить сжатие архива), так как gpg перед шифрованием |
самостоятельно сжимает данные. Использование gzip приведет к двойному |
сжатию и лишней нагрузке на CPU. |
------------------------------------------------------------------------------- |
Возникло опасение, что при большом количестве файлов fsbackup съест все ОЗУ. |
Ничего подобного, одним из достоинств fsbackup является очень экономные |
требования к памяти, за счет использования для хранения хэшей библиотеки |
DBM. По умолчанию, используется не более 4 Мб ОЗУ. |
------------------------------------------------------------------------------- |
Как увеличить быстродействие и оптимизировать распределение памяти для |
бэкапа ? |
По умолчанию в памяти находится только 4 Мб индексов, остальное сбрасывается |
на диск. Быстродействие создания бэкапа можно _на_порядок_ увеличить, за |
счет увеличения размер кэша для размещения хэш таблицы в памяти. |
Для этого в fsbackup.pl нужно изменить значения константы: |
use constant DB_DEF_CACHE_SIZE => размер_кэша_в_байтах; |
Чем больше DB_DEF_CACHE_SIZE - тем лучше. |
------------------------------------------------------------------------------- |
Собрался сменить fsbackup 1.0 на 1.1 (1.2). Не будет ли проблем с существующей |
конфигурацией, при переходе на новую версию ? |
Можно смело оставить старые файлы конфигурации, заменив только скрипты. |
При желании активировать новинки, появившиеся в 1.1 (1.2), загляните в CHANGES |
и добавте новые переменные в старые конфиги. |
------------------------------------------------------------------------------- |
Зачем было создавать свою систему бэкапа SQL таблиц, кога есть pg_dump и |
mysqldump ? |
Ни тот ни другой не умеют бэкапить все базы, с пропуском нескольких. |
Например, бэкап всех баз на MySQL сервере, кроме ненужной гигобайтовой базы |
словоформ для поисковика. fsbackup же опирается на три кита: полный бэкап |
всех баз, бэкап только указанных в backup_db_list баз данных и бэкап всех |
баз, кроме указанных в backup_db_list. Начиная с версии 1.2 fsbackup умеет |
производить бэкап (или исключать из бэкапа) не только отдельные базы, но |
и таблицы. |
------------------------------------------------------------------------------- |
Как наиболее грамотно организовать бэкап сервера и большим объемом данных ? |
Рекомендуется, описать бэкап разных участков файловой системы в нескольких |
файлах конфигурации. |
Например, создать следующие конфигурации: |
server_etc.conf - описывает создание бэкапа директории /etc и секретных |
данных с использованием PGP шифрования; |
server_local.conf - бэкап /usr/local, за исключением временных файлов. |
server_sql.conf - бэкап БД. |
server_home.conf - бэкап директорий пользователей (/home или /usr/home) |
server_soft.conf - бэкап архива программ (без сжатия) |
Внимание, директории для сохранения бэкапа в каждом конфигурационном файле |
должны отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и |
той же директории нескольких, описанных разными .conf файлами, бэкапов не |
допустимо. |
------------------------------------------------------------------------------- |
Почему при указании переменной $cfg_maximum_archive_size=100, несжатые |
тома архива оказываются размером немного больше или меньше 100 Кб ? |
Переменная $cfg_maximum_archive_size учитывает реальный размер данных |
в файлах плюс примерный размер атрибутов файла или директории. При этом |
том завершается когда значение счетчика байт больше указанного в |
конфигурации значения. Например, если последним добавляется файл размером 70Кб |
и размер уже скомпанованного тома равен 90 Кб, то будет создан архивный |
файл размером 90 Кб, а файл размером 70 Кб. будет помещен в следующий том. |
Т.е. система старается создавать архивные тома размером чуть меньше, чем |
размер указанный в файле конфигурации, за исключением случая наличия файла |
размер которого больше лимита накладываемого на размер тома, в этом случае |
файл целиком помещается в архивный том, несмотря на его большой размер. |
Предотвратить создание архивных томов не помещающихся на накопитель, |
используемый для резервирования, можно определив максимально возможный |
размер файла для помещения в архив ($cfg_size_limit). |
------------------------------------------------------------------------------- |
Как мне не архивировать файлы из таких - то каталогов, причем сами каталоги |
должны быть. Например, почтовые каталоги qmail, задаю маску: =!Maildir/cur/* |
в результате не создает в архиве каталогов cur в профилях пользователя. |
Достаточно указать: |
f!.*/Maildir/new/.* |
тогда все файлы внутри /Maildir/new/ не будут помещены в архив, а директория |
будет добавлена в .dir файл и при восстановлении будет воссоздана. В tar архив |
пустые директории не помещаются, только в .dir список. |
------------------------------------------------------------------------------- |
Почему fsbackup не делает backup каталогов, если в них нет файлов ? |
Пустые каталоги просто не отражены в tar архиве (ровно как и права доступа |
на все каталоги). Для хранения полного списка каталогов и прав доступа к ним, |
используется .dir файл, выполненный в виде обычного shell сценария. При |
восстановлении данных из backup, необходимо не только раскрыть .tar архив, но |
и выполнить .dir сценарий. |
------------------------------------------------------------------------------- |
Что можите порекомендовать для бэкапа нескольких серверов ? |
- Выделить старую машину с большим диском под backup-сервер. |
- Вынести backup-сервер с тех. площадки, рекомендуется в другое здание |
(например в удаленный офис), на случай пожара, грабежа и других |
форс-мажорных обстоятельств. Или периодически скидывать бэкапы с |
backup-сервера на переносной носитель (лента, CDROM и т.д.) и уносить |
домой. |
- Рекомендую производить бэкап по FTP, при грамотной организации, не менее |
безопасно, чем по SSH (при использовании PGP шифрования бэкапа и |
предотвращении возможности сниффинга), а главное более быстрый и |
менее ресурсоемкий способ. |
- На каждом из серверов, с которых будет производится бэкап, разграничить |
области файловой системы в зависимости от важности и объема данных. |
Каждую область описать в отдельном файле конфигурации (см. вопросы выше). |
Для самых важных данных (например, файлы паролей, секретная информация |
представляющая коммерческую тайну и т.д.), используйте PGP шифрование. |
Для текстовых данных большого объема и не требующих частого поднятия из |
бэкапа - используйте gzip сжатие. Если потребность в доступе к данным |
в бэкапе велика, можно ограничиться обычным tar архивом без сжатия. |
- Настроить ftp-сервер с доступом только c хостов с которых производится |
бэкап (например, через /etc/hosts.allow) и закрытым для внешнего мира. |
В конфигурации ftp сервера запретите выход за пределы домашней |
директории (/etc/ftpchroot). Дополнительно, через crontab, пропишите |
еженедельное дублирование резервной копии на бэкап-сервере на |
соседний диск (резервирование бэкапа). |
/fsbackup/origin/scripts/fs_mercury_restore.sh |
---|
0,0 → 1,57 |
#!/bin/sh |
# Script for restore files backuped by fsbackup.pl |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
#------------------- |
# Name of backup, single word. |
#------------------- |
backup_name="mercury_26th_net" |
#------------------- |
# Directory with content of incremental backup. |
#------------------- |
backup_path="/home/root/fsbackup/restore_mercury/sys" |
#------------------- |
# Directory to save restored data. |
#------------------- |
restore_path="/opt/backups/mercury/restore" |
########################################################################### |
old_path=`pwd` |
cd $backup_path |
for cur_arc in `ls *.tar* | sort -n`; do |
del_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.del" |
dir_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.dir" |
if [ -e "$del_file" ]; then |
echo "Removing deleted files for $cur_arc..." |
cd $restore_path |
sh $backup_path/$del_file |
cd $backup_path |
fi |
echo "Restoring $cur_arc..." |
gzip_type=`ls $cur_arc|grep '.gz'` |
#if [ -n "$gzip_type" ]; then |
# tar -xzf $cur_arc -C $restore_path |
#else |
# tar -xf $cur_arc -C $restore_path |
#fi |
if [ -e "$dir_file" ]; then |
echo "Fixing directory permissions for $cur_arc..." |
cd $restore_path |
sh $backup_path/$dir_file |
cd $backup_path |
fi |
done |
cd $old_path |
/fsbackup/origin/scripts/sysrestore.sh |
---|
0,0 → 1,68 |
#!/bin/sh |
# Script for reinstall packages stored by sysbackup.sh |
# Скрипт для восстановления пакетов с программами. |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
#------------------- |
# Name of backup, single word. |
# Имя бэкапа. |
#------------------- |
backup_name="sun_int_26th_net" |
#------------------- |
# Directory with installed packets list, stored by sysbackup.sh. |
# Директория где расположен сохраненный скриптом sysbackup.sh список пакетов. |
#------------------- |
sysbackup_path="/root/backup/fsbackup/sys_backup" |
#------------------- |
# Directory where stored OS packages. |
# Директория где располдожены файлы с пакетами программ. |
# Для FreeBSD, если переменная не заполнена, пакеты будут установленны с сайта |
# производителя. |
#------------------- |
packages_path="/usr/local/INST/RPMS" |
############################################################################ |
sysname="`uname | tr '[A-Z]' '[a-z]'`" |
echo "OS: $sysname" |
if [ "_$sysname" = "_linux" ]; then |
for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list`; do |
echo "Installing $cur_pkg from local server..." |
rpm -i --nodeps $packages_path/$cur_pkg.*.rpm |
done |
fi |
if [ "_$sysname" = "_freebsd" ]; then |
if [ -z "$packages_path" ]; then |
for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list |sed 's/^\(.*\)\-[0987654321.]*.*$/\1/'|sort|uniq`; do |
echo "Installing $cur_pkg from remote server..." |
pkg_add -r $cur_pkg |
done |
else |
export PKG_PATH=$packages_path |
for cur_pkg in `cat $sysbackup_path/${backup_name}-pgk.list`; do |
echo "Installing $cur_pkg from local path $packages_path..." |
if -f $cur_pkg; then |
pkg_add $cur_pkg |
else |
echo "Package $cur_pkg not found, tying to install by mask..." |
cur_pkg= `echo $cur_pkg| sed 's/^\(.*\)\-[0987654321.]*.*$/\1/'` |
pkg_add ${cur_pkg}-*.tgz |
fi |
done |
fi |
fi |
/fsbackup/origin/scripts/sysbackup.sh |
---|
0,0 → 1,89 |
#!/bin/sh |
# Script for store system configuration files and information about installed |
# packages. |
# Скрипт для сохранения списк всех файлов в системе, списка установленных пакетов |
# и файлов конфигурации. |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
#------------------- |
# Name of backup, single word. |
# Имя бэкапа. |
#------------------- |
backup_name="sun_int_26th_net" |
#------------------- |
# Directory to store system backup. |
# Корневая директория куда будут помещены данные системного бэкапа. |
#------------------- |
sysbackup_path="/root/backup/fsbackup/sys_backup" |
############################################################################ |
sysname="`uname | tr '[A-Z]' '[a-z]'`" |
echo "OS: $sysname" |
# echo "Creating ls-lR..." |
# ls -lR / |gzip > $sysbackup_path/${backup_name}-ls-lR.gz |
if [ "_$sysname" = "_linux" ]; then |
echo "Creating system config archive..." |
rm -f $sysbackup_path/${backup_name}-rpm_conf.tar |
for cur_conf in `rpm -q -a -c`; do |
tar -rf $sysbackup_path/${backup_name}-rpm_conf.tar $cur_conf 2>/dev/null |
done |
echo "Creating package list..." |
gzip -f $sysbackup_path/${backup_name}-rpm_conf.tar |
rpm -q -a > $sysbackup_path/${backup_name}-rpm.list |
fi |
if [ "_$sysname" = "_freebsd" ]; then |
echo "Creating package list and install.cfg for sysinstall..." |
cp -f /etc/rc.conf $sysbackup_path/${backup_name}-rc.conf |
. /etc/rc.conf |
interface=`echo "$network_interfaces"| awk '{print $1}'`; |
eval ifconfig=\$ifconfig_$interface |
ipaddr=`echo "$ifconfig"| sed 's/^.*inet \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'` |
netmask=`echo "$ifconfig"| sed 's/^.*netmask \([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*$/\1/'` |
domain_name=`cat /etc/resolv.conf| grep -E "search|domain"| awk '{print $2}'|head -n1` |
nameserver=`cat /etc/resolv.conf| grep 'nameserver'| awk '{print $2}'|head -n1` |
cat<<ENDL>$sysbackup_path/${backup_name}-install.cfg |
# Full example: /usr/src/release/sysinstall/install.cfg |
debug=yes |
hostname=$hostname |
domainname=$domain_name |
nameserver=$nameserver |
defaultrouter=$defaultrouter |
ipaddr=$ipaddr |
netmask=$netmask |
# ftp=ftp://time.cdrom.com/pub |
netDev=$interface |
mediaSetFTP |
# dists=bin doc manpages info compat21 des src sbase ssys |
dists=all |
distSetCustom |
# File System |
## Current /etc/fstab |
`cat /etc/fstab|sed 's/^/## /'` |
## Exmpale |
# disk=ad0 |
# partition=exclusive |
# diskPartitionEditor |
# bootManager=booteasy |
# diskPartitionEditor |
# ad0s1-1=ufs 40960 / |
# ad0s1-2=swap 40960 none |
# ad0s1-3=ufs 0 /usr 1 |
# diskLabelEditor |
# installCommit |
ENDL |
ls -tr /var/db/pkg| tee $sysbackup_path/${backup_name}-pgk.list | perl -ne 'print "package=${_}packageAdd\n"'>> $sysbackup_path/${backup_name}-install.cfg |
fi |
/fsbackup/origin/scripts/mysql_backup.sh |
---|
0,0 → 1,178 |
#!/bin/sh |
# Script for backup SQL tables from MySQL |
# Скрипт для бэкапа данных хранимых в Mysql. |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
# |
# For restore data type: |
# Восстановление производится с помощью команды: mysql < backupfile |
# |
#------------------- |
# Name of backup, single word. |
# Имя бэкапа. |
#------------------- |
backup_name="sun_int_26th_net" |
#------------------- |
# Backup method: |
# full - backup full DB's structure and data. |
# db - backup full DB's structure and data only for 'backup_db_list' databases. |
# notdb- backup full DB's structure and data for all DB's, except |
# data of 'backup_db_list' databases. |
# |
# Метод бэкапа: |
# full - полный бэкап всех баз (рекомендуется), |
# аналог запуска pg_dumpall или mysqldump --all-databases --all |
# |
# db - бэкап только указанных в backup_db_list баз данных, записи по |
# реконструкции баз и таблиц записываются для всех баз на SQL сервере. |
# notdb - бэкап всех баз, кроме указанных в backup_db_list, записи по |
# реконструкции баз и таблиц записываются для всех баз на SQL сервере. |
# Возможно исключение из бэкапа выборочных таблиц, тогда формат |
# списка исключаемых таблиц задается в виде: |
# "trash_db1 trash_db2:table1 trash_db2:table2" |
# - производим бэкап всех баз, коме базы trash_db1 и таблиц table1 и |
# table2 базы trash_db2. |
# |
#------------------- |
backup_method="notdb" |
#------------------- |
# List of databases (delimited by spaces) |
# Список включаемых или исключаемых из бэкапа баз, через пробел. |
# Таблицы указываются в виде: имя_базы:имя_таблицы |
#------------------- |
backup_db_list="aspseek trash:cache_table1 trash:cache_table2 mnogosearch" |
#------------------- |
# Auth information for MySQL. |
# Имя пользователя и пароль для соединения с Mysql, для PostgreSQL скрипт |
# должен запускаться из-под пользователя с правами полного доступа к базам PostgreSQL. |
#------------------- |
backup_mysqluser="" |
backup_mysqlpassword="" |
#------------------- |
# Directory to store SQL backup. You must have enought free disk space to store |
# all data from you SQL server. |
# Директория куда будет помещен бэкап данных с SQL сервера. |
# Внимание !!! Должно быть достаточно свободного места для бэкапа всех |
# выбранных БД. |
#------------------- |
backup_path="/root/backup/fsbackup/sys_backup" |
#------------------- |
# Full path of mysql programs. |
# Путь к программам mysql |
#------------------- |
backup_progdump_path="/usr/local/bin" |
#------------------- |
# Extra flags for mysqldump program. |
# -c (--complete-insert) - Use complete insert statements. |
# Дополнительные параметры для pg_dump |
# -c - формировать бэкап данных в виде INSERT комманд, с указанием названий |
# столбцов. Если скорость восстановления из бэкапа и размер бэкапа |
# более важны, и совместимостью с другими СУБД можно пренебречь, |
# используйте: extra_mysqldump_flag="" |
#------------------- |
extra_mysqldump_flag="--complete-insert" |
############################################################################ |
if [ -n "$backup_progdump_path" ]; then |
backup_progdump_path="$backup_progdump_path/" |
fi |
#------------------------------------------------------------------------- |
# Полный бэкап для Mysql |
if [ "_$backup_method" = "_full" ]; then |
echo "Creating full backup of all MySQL databases." |
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql |
${backup_progdump_path}mysqldump --all-databases --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz |
exit |
fi |
#------------------------------------------------------------------------- |
# Бэкап указанных баз для Mysql |
if [ "_$backup_method" = "_db" ]; then |
echo "Creating full backup of $backup_db_list MySQL databases." |
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql |
cat /dev/null > $backup_path/$backup_name-mysql |
for cur_db in $backup_db_list; do |
echo "Dumping $cur_db..." |
cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print \$1, \$2}else{print \$1}}'` |
${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql |
done |
gzip -f $backup_path/$backup_name-mysql |
exit |
fi |
#------------------------------------------------------------------------- |
# Бэкап всех баз кроме указанных для Mysql |
if [ "_$backup_method" = "_notdb" ]; then |
echo "Creating full backup of all MySQL databases except databases $backup_db_list." |
${backup_progdump_path}mysqldump --all --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql |
cat /dev/null > $backup_path/$backup_name-mysql |
for cur_db in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser| tr -d ' |'|grep -v -E '^Databases$|^\+\-\-\-'`; do |
grep_flag=`echo " $backup_db_list"| grep " $cur_db:"` |
if [ -n "$grep_flag" ]; then |
# Исключение таблиц для данной базы |
for cur_db_table in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db| tr -d ' |'|grep -v -E '^Tables$|^Database\:|^\+\-\-\-'`; do |
flag=1 |
for cur_ignore in $backup_db_list; do |
if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then |
flag=0 |
fi |
done |
if [ $flag -gt 0 ]; then |
echo "Dumping $cur_db:$cur_db_table..." |
${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db $cur_db_table >> $backup_path/$backup_name-mysql |
else |
echo "Skiping $cur_db:$cur_db_table..." |
fi |
done |
else |
# Исключение базы |
flag=1 |
for cur_ignore in $backup_db_list; do |
if [ "_$cur_ignore" = "_$cur_db" ]; then |
flag=0 |
fi |
done |
if [ $flag -gt 0 ]; then |
echo "Dumping $cur_db..." |
${backup_progdump_path}mysqldump --all --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql |
else |
echo "Skiping $cur_db..." |
fi |
fi |
done |
gzip -f $backup_path/$backup_name-mysql |
exit |
fi |
echo "Configuration error. Not valid parameters in backup_method or backup_sqltype." |
/fsbackup/origin/scripts/pgsql_backup.sh |
---|
0,0 → 1,179 |
#!/bin/sh |
# Script for backup SQL tables from PostreSQL |
# Скрипт для бэкапа данных хранимых в PostgreSQL |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
# |
# For restore data type: |
# Восстановление производится с помощью команды: psql -d template1 -f backupfile |
# |
#------------------- |
# Name of backup, single word. |
# Имя бэкапа. |
#------------------- |
backup_name="sun_int_26th_net" |
#------------------- |
# Backup method: |
# full - backup full DB's structure and data. |
# db - backup full DB's structure and data only for 'backup_db_list' databases. |
# notdb- backup full DB's structure and data for all DB's, except |
# data of 'backup_db_list' databases. |
# |
# Метод бэкапа: |
# full - полный бэкап всех баз (рекомендуется), |
# аналог запуска pg_dumpall или mysqldump --all-databases --all |
# |
# db - бэкап только указанных в backup_db_list баз данных, записи по |
# реконструкции баз и таблиц записываются для всех баз на SQL сервере. |
# notdb - бэкап всех баз, кроме указанных в backup_db_list, записи по |
# реконструкции баз и таблиц записываются для всех баз на SQL сервере. |
# Возможно исключение из бэкапа выборочных таблиц, тогда формат |
# списка исключаемых таблиц задается в виде: |
# "trash_db1 trash_db2:table1 trash_db2:table2" |
# - производим бэкап всех баз, коме базы trash_db1 и таблиц table1 и |
# table2 базы trash_db2. |
# |
# |
#------------------- |
backup_method="notdb" |
#------------------- |
# List of databases (delimited by spaces) |
# Список включаемых или исключаемых из бэкапа баз, через пробел. |
# Таблицы указываются в виде: имя_базы:имя_таблицы |
#------------------- |
backup_db_list="aspseek trash:cache_table1 trash:cache_table2 mnogosearch" |
#------------------- |
# Auth information for MySQL. |
# Имя пользователя и пароль для соединения с Mysql, для PostgreSQL скрипт |
# должен запускаться из-под пользователя с правами полного доступа к базам PostgreSQL. |
#------------------- |
backup_mysqluser="" |
backup_mysqlpassword="" |
#------------------- |
# Directory to store SQL backup. You must have enought free disk space to store |
# all data from you SQL server. |
# Директория куда будет помещен бэкап данных с SQL сервера. |
# Внимание !!! Должно быть достаточно свободного места для бэкапа всех |
# выбранных БД. |
#------------------- |
backup_path="/root/backup/fsbackup/sys_backup" |
#------------------- |
# Full path of postgresql programs. |
# Путь к программам postgresql |
#------------------- |
backup_progdump_path="/usr/local/bin" |
#------------------- |
# Extra flags for pg_dump program. |
# -D - Dump data as INSERT commands with explicit column names |
# Дополнительные параметры для pg_dump |
# -D - формировать бэкап данных в виде INSERT комманд, с указанием названий |
# столбцов. Если скорость восстановления из бэкапа и размер бэкапа |
# более важны, и совместимостью с другими СУБД можно пренебречь, |
# используйте: extra_pg_dump_flag="" |
#------------------- |
extra_pg_dump_flag="-D" |
############################################################################ |
if [ -n "$backup_progdump_path" ]; then |
backup_progdump_path="$backup_progdump_path/" |
fi |
#------------------------------------------------------------------------- |
# Полный бэкап для Postgresql |
if [ "_$backup_method" = "_full" ]; then |
echo "Creating full backup of all PostgreSQL databases." |
${backup_progdump_path}pg_dumpall -s > $backup_path/$backup_name-struct-pgsql |
${backup_progdump_path}pg_dumpall $extra_pg_dump_flag|gzip > $backup_path/$backup_name-pgsql.gz |
exit |
fi |
#------------------------------------------------------------------------- |
# Бэкап указанных баз для Postgresql |
if [ "_$backup_method" = "_db" ]; then |
echo "Creating full backup of $backup_db_list PostgreSQL databases." |
${backup_progdump_path}pg_dumpall -s > $backup_path/$backup_name-struct-pgsql |
cat /dev/null > $backup_path/$backup_name-pgsql |
for cur_db in $backup_db_list; do |
echo "Dumping $cur_db..." |
cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print "-t", \$2, \$1}else{print \$1}}'` |
${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql |
done |
gzip -f $backup_path/$backup_name-pgsql |
exit |
fi |
#------------------------------------------------------------------------- |
# Бэкап всех баз кроме указанных для Postgresql |
if [ "_$backup_method" = "_notdb" ]; then |
echo "Creating full backup of all PostgreSQL databases except databases $backup_db_list." |
${backup_progdump_path}pg_dumpall -s > $backup_path/$backup_name-struct-pgsql |
cat /dev/null > $backup_path/$backup_name-pgsql |
for cur_db in `${backup_progdump_path}psql -A -q -t -c "select datname from pg_database" template1 | grep -v '^template1$' `; do |
grep_flag=`echo " $backup_db_list"| grep " $cur_db:"` |
if [ -n "$grep_flag" ]; then |
# Исключение таблиц для данной базы |
for cur_db_table in `echo '\d'| ${backup_progdump_path}psql -A -q -t $cur_db |cut -d'|' -f1`; do |
flag=1 |
for cur_ignore in $backup_db_list; do |
if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then |
flag=0 |
fi |
done |
if [ $flag -gt 0 ]; then |
echo "Dumping $cur_db:$cur_db_table..." |
${backup_progdump_path}pg_dump $extra_pg_dump_flag -t $cur_db_table $cur_db >> $backup_path/$backup_name-pgsql |
else |
echo "Skiping $cur_db:$cur_db_table..." |
fi |
done |
else |
# Исключение базы |
flag=1 |
for cur_ignore in $backup_db_list; do |
if [ "_$cur_ignore" = "_$cur_db" ]; then |
flag=0 |
fi |
done |
if [ $flag -gt 0 ]; then |
echo "Dumping $cur_db..." |
${backup_progdump_path}pg_dump $extra_pg_dump_flag $cur_db >> $backup_path/$backup_name-pgsql |
else |
echo "Skiping $cur_db..." |
fi |
fi |
done |
gzip -f $backup_path/$backup_name-pgsql |
exit |
fi |
echo "Configuration error. Not valid parameters in backup_method or backup_sqltype." |
/fsbackup/origin/scripts/fsrestore.sh |
---|
0,0 → 1,63 |
#!/bin/sh |
# Script for restore files backuped by fsbackup.pl |
# Восстановление данных из инкрементального бэкапа. |
# Внимание, данные предварительно должны быть расшифрованы в случае использования PGP |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
#------------------- |
# Name of backup, single word. |
# Имя бэкапа. |
#------------------- |
backup_name="sun_int_26th_net" |
#------------------- |
# Directory with content of incremental backup. |
# Директория где находится бэкап. |
#------------------- |
backup_path="/mnt/backup" |
#------------------- |
# Directory to save restored data. |
# Корневая директория куда будут помещены данные восстановленные из бэкапа. |
#------------------- |
restore_path="/var/backup" |
########################################################################### |
old_path=`pwd` |
cd $backup_path |
for cur_arc in `ls *.tar* | sort -n`; do |
del_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.del" |
dir_file="`echo \"$cur_arc\"| sed 's/\-0.tar\(.gz\)*$//'`.dir" |
if [ -e "$del_file" ]; then |
echo "Removing deleted files for $cur_arc..." |
cd $restore_path |
sh $backup_path/$del_file |
cd $backup_path |
fi |
echo "Restoring $cur_arc..." |
gzip_type=`ls $cur_arc|grep '.gz'` |
if [ -n "$gzip_type" ]; then |
tar -xzf $cur_arc -C $restore_path |
else |
tar -xf $cur_arc -C $restore_path |
fi |
if [ -e "$dir_file" ]; then |
echo "Fixing directory permissions for $cur_arc..." |
cd $restore_path |
sh $backup_path/$dir_file |
cd $backup_path |
fi |
done |
cd $old_path |
/fsbackup/origin/fsbackup.pl |
---|
0,0 → 1,721 |
#!/usr/bin/perl |
# fsbackup - file system backup and synchronization utility. |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001-2002 by Maxim Chirkov. <mc@tyumen.ru> |
# |
# Ключи: |
# -n - создаем новый архив независимо от состояния хэша. |
# -f - full_backup - полный бэкап в архив, без хэша. |
# -h - hash - только генерация хэша, без помещения файлов в архив. |
# -c - clean - очиска хранилища с инкрементальным бэкапом и создание нового бэкапа. |
############################################# |
use constant DB_DEF_CACHE_SIZE => 40960000; # Размер кэша для размежения хэша в памяти |
use POSIX; |
use File::Find; |
use Digest::MD5 qw(md5_base64); |
use DB_File; |
use constant VERB_SILENT => 0; # Silent mode, suspend all output. |
use constant VERB_ERROR => 1; # Output all errors and warnings. |
use constant VERB_ALL => 2; # Output all the available data. |
my $list_lines_cnt = 0; |
my $del_lines_cnt = 0; |
my $cur_time = time(); |
my %active_hash_last; |
my %active_hash_new; |
my $cfg_new_flag = 0; |
my $cfg_clean_flag = 0; |
my $config = 0; |
my $cur_backup_size = 1536; # Размер блока tar |
my $backup_file_base; |
my $prog_gzip_filter; |
my $arc_ext; |
my $cur_increment_level; |
my $cur_dir; |
my $cur_path; |
my $cur_file; |
my $cur_pathitem; |
my $file_fullpath; |
my $file_fullpath_md5; |
my $key; |
my $dbobj_new; |
my $dbobj_last; |
my $db_hashinfo; |
my $db_hashinfo2; |
my $file; |
my @volume_position=(0); |
my @fs_path=(); # /dir[/file] - путь к файлу/директории для бэкапа. |
my @fs_notpath=(); # ! - отрицание пути, не помещать в бэкап. Всегда должен быть первым символом. |
my @fs_mask=(); # =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ. |
my @fs_filemask=(); # f~ - маска для файла. Первый или второй символ. |
my @fs_dirmask=(); # d~ - маска для директории. Первый или второй символ. |
my @fs_notmask=(); # =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ. |
my @fs_notfilemask=(); # f! - "НЕ" маска для файла. Первый или второй символ. |
my @fs_notdirmask=(); # d! - "НЕ" маска для директории. Первый или второй символ. |
# ------------- Обработка параметров командной строки |
if ($ARGV[0] eq "-n" || $ARGV[0] eq "-h" || $ARGV[0] eq "-f" || $ARGV[0] eq "-c"){ |
$cfg_new_flag=1; |
$config = $ARGV[1]; |
} else { |
$cfg_new_flag=0; |
$config = $ARGV[0]; |
} |
if ( ! -f $config){ |
die "Usage: fsbackup.pl [-n|-f|-h|-c] config_name\n"; |
} |
require "$config"; |
if ( ! -d $cfg_cache_dir){ |
die "\$cfg_cache_dir ($cfg_cache_dir) not found. Set \$cfg_cache_dir varisble in fsbackup.pl\n"; |
} |
$cfg_time_limit *= 60 * 60 * 24; # Дни в секунды. |
$cfg_size_limit *= 1024; # Килобайты в байты. |
$cfg_maximum_archive_size *= 1024; # Килобайты в байты. |
chdir($cfg_root_path); |
if ($ARGV[0] eq "-h"){ |
$cfg_backup_style = "hash"; |
} |
if ($ARGV[0] eq "-f" ){ |
$cfg_backup_style = "full_backup"; |
} |
if ($ARGV[0] eq "-c" ){ |
$cfg_clean_flag=1; |
} else { |
$cfg_clean_flag=0; |
} |
#------------------- Проверяем переменные в файле конфигурации. |
if ($cfg_backup_name !~ /^[\w\d\_]+$/){ |
die "Found illegal characters in $cfg_backup_name ($cfg_backup_name)."; |
} |
if (! grep {$_ eq $cfg_checksum} ("md5", "timesize")){ |
die "Unknown checksum method:\$cfg_checksum=$cfg_checksum (allowed md5 or timesize)\n"; |
} |
if (! grep {$_ eq $cfg_backup_style} ("backup", "full_backup", "sync", "hash")){ |
die "Unknown backup_style:\$cfg_backup_style=$cfg_backup_style\n"; |
} |
if ($cfg_backup_style eq "full_backup" || $cfg_backup_style eq "hash"){ |
$cfg_new_flag=1; |
$cfg_clean_flag=1; |
} |
die "Can't find \$cfg_local_path ($cfg_local_path)"; |
if ($cfg_backup_style eq "backup"){ |
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($cur_time); |
$backup_file_base = sprintf ("%s-%4.4d.%2.2d.%2.2d.%2.2d.%2.2d.%2.2d", |
$cfg_backup_name,$year+1900,$mon+1,$mday,$hour,$min,$sec); |
}else{ |
$backup_file_base="$cfg_backup_name"; |
} |
print "Creating local $cfg_backup_style: $cfg_backup_name\n" if ($cfg_verbose == &VERB_ALL); |
if ($prog_gzip ne ""){ |
$prog_gzip_filter="| $prog_gzip"; |
$arc_ext=".gz"; |
} else { |
$prog_gzip_filter=""; |
$arc_ext=""; |
} |
if (! -d "$cfg_cache_dir/$cfg_backup_name"){ |
mkdir("$cfg_cache_dir/$cfg_backup_name", 0700); |
} |
#----------- Вычисляем уровень инкрементальности. |
if ($cfg_increment_level != 0 && $cfg_backup_style eq "backup"){ |
$cur_increment_level=0; |
opendir( DIR, "$cfg_local_path"); |
while ($cur_dir = readdir DIR){ |
if ($cur_dir =~ /\-0\.tar${arc_ext}$/){ |
$cur_increment_level++; |
} |
} |
closedir (DIR); |
if ($cur_increment_level >= $cfg_increment_level){ |
$cfg_new_flag=1; |
$cfg_clean_flag=1; |
} |
print "Current increment number: $cur_increment_level\n" if ($cfg_verbose == &VERB_ALL); |
} |
################################################ |
#----------- Считываем хэш в память. |
if ( (-f "$cfg_cache_dir/$cfg_backup_name/.hash" ) && $cfg_new_flag == 0){ |
# Считываем текущий хеш в память. |
rename ("$cfg_cache_dir/$cfg_backup_name/.hash", "$cfg_cache_dir/$cfg_backup_name/.hash.last"); |
$db_hashinfo = new DB_File::HASHINFO ; |
$db_hashinfo->{'cachesize'} = DB_DEF_CACHE_SIZE; |
if (! ($dbobj_last = tie(%active_hash_last, "DB_File", "$cfg_cache_dir/$cfg_backup_name/.hash.last", O_RDWR|O_CREAT, 0644, $db_hashinfo ))) |
{ |
print "WARNING: Error in hash, creating full backup.\n" if ($cfg_verbose >= &VERB_ERROR); |
unlink "$cfg_cache_dir/$cfg_backup_name/.hash.last"; |
$dbobj_last = tie(%active_hash_last, "DB_File", "$cfg_cache_dir/$cfg_backup_name/.hash.last", O_RDWR|O_CREAT, 0644, $db_hashinfo )||print "Can't create or open DB File!"; |
} |
#Создаем новый хеш. |
unlink("$cfg_cache_dir/$cfg_backup_name/.hash"); |
$db_hashinfo2 = new DB_File::HASHINFO ; |
$db_hashinfo2->{'cachesize'} = 100000; |
$dbobj_new = tie(%active_hash_new, "DB_File", "$cfg_cache_dir/$cfg_backup_name/.hash", O_RDWR|O_CREAT, 0644, $db_hashinfo2) || print "Can't create or open DB File!\n"; |
# Создаем список файлов для помещения в архив. |
open (LIST, ">$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list")|| print "Can't create list file ($cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list).\n"; |
flock (LIST, 2); |
# Создаем список директорий в архиве. |
open (DIRS, ">$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir")|| print "Can't create list file ($cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir).\n"; |
flock (DIRS, 2); |
# Считываем список подлежащих бэкапу директорий в память. |
while(<DATA>){ |
chomp; |
$cur_path = $_; |
if ($cur_path =~ /^\!(.*)$/){ # ! |
push @fs_notpath, $1; |
} elsif ($cur_path =~ /^\=\~(.*)$/){ # =~ |
push @fs_mask, $1; |
} elsif ($cur_path =~ /^f\~(.*)$/){ # f~ |
push @fs_filemask, $1; |
} elsif ($cur_path =~ /^d\~(.*)$/){ # d~ |
push @fs_dirmask, $1; |
} elsif ($cur_path =~ /^\=\!(.*)$/){ # =! |
push @fs_notmask, $1; |
} elsif ($cur_path =~ /^f\!(.*)$/){ # f! |
push @fs_notfilemask, $1; |
} elsif ($cur_path =~ /^d\!(.*)$/){ # d! |
push @fs_notdirmask, $1; |
} elsif ($cur_path =~ /^#/ || $cur_path =~ /^\s*$/){ # comment |
next; |
} elsif ($cur_path =~ /[\/\w]+/) { # /dir[/file] |
push @fs_path, $cur_path; |
} else { |
print STDERR "Syntax error: $cur_path, ingnored.\n" if ($cfg_verbose >= &VERB_ALL); |
} |
} |
#-------------------------------------------------------------------- |
# Последовательно просматририваем весь список директорий отмеченных для бэкапа |
foreach $cur_pathitem (@fs_path){ |
print "Adding $cur_pathitem....\n" if ($cfg_verbose == &VERB_ALL); |
find (\&add_to_backup, $cur_pathitem); |
print "done\n" if ($cfg_verbose == &VERB_ALL); |
} |
close (LIST); |
close (DIRS); |
#------------ |
# Составляем список удаленных файлов. |
open (DEL, ">$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del")|| print "Can't create list file ($cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del).\n"; |
flock (DEL, 2); |
if ($cfg_backup_style ne "hash"){ |
while(($file, $key)= each(%active_hash_last)){ |
$file =~ s/\'/\'\\\'\'/g; |
$file =~ s/^\/(.*)$/$1/; |
print DEL "rm -rf '$file'\n"; |
$del_lines_cnt++; |
} |
} |
close(DEL); |
# Записываем хэш на диск. |
$dbobj_new->sync(); |
untie %active_hash_new; |
untie %active_hash_last; |
chdir ("/"); # Переходим в корень, так как все пути у нас без корневого / |
#------------ |
# Если только обновляем хэш, то записываем его и выходим. |
if ($cfg_backup_style eq "hash"){ # Только создать хэшь без архивирования. |
system( "cp -f $cfg_cache_dir/$cfg_backup_name/.hash $cfg_local_path/.hash") == 0 || print "Local FS copy hash failed: $?"; |
exit (0); |
} |
#------------ |
# Архивируем и передаем в хранилище. |
if ($list_lines_cnt == 0 && $del_lines_cnt == 0){ |
print "WARNING: Nothing to backup.\n" if ($cfg_verbose >= &VERB_ALL); |
exit; |
} |
print "Storing local backup...\n" if ($cfg_verbose == &VERB_ALL); |
if ($cfg_backup_style eq "sync"){ |
if ($cfg_clean_flag == 1){ # Удалить старые копии |
print "WARNING: If you really shure to delete $cfg_local_path before sync operatioun uncomment line 'system( \"find \$cfg_local_path -not -path '\$cfg_local_path' -maxdepth 1 -exec \$prog_rm -rf \{\} \\;\");'" if ($cfg_verbose >= &VERB_ALL); |
} |
system( "cd $cfg_local_path; sh $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del"); |
system( "$prog_tar -c -f - -T $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list| $prog_tar -xf - -C $cfg_local_path") == 0 || print "Local FS sync failed (tar|untar): $?\n"; |
system( "cd $cfg_local_path; sh $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir"); |
system( "cp -f $cfg_cache_dir/$cfg_backup_name/.hash $cfg_local_path/$backup_file_base.hash") == 0 || print "Local FS copy failed: $?\n"; |
} else { |
if ($cfg_clean_flag == 1){ # Удалить старые копии |
if ($cfg_save_old_backup == 0){ |
system( "$prog_rm -f $cfg_local_path/*"); |
} else { |
if (! -d "$cfg_local_path/OLD"){ |
system( "mkdir $cfg_local_path/OLD"); |
} |
system( "$prog_rm -f $cfg_local_path/OLD/*"); |
system( "mv -f $cfg_local_path/$cfg_backup_name* $cfg_local_path/OLD/"); |
} |
} |
system( "cp -f $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list $cfg_local_path/$backup_file_base.list") == 0 || print "Local FS .list copy failed: $?\n"; |
system( "cp -f $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.dir $cfg_local_path/$backup_file_base.dir") == 0 || print "Local FS .dir copy failed: $?\n"; |
system( "cp -f $cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.del $cfg_local_path/$backup_file_base.del") == 0 || print "Local FS .del copy failed: $?\n"; |
system( "cp -f $cfg_cache_dir/$cfg_backup_name/.hash $cfg_local_path/$backup_file_base.hash") == 0 || print "Local FS .hash copy failed: $?\n"; |
# Обрабатываем разбиение на тома |
for ($arc_block_level=0; $arc_block_level <= $#volume_position; $arc_block_level++){ |
my $tmp_list_file = crate_tmp_list($arc_block_level, $volume_position[$arc_block_level], $volume_position[$arc_block_level+1], "$cfg_cache_dir/$cfg_backup_name/$cfg_backup_name.list"); |
system( "$prog_tar -c -f - -T $tmp_list_file $prog_gzip_filter > $cfg_local_path/$backup_file_base-$arc_block_level.tar${arc_ext}") == 0 || print "Local FS tar backup failed: $?\n"; |
} |
} |
print "***** Backup successful complete.\n" if ($cfg_verbose == &VERB_ALL); |
exit (0); |
######################################## |
sub add_to_backup{ |
my($file_name, $file_dir, $md5_checksum_stat, $checksum_stat); |
my($tmp, $stat_mode, $stat_uid, $stat_gid, $stat_size, $stat_mtime, $stat_time); |
$file_name = $_; |
$file_fullpath = $File::Find::name; |
$file_dir = $File::Find::dir; |
my $file_fullpath_esc = $file_fullpath; |
$file_fullpath_esc =~ s/\'/\'\\\'\'/g; |
# Создаем список директорий |
if ((-d $file_fullpath) && (! -l $file_fullpath)){ |
if (check_path($file_dir, $file_name) == 1){ |
if ($cfg_backup_style ne "hash"){ |
($tmp, $tmp, $stat_mode, $tmp, $stat_uid, $stat_gid, $tmp, $stat_size, $tmp, $stat_mtime, $stat_time) = stat($file_fullpath); |
$stat_mode = sprintf ("%04o", $stat_mode & 07777); |
$file_fullpath_esc =~ s/^\/(.*)$/$1/; |
my ($sec,$min,$hour,$mday,$mon,$year) = localtime($stat_time); |
$stat_time = sprintf ("%4.4d%2.2d%2.2d%2.2d%2.2d.%2.2d", |
$year+1900,$mon+1,$mday,$hour,$min,$sec); |
print DIRS "mkdir '$file_fullpath_esc'\n"; |
print DIRS "chmod $stat_mode '$file_fullpath_esc'\n"; |
print DIRS "chown $stat_uid:$stat_gid '$file_fullpath_esc'\n"; |
print DIRS "touch -t $stat_time '$file_fullpath_esc'\n"; |
$active_hash_new{$file_fullpath} = "D"; |
delete $active_hash_last{$file_fullpath}; |
$cur_backup_size += int(length($file_fullpath)/100.0 + 1)*512; |
if ($cfg_maximum_archive_size > 0 && $cur_backup_size + 10240 >= $cfg_maximum_archive_size){ |
my $old_val = $cur_backup_size - $stat_size - int(length($file_fullpath)/100.0 + 1)*512; |
my $tmp_pos= $#volume_position+1; |
print "Volume $tmp_pos Done. Size: $old_val\n" if ($cfg_verbose == &VERB_ALL); |
$cur_backup_size = $stat_size + int(length($file_fullpath)/100.0 + 1)*512 + 1536; |
push @volume_position, $list_lines_cnt; |
} |
} |
} else { |
if ($cfg_stopdir_prune == 1){ |
$File::Find::prune = 1; |
return; |
} |
} |
# Работаем с файлами |
} elsif ((-f $file_fullpath) || (-l $file_fullpath)){ |
if (check_path($file_dir, $file_name) == 1){ |
($tmp, $tmp, $stat_mode, $tmp, $stat_uid, $stat_gid, $tmp, $stat_size, $tmp, $stat_mtime) = stat($file_fullpath); |
$checksum_stat= md5_base64("$stat_mtime/$stat_size/$stat_mode/$stat_uid/$stat_gid"); |
# $file_fullpath_md5 = md5_base64($file_fullpath); |
$file_fullpath_md5 = $file_fullpath; |
if ($cfg_time_limit != 0 && $cur_time - $cfg_time_limit > $stat_mtime){ |
print "Time limit: $cur_time - $cfg_time_limit > $stat_mtime, file $file_fullpath ignored.\n" if ($cfg_verbose == &VERB_ALL); |
next; |
} |
if ($cfg_size_limit != 0 && $cfg_size_limit < $stat_size){ |
print "Size limit: $cfg_size_limit < $stat_size, file $file_fullpath ignored.\n" if ($cfg_verbose == &VERB_ALL); |
next; |
} |
if (($cfg_checksum eq "md5") && (! -l $file_fullpath)){ |
($md5_checksum_stat, $tmp) = split(/\s+/, `$prog_md5sum '$file_fullpath_esc'`); |
$active_hash_new{$file_fullpath_md5} = "$checksum_stat/$md5_checksum_stat"; |
check_update($file_fullpath, "$checksum_stat/$md5_checksum_stat", $file_fullpath_md5, $stat_size); |
} else { |
$active_hash_new{$file_fullpath} = $checksum_stat; |
check_update($file_fullpath, $checksum_stat, $file_fullpath, $stat_size); |
} |
} |
} |
} |
############################################### |
# Проверяем изменился ли файл или нет, если да апдейтим лог. |
sub check_update{ |
my ($file, $checksum, $filesum, $stat_size) = @_; |
if ( $active_hash_last{$filesum} ne $checksum){ |
if ($cfg_backup_style ne "hash"){ |
$file =~ s/^\/(.*)$/$1/; |
print LIST "$file\n"; |
# Обрабатываем случай разбиения гиганских архивов. |
if (-l "/$file"){ |
$stat_size = 0; |
} |
$cur_backup_size += $stat_size + int(length($file)/100.0 + 1)*512; |
# print "$cur_backup_size:$stat_size:$file\n"; |
if ($cfg_maximum_archive_size > 0 && $cur_backup_size + 10240 >= $cfg_maximum_archive_size){ |
my $old_val = $cur_backup_size - $stat_size - int(length($file)/100.0 + 1)*512; |
my $tmp_pos= $#volume_position+1; |
print "Volume $tmp_pos Done. Size: $old_val\n" if ($cfg_verbose == &VERB_ALL); |
$cur_backup_size = $stat_size + int(length($file)/100.0 + 1)*512 + 1536; |
push @volume_position, $list_lines_cnt; |
} |
} |
$list_lines_cnt++; |
} |
delete $active_hash_last{$filesum}; |
if (defined $dbobj_last){ |
$dbobj_last->del($filesum); |
} |
} |
############################################### |
# 0 - не добавлять файл |
# 1 - добавть файл |
sub check_path { |
my ($dir_name, $file_name) = @_; |
my ($item, $path); |
$path = "$dir_name/$file_name"; |
foreach $item (@fs_notmask){ |
if ($path =~ /$item/){ |
return 0; |
} |
} |
foreach $item (@fs_notfilemask){ |
if ($file_name =~ /$item/){ |
return 0; |
} |
} |
foreach $item (@fs_filemask){ |
if ($file_name =~ /$item/){ |
return 1; |
} |
} |
foreach $item (@fs_notdirmask){ |
if ($dir_name =~ /$item/){ |
return 0; |
} |
} |
foreach $item (@fs_mask){ |
if ($path =~ /$item/){ |
return 1; |
} |
} |
foreach $item (@fs_dirmask){ |
if ($dir_name =~ /$item/){ |
return 1; |
} |
} |
foreach $item (@fs_notpath){ |
if (($dir_name eq $item) || ($path eq $item) || ($dir_name =~ /^$item\//)){ |
return 0; |
} |
} |
return 1; |
} |
############################################### |
# Содание списка файлов для помещения в определенный том многотомного архива. |
sub crate_tmp_list{ |
my ($arc_block_level, $position1, $position2, $full_list_path) = @_; |
my ($tmp_list_path, $pos_counter); |
if ($arc_block_level == 0 && $position1 == 0 && $position2 eq ''){ |
$tmp_list_path = $full_list_path; |
} else { |
$pos_counter = 0; |
$tmp_list_path = "$full_list_path.$arc_block_level"; |
open(FULL_LIST, "<$full_list_path")|| die "Can't open full list $full_list_path\n"; |
flock(FULL_LIST, 1); |
open(TMP_LIST, ">$tmp_list_path")|| die "Can't create temp list $tmp_list_path\n"; |
flock(TMP_LIST, 2); |
while(<FULL_LIST>){ |
if (($pos_counter >= $position1) && ($pos_counter < $position2 || $position2 eq '')){ |
print TMP_LIST $_; |
} |
$pos_counter++; |
} |
close(TMP_LIST); |
close(FULL_LIST); |
} |
return $tmp_list_path; |
} |
############################################### |
############################################### |
__END__ |
=head1 NAME |
fsbackup - file system backup and synchronization utility. |
=head1 SYNOPSIS |
fsbackup.pl [options] <configuration file> |
=head1 DESCRIPTION |
C<fsbackup.pl> is a incremental backup creation utility. |
C<fsbackup.pl> support backup compression and encryption. Some addition |
scripts allow backups SQL tables from PostgreSQL and MySQL (C<pgsql_backup.sh> |
and C<mysql_backup.sh>)), save system configuration files and list of installed |
packages (C<sysbackup.sh>). |
Backuped with C<fsbackup.pl> files can be recovered by script C<fsrestore.sh>, |
backuped with C<sysbackup.sh> system packeges can be reinstalled by C<sysrestore.sh> |
=head1 OPTIONS |
The following command-line options can be used with C<fsbackup.pl>: |
=over |
=item C<-n> |
Create new backup without checking files in previously stored hash. |
=item C<-f> |
Create full backup, like as C<-n> option. |
=item C<-h> |
Only rebuild hash, no storing files in backup archive. |
=item C<-c> |
Clean incremental backup storage and create new full backup without checking |
$cfg_increment_level config parameter. |
=head1 ADDITION SCRIPTS |
=item C<create_backup.sh> |
Backup planner running from C<crontab>. For example: |
18 4 * * * /root/backup/fsbackup/create_backup.sh |
=item C<install.pl> |
Script to install fsbackup package and some required perl modules. |
=item C<fsbackup.pl> |
File system backup utility. |
=item C<cfg_example> |
Example of configuration file. |
=item C<scripts/pgsql_backup.sh> |
=item C<scripts/mysql_backup.sh> |
Script for backup SQL tables from PostreSQL and MySQL. |
=item C<scripts/sysbackup.sh> |
Script for store system configuration files and information about installed |
packages. |
=item C<scripts/fsrestore.sh> |
Script for restore files backuped by C<fsbackup.pl>. |
=item C<scripts/sysrestore.sh> |
Script for reinstall packages stored by C<sysbackup.sh>. |
=head1 CONFIGURATION FILE |
=item B<$cfg_backup_name> = 'test_host' |
Name of backup, single word. |
=item B<$cfg_cache_dir> = '/root/backup/fsbackup/cache' |
Path of internal cache directory for local backup method. |
=item B<$prog_md5sum> = 'md5sum -b' |
=item B<$prog_tar> = 'tar' |
=item B<$prog_rm> = 'rm' |
=item B<$prog_gzip> = 'gzip' |
Full path of some external program running from C<fsbackup.pl>. |
B<$prog_gzip = ''> - not use compression |
=item B<$cfg_checksum> = 'timesize' |
File checksum method: |
timesize - checksum of file attributes (default, best speed) |
md5 - checksum of file attributes + MD5 checksum of file content. |
=item B<$cfg_backup_style> = 'backup' |
Backup style: |
backup - incremental backup (copy only new and changed files). |
full_backup - full backup (copy all files). |
sync - file tree synchronization. |
hash - hash creation without storing archive (spying for new or changed files). |
=item B<$cfg_increment_level> = 7 |
Incremental level (after how many incremental copy make full refresh of backup) |
=item B<$cfg_local_path> = '/var/backup/' |
Path of directory to store backup on local file system for local storage type. |
=item B<$cfg_time_limit> = 0 |
Limit of file creation time in days. If not 0, don't backup files created or |
modified later then $cfg_time_limit (days). |
=item B<$cfg_size_limit> = 0 |
Limit of maximum file size. If not 0, don't backup files witch size more then |
$cfg_time_limit kilobytes. |
=item B<$cfg_root_path> = '/' |
Root path for initial chdir. |
=item B<$cfg_verbose> = 3 |
Verbose level. |
0 - Silent mode, suspend all output, except fatal configuration errors. |
1 - Output errors and warnings. |
2 - Output all the available data. |
=item B<$cfg_save_old_backup> = 1 |
Save previous backup to OLD directory before rotation or before storing full backup. |
0 - don't save old backup |
1 - save old backup. |
=item B<$cfg_maximum_archive_size> = 0 |
Size of maximum size (in KiloBytes) of single unpacked archive file (0 - unlimited file size). |
=item B<$cfg_stopdir_prune> = 0 |
Recursive review of the prohibited directories. |
0 - Recursively to view all contents of directories marked for backup, including contents of directories prohibited by '!', '!d' and '=! rules. |
1 - not use a recursive entrance to directory prohibited for backup (speed is increased, reduces flexibility of customization). |
=item B<__DATA__> - list of backuped path and regexp mask. |
/dir[/file] - backup file or directory. |
!/dir[/file] - NOT include this file or directory to backup. |
# - ignore this line. |
Mask: |
=~ - regexp mask for include file or directory to backup. |
f~ - regexp file mask for include file to backup. |
d~ - regexp directory mask for include directory to backup. |
=! - regexp mask for NOT include file or directory to backup. |
f! - regexp file mask for NOT include file to backup. |
d! - regexp directory mask for NOT include directory to backup. |
Operation priority: |
1. =! |
2. f! |
3. f~ |
4. d! |
5. =~ |
6. d~ |
7. !path |
8. path |
=head1 COPYRIGHT |
Copyright (c) 2001 by Maxim Chirkov <mc@tyumen.ru> |
http://www.opennet.ru/dev/fsbackup/ |
=head1 BUGS |
Look TODO file. |
=head1 AUTHORS |
Maxim Chirkov <mc@tyumen.ru> |
=cut |
/fsbackup/origin/cfg_example |
---|
0,0 → 1,373 |
# Example of configuration file. |
# Пример файла конфигурации. |
# |
# http://www.opennet.ru/dev/fsbackup/ |
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru> |
# |
#------------------- |
# Name of backup, single word. |
# Имя для бэкапа, строка состоящая из латинских букв, цифр и символа подчеркивания. |
#------------------- |
$cfg_backup_name = "sun_int_26th_net"; |
#------------------- |
# Path of internal cache directory for local backup method. |
# Директория для помещения текущих хэшей для локального метода бэкапа, или |
# временных хешей для других методов. |
#------------------- |
$cfg_cache_dir = "/root/backup/fsbackup/cache"; |
#------------------- |
# Full path of some external program running from C<fsbackup.pl>. |
# $prog_gzip = "" - not use compression, $prog_pgp = "" - not use encryption. |
# Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется |
# не полениться и прописать полный путь к каждой программе. |
# Внимание ! При использовании шифрования через gpg, рекомендуется |
# установить значение $prog_gzip="", так как gpg перед шифрованием сжимает |
# данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU. |
#------------------- |
$prog_md5sum = "md5sum -b"; |
$prog_tar = "/usr/bin/tar"; |
$prog_ssh = "/usr/bin/ssh"; |
$prog_rm = "/bin/rm"; |
$prog_gzip = "/usr/bin/gzip"; # Если равно "", то не использовать сжатие. |
$prog_pgp = "gpg"; # Если равно "", то не применять шифрование. |
#------------------- |
# Checksum method: |
# timesize - checksum of file attributes (default, best speed) |
# md5 - checksum of file attributes + MD5 checksum of file content. |
# Метод вычисления контрольных сумм для определения изменений в файле. |
# timesize - учитывается время последнего изменения файла, его размер, |
# атрибуты файла, но не учитывается содержимое. Как правило |
# учета данных факторов достаточно для определения необходимости |
# обновления файла в бэкапе. Наиболее быстрый метод. |
# md5 - все параметры timesize + контрольная сумма содержимого |
# файла. Наиболее ресурсоемкий и медленный метод. |
#------------------- |
$cfg_checksum = "timesize"; |
#------------------- |
# Backup style: |
# backup - incremental backup (copy only new and changed files). |
# full_backup - full backup (copy all files). |
# sync - file tree synchronization. |
# hash - hash creation without storing archive (spying for new or changed files). |
# Определение типа операции, вида бэкапа. |
# backup - инкрементальный бэкап в архив (т.е. копируются только |
# изменившиеся с момента последнего бэкапа файлы).. |
# full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются |
# все файлы). |
# sync - синхронизация дерева (только для типа хранилища ssh или local). |
# hash - только генерация хэша, без помещения файлов в архив |
# (пометка помещения файлов в бэкап, без физического перемещения) |
#------------------- |
$cfg_backup_style = "backup"; |
#------------------- |
# Incremental level (after how many incremental copy make full refresh of backup) |
# Число копий бэкапа, при инкрементальном бэкапе, после которых производится |
# полный бэкап. Например, при = 7 - 6 раз будут помещаться только изменения, |
# на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз. |
#------------------- |
$cfg_increment_level = 7; |
#------------------- |
# Save previous backup to OLD directory before rotation or before storing |
# full backup. |
# 0 - don't save old backup |
# 1 - save old backup. |
# Сохранение предыдущей версии полного бэкапа перед инкрементальной ротацией или |
# заменой текущего неинкрементального бэкапа новой версией. |
# Старая версия помещается в подкаталог OLD. |
# 0 - не сохранять предыдущую версию. |
# 1 - сохранять предыдущую версию |
#------------------- |
$cfg_save_old_backup = 1; |
#------------------- |
# Type of backup storage: |
# local - store backup on local file system. |
# remote_ssh - store backup on remote host over SSH connection. |
# remote_ftp - store backup on remote FTP server. |
# Тип хранилища для бэкапа. Описание см. в файле README. |
# local - хранение бэкапа в локальной файловой системе. |
# remote_ssh - копирование бэкапа на удаленную машину с использованием SSH |
# remote_ftp - копирование бэкапа на удаленную машину по FTP |
#------------------- |
$cfg_type = "local"; |
#------------------- |
# Connection parameters for remote_ssh storage type. |
# Параметры необходимые для копирования бэкапа через ssh и ftp: |
#------------------- |
$cfg_remote_host = "backup-server.test.ru"; |
$cfg_remote_login = "backup_login"; |
$cfg_remote_path = "/home/backup_login/backup"; |
#------------------- |
# Password of remote login for remote_ftp storage type. |
# Параметры необходимые для копирования бэкапа по ftp: |
#------------------- |
$cfg_remote_password = "Test1234"; |
#------------------- |
# Path of directory to store backup on local file system for local storage type. |
# Параметры необходимые для хранения бэкапа на локальной ФС: |
#------------------- |
$cfg_local_path = "/root/backup/fsbackup/cache"; |
#------------------- |
# Limit of file creation time in days. |
# If not 0, don't backup files created or modified later then $cfg_time_limit days. |
# Время в днях, файлы созданные ранее которого не будут помещаться в бэкап. |
# 0 - помещаем все фалы независимо от времени их создания. |
#------------------- |
$cfg_time_limit = 0; |
#------------------- |
# Limit of maximum file size. |
# If not 0, don't backup files witch size more then $cfg_time_limit kilobytes. |
# Максимально допустимый размер файла в Kb для помещения в бэкап. |
# 0 - помещаем все фалы независимо от их размера. |
#------------------- |
$cfg_size_limit = 0; |
#------------------- |
# Size of maximum size (in KiloBytes) of single unpacked archive file (volume). |
# 0 - unlimited file size. |
# Максимальный размер (в Kb) несжатого архива с бэкапом, размещенного в одном |
# файле, т.е. размер тома. Полезно при создании гиганских архивов не влезающих |
# в ограничение файловой системы или при последующей записи архивов на CD-ROM |
# или другие накопители небольшого размера. |
# При превышении заданного размера, запись продолжается в следующий файл c |
# идентификатором '-2', '-3' и т.д. |
# 0 - размер архива не ограничен. |
#------------------- |
$cfg_maximum_archive_size = 0; |
#------------------- |
# Root path for initial chdir. |
# Корневая директория, относительно которой файлы помещаются в бэкап и |
# относительно которой описаны пути для помещения файлов. |
#------------------- |
$cfg_root_path = "/"; |
#------------------- |
# Name of user in public key ring with public key will be used for PGP encryption. |
# Not use encryption if not set. |
# Шифрования бэкапа с помощью PGP. |
# Если поле не заполнено, то pgp не применяется. |
# Иначе поле содержит UserId записи в public key ring. |
#------------------- |
# $cfg_pgp_userid = "backup"; |
#------------------- |
# Verbose level. |
# 0 - Silent mode, suspend all output, except fatal configuration |
# errors. |
# 1 - Output errors and warnings. |
# 2 - Output all the available data. |
# |
# Уровень "говорливости", регулирует объем выводимых программой сообщений. |
# 0 - Подавить вывод любых сообщений. |
# 1 - Выводить сообщения об ошибках и предупреждения |
# 2 - Выводить все сообщения |
#------------------- |
$cfg_verbose = 2; |
#------------------- |
# Recursive review of the prohibited directories. |
# 0 - Recursively to view all contents of directories marked for |
# backup, including contents of directories prohibited by |
# '!', '!d' and '=! rules. |
# 1 - not use a recursive entrance to directory prohibited for |
# backup (speed is increased, reduces flexibility of customization). |
# |
# Рекурсивный просмотр запрещенных директорий. |
# 0 - рекурсивно просматривать все содержимое директорий помеченных |
# для бэкапа, в том числе и содержимое директорий запрещенных |
# правилами '!', '!d' и '=!'. |
# 1 - не использовать рекурсивный вход в запрещенные для |
# бэкапа директории (увеличивается скорость бэкапа, уменьшает |
# гибкость настройки). |
#------------------- |
$cfg_stopdir_prune=0; |
1; |
#------------------- |
# List of backuped path and regexp mask. |
# /dir[/file] - backup file or directory. |
# !/dir[/file] - NOT include this file or directory to backup. |
# # - ignore this line. |
# Mask: |
# =~ - regexp mask for include file or directory to backup. |
# f~ - regexp file mask for include file to backup. |
# d~ - regexp directory mask for include directory to backup. |
# =! - regexp mask for NOT include file or directory to backup. |
# f! - regexp file mask for NOT include file to backup. |
# d! - regexp directory mask for NOT include directory to backup. |
# |
# |
# |
# Список файлов и условий для помещения в бэкап. |
# (описываются после директивы __DATA__): |
# /dir[/file] - путь к файлу/директории для бэкапа. |
# !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь. |
# # - комментарий |
# Маски: |
# =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ. |
# f~ - маска для файла. Первый или второй символ. |
# d~ - маска для директории. Первый или второй символ. |
# Маски отрицания: |
# =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ. |
# f! - "НЕ" маска для файла. Первый или второй символ. |
# d! - "НЕ" маска для директории. Первый или второй символ. |
# |
# |
# Бэкап проходит только в рамках директорий и файлов описанных в путях. |
# Отрицания путей имеют более высокий приоритет чем пути. |
# Маски имеют более высокий приоритет, чем пути или отрицание путей, |
# маски "НЕ" имеют более высокий приоритет, чем обычные маски: |
# |
# |
# Таблица приоритетов: |
# Operation priority: |
# |
# 1. =! |
# 2. f! |
# 3. f~ |
# 4. d! |
# 5. =~ |
# 6. d~ |
# 7. ! |
# 8. path |
# |
# Пример: |
# /usr/home # Объявляем /usr/home как пустой путь, |
# !/usr/home # для работы масок. |
# d~public_html |
# /var |
# d!var/log |
# f~netconf\.log.* |
# |
# при этом только /usr/home/*/public_html будет добавлено в архив, |
# а файлы директории /var/log/var/log/, за исключением messages, нет. |
# Но, /usr/local/home/user/public_html добавлено в |
# архив не будет ! Для поиска только по маскам нужно объявить: |
# / |
# !/ |
# d~public_html |
# d~cgi-bin |
# d~/etc/ |
#------------------- |
__DATA__ |
/root/backup/fsbackup |
!/root/backup/fsbackup/cache |
f!\.core$ |
f!^core$ |
f!\.o$ |
f!\.log$ |
#d~public_html |
#d!/log |
#f~netconf\.log.* |
# Linux |
/usr/src/linux/.config |
# BSD |
/var/db/pkg |
/usr/src/sys/i386/conf |
# Users |
/home |
/root |
!/home/ftp |
=!\.netscape/cache/ |
=!\.mozilla/.*/Cache/ |
=!\.mozilla/.*/NewCache/ |
=!\.mozilla/.*/News/ |
f!.*\.avi$ |
f!.*\.mpeg$ |
f!.*\.mpg$ |
f!.*\.mp3$ |
# System configuration |
/etc |
/var/cron/tabs |
/var/spool/cron |
/usr/local/etc |
# Installed packages |
/usr/local/bin |
/usr/local/include |
/usr/local/lib |
/usr/local/libdata |
/usr/local/libexec |
/usr/local/sbin |
/usr/local/share |
/var/ucd-snmp |
# Programs from source |
/usr/local/apache/bin |
/usr/local/apache/conf |
/usr/local/apache/cgi-bin |
/usr/local/apache/htdocs |
/usr/local/apache/libexec |
/usr/local/apache/src |
/usr/local/www |
/usr/local/mysql/bin |
/usr/local/mysql/include |
/usr/local/mysql/lib |
/usr/local/mysql/libexec |
/usr/local/mysql/var/mysql |
/usr/local/pgsql/bin |
/usr/local/pgsql/share |
/usr/local/pgsql/lib |
/usr/local/pgsql/include |
/usr/local/pgsql/data |
!/usr/local/pgsql/data/base |
!/usr/local/pgsql/data/pg_xlog |
/usr/local/squid/bin |
/usr/local/squid/etc |
/usr/local/news/etc |
/usr/local/news/bin |
/usr/local/news/lib |
/usr/local/samba/bin |
/usr/local/samba/lib |
/fsbackup/origin/README |
---|
0,0 → 1,470 |
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 |
/fsbackup/origin/fsbackup.1 |
---|
0,0 → 1,362 |
.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.14 |
.\" |
.\" Standard preamble: |
.\" ======================================================================== |
.de Sh \" Subsection heading |
.br |
.if t .Sp |
.ne 5 |
.PP |
\fB\\$1\fR |
.PP |
.. |
.de Sp \" Vertical space (when we can't use .PP) |
.if t .sp .5v |
.if n .sp |
.. |
.de Vb \" Begin verbatim text |
.ft CW |
.nf |
.ne \\$1 |
.. |
.de Ve \" End verbatim text |
.ft R |
.fi |
.. |
.\" Set up some character translations and predefined strings. \*(-- will |
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left |
.\" double quote, and \*(R" will give a right double quote. | will give a |
.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to |
.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C' |
.\" expand to `' in nroff, nothing in troff, for use with C<>. |
.tr \(*W-|\(bv\*(Tr |
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' |
.ie n \{\ |
. ds -- \(*W- |
. ds PI pi |
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch |
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch |
. ds L" "" |
. ds R" "" |
. ds C` "" |
. ds C' "" |
'br\} |
.el\{\ |
. ds -- \|\(em\| |
. ds PI \(*p |
. ds L" `` |
. ds R" '' |
'br\} |
.\" |
.\" If the F register is turned on, we'll generate index entries on stderr for |
.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index |
.\" entries marked with X<> in POD. Of course, you'll have to process the |
.\" output yourself in some meaningful fashion. |
.if \nF \{\ |
. de IX |
. tm Index:\\$1\t\\n%\t"\\$2" |
.. |
. nr % 0 |
. rr F |
.\} |
.\" |
.\" For nroff, turn off justification. Always turn off hyphenation; it makes |
.\" way too many mistakes in technical documents. |
.hy 0 |
.if n .na |
.\" |
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). |
.\" Fear. Run. Save yourself. No user-serviceable parts. |
. \" fudge factors for nroff and troff |
.if n \{\ |
. ds #H 0 |
. ds #V .8m |
. ds #F .3m |
. ds #[ \f1 |
. ds #] \fP |
.\} |
.if t \{\ |
. ds #H ((1u-(\\\\n(.fu%2u))*.13m) |
. ds #V .6m |
. ds #F 0 |
. ds #[ \& |
. ds #] \& |
.\} |
. \" simple accents for nroff and troff |
.if n \{\ |
. ds ' \& |
. ds ` \& |
. ds ^ \& |
. ds , \& |
. ds ~ ~ |
. ds / |
.\} |
.if t \{\ |
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" |
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' |
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' |
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' |
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' |
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' |
.\} |
. \" troff and (daisy-wheel) nroff accents |
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' |
.ds 8 \h'\*(#H'\(*b\h'-\*(#H' |
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] |
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' |
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' |
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] |
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] |
.ds ae a\h'-(\w'a'u*4/10)'e |
.ds Ae A\h'-(\w'A'u*4/10)'E |
. \" corrections for vroff |
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' |
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' |
. \" for low resolution devices (crt and lpr) |
.if \n(.H>23 .if \n(.V>19 \ |
\{\ |
. ds : e |
. ds 8 ss |
. ds o a |
. ds d- d\h'-1'\(ga |
. ds D- D\h'-1'\(hy |
. ds th \o'bp' |
. ds Th \o'LP' |
. ds ae ae |
. ds Ae AE |
.\} |
.rm #[ #] #H #V #F C |
.\" ======================================================================== |
.\" |
.IX Title "FSBACKUP 1" |
.TH FSBACKUP 1 "2002-05-16" "perl v5.8.5" "User Contributed Perl Documentation" |
.SH "NAME" |
fsbackup \- file system backup and synchronization utility. |
.SH "SYNOPSIS" |
.IX Header "SYNOPSIS" |
.Vb 1 |
\& fsbackup.pl [options] <configuration file> |
.Ve |
.SH "DESCRIPTION" |
.IX Header "DESCRIPTION" |
\&\f(CW\*(C`fsbackup.pl\*(C'\fR is a incremental backup creation utility. |
\&\f(CW\*(C`fsbackup.pl\*(C'\fR support backup compression and encryption. Backup can be stored |
on local file system and on remote host stored over \s-1SSH\s0 or \s-1FTP\s0. Some addition |
scripts allow backups \s-1SQL\s0 tables from PostgreSQL and MySQL (\f(CW\*(C`pgsql_backup.sh\*(C'\fR |
and \f(CW\*(C`mysql_backup.sh\*(C'\fR)), save system configuration files and list of installed |
packages (\f(CW\*(C`sysbackup.sh\*(C'\fR). |
Backuped with \f(CW\*(C`fsbackup.pl\*(C'\fR files can be recovered by script \f(CW\*(C`fsrestore.sh\*(C'\fR, |
backuped with \f(CW\*(C`sysbackup.sh\*(C'\fR system packeges can be reinstalled by \f(CW\*(C`sysrestore.sh\*(C'\fR |
.SH "OPTIONS" |
.IX Header "OPTIONS" |
The following command-line options can be used with \f(CW\*(C`fsbackup.pl\*(C'\fR: |
.ie n .IP """\-n""" 4 |
.el .IP "\f(CW\-n\fR" 4 |
.IX Item "-n" |
Create new backup without checking files in previously stored hash. |
.ie n .IP """\-f""" 4 |
.el .IP "\f(CW\-f\fR" 4 |
.IX Item "-f" |
Create full backup, like as \f(CW\*(C`\-n\*(C'\fR option. |
.ie n .IP """\-h""" 4 |
.el .IP "\f(CW\-h\fR" 4 |
.IX Item "-h" |
Only rebuild hash, no storing files in backup archive. |
.ie n .IP """\-c""" 4 |
.el .IP "\f(CW\-c\fR" 4 |
.IX Item "-c" |
Clean incremental backup storage and create new full backup without checking |
\&\f(CW$cfg_increment_level\fR config parameter. |
.SH "ADDITION SCRIPTS" |
.IX Header "ADDITION SCRIPTS" |
.ie n .IP """create_backup.sh""" 4 |
.el .IP "\f(CWcreate_backup.sh\fR" 4 |
.IX Item "create_backup.sh" |
Backup planner running from \f(CW\*(C`crontab\*(C'\fR. For example: |
.Sp |
18 4 * * * /usr/local/fsbackup/create_backup.sh |
.ie n .IP """install.pl""" 4 |
.el .IP "\f(CWinstall.pl\fR" 4 |
.IX Item "install.pl" |
Script to install fsbackup package and some required perl modules. |
.ie n .IP """fsbackup.pl""" 4 |
.el .IP "\f(CWfsbackup.pl\fR" 4 |
.IX Item "fsbackup.pl" |
File system backup utility. |
.ie n .IP """cfg_example""" 4 |
.el .IP "\f(CWcfg_example\fR" 4 |
.IX Item "cfg_example" |
Example of configuration file. |
.ie n .IP """scripts/pgsql_backup.sh""" 4 |
.el .IP "\f(CWscripts/pgsql_backup.sh\fR" 4 |
.IX Item "scripts/pgsql_backup.sh" |
.PD 0 |
.ie n .IP """scripts/mysql_backup.sh""" 4 |
.el .IP "\f(CWscripts/mysql_backup.sh\fR" 4 |
.IX Item "scripts/mysql_backup.sh" |
.PD |
Script for backup \s-1SQL\s0 tables from PostreSQL and MySQL. |
.ie n .IP """scripts/sysbackup.sh""" 4 |
.el .IP "\f(CWscripts/sysbackup.sh\fR" 4 |
.IX Item "scripts/sysbackup.sh" |
Script for store system configuration files and information about installed |
packages. |
.ie n .IP """scripts/fsrestore.sh""" 4 |
.el .IP "\f(CWscripts/fsrestore.sh\fR" 4 |
.IX Item "scripts/fsrestore.sh" |
Script for restore files backuped by \f(CW\*(C`fsbackup.pl\*(C'\fR. |
.ie n .IP """scripts/sysrestore.sh""" 4 |
.el .IP "\f(CWscripts/sysrestore.sh\fR" 4 |
.IX Item "scripts/sysrestore.sh" |
Script for reinstall packages stored by \f(CW\*(C`sysbackup.sh\*(C'\fR. |
.SH "CONFIGURATION FILE" |
.IX Header "CONFIGURATION FILE" |
.IP "\fB$cfg_backup_name\fR = 'test_host'" 4 |
.IX Item "$cfg_backup_name = 'test_host'" |
Name of backup, single word. |
.IP "\fB$cfg_cache_dir\fR = '/usr/local/fsbackup/cache'" 4 |
.IX Item "$cfg_cache_dir = '/usr/local/fsbackup/cache'" |
Path of internal cache directory for local backup method. |
.IP "\fB$prog_md5sum\fR = 'md5sum \-b'" 4 |
.IX Item "$prog_md5sum = 'md5sum -b'" |
.PD 0 |
.IP "\fB$prog_tar\fR = 'tar'" 4 |
.IX Item "$prog_tar = 'tar'" |
.IP "\fB$prog_ssh\fR = 'ssh'" 4 |
.IX Item "$prog_ssh = 'ssh'" |
.IP "\fB$prog_rm\fR = 'rm'" 4 |
.IX Item "$prog_rm = 'rm'" |
.IP "\fB$prog_gzip\fR = 'gzip'" 4 |
.IX Item "$prog_gzip = 'gzip'" |
.IP "\fB$prog_pgp\fR = 'gpg'" 4 |
.IX Item "$prog_pgp = 'gpg'" |
.PD |
Full path of some external program running from \f(CW\*(C`fsbackup.pl\*(C'\fR. |
\&\fB$prog_gzip = ''\fR \- not use compression, \fB$prog_pgp = ''\fR \- not use |
encryption. |
.IP "\fB$cfg_checksum\fR = 'timesize'" 4 |
.IX Item "$cfg_checksum = 'timesize'" |
File checksum method: |
.Sp |
timesize \- checksum of file attributes (default, best speed) |
.Sp |
md5 \- checksum of file attributes + \s-1MD5\s0 checksum of file content. |
.IP "\fB$cfg_backup_style\fR = 'backup'" 4 |
.IX Item "$cfg_backup_style = 'backup'" |
Backup style: |
.Sp |
backup \- incremental backup (copy only new and changed files). |
.Sp |
full_backup \- full backup (copy all files). |
.Sp |
sync \- file tree synchronization. |
.Sp |
hash \- hash creation without storing archive (spying for new or changed files). |
.IP "\fB$cfg_increment_level\fR = 7" 4 |
.IX Item "$cfg_increment_level = 7" |
Incremental level (after how many incremental copy make full refresh of backup) |
.IP "\fB$cfg_type\fR = 'remote_ssh'" 4 |
.IX Item "$cfg_type = 'remote_ssh'" |
Type of backup storage: |
.Sp |
.Vb 3 |
\& local - store backup on local file system. |
\& remote_ssh - store backup on remote host over SSH connection. |
\& remote_ftp - store backup on remote FTP server. |
.Ve |
.IP "\fB$cfg_remote_host\fR = 'backup\-server.test.ru'" 4 |
.IX Item "$cfg_remote_host = 'backup-server.test.ru'" |
.PD 0 |
.IP "\fB$cfg_remote_login\fR = 'backup_login'" 4 |
.IX Item "$cfg_remote_login = 'backup_login'" |
.IP "\fB$cfg_remote_path\fR = '/home/backup_login/backup'" 4 |
.IX Item "$cfg_remote_path = '/home/backup_login/backup'" |
.PD |
Connection parameters for remote_ssh storage type. |
.IP "\fB$cfg_remote_password\fR = 'Test1234'" 4 |
.IX Item "$cfg_remote_password = 'Test1234'" |
Password of remote login for remote_ftp storage type. |
.IP "\fB$cfg_local_path\fR = '/var/backup/'" 4 |
.IX Item "$cfg_local_path = '/var/backup/'" |
Path of directory to store backup on local file system for local storage type. |
.IP "\fB$cfg_time_limit\fR = 0" 4 |
.IX Item "$cfg_time_limit = 0" |
Limit of file creation time in days. If not 0, don't backup files created or |
modified later then \f(CW$cfg_time_limit\fR (days). |
.IP "\fB$cfg_size_limit\fR = 0" 4 |
.IX Item "$cfg_size_limit = 0" |
Limit of maximum file size. If not 0, don't backup files witch size more then |
\&\f(CW$cfg_time_limit\fR kilobytes. |
.IP "\fB$cfg_root_path\fR = '/'" 4 |
.IX Item "$cfg_root_path = '/'" |
Root path for initial chdir. |
.IP "\fB$cfg_pgp_userid\fR = ''" 4 |
.IX Item "$cfg_pgp_userid = ''" |
Name of user in public key ring with public key will be used for \s-1PGP\s0 encryption. |
Not use encryption if not set. |
.IP "\fB$cfg_verbose\fR = 3" 4 |
.IX Item "$cfg_verbose = 3" |
Verbose level. |
.Sp |
.Vb 3 |
\& 0 - Silent mode, suspend all output, except fatal configuration errors. |
\& 1 - Output errors and warnings. |
\& 2 - Output all the available data. |
.Ve |
.IP "\fB$cfg_save_old_backup\fR = 1" 4 |
.IX Item "$cfg_save_old_backup = 1" |
Save previous backup to \s-1OLD\s0 directory before rotation or before storing full backup. |
.Sp |
.Vb 2 |
\& 0 - don't save old backup |
\& 1 - save old backup. |
.Ve |
.IP "\fB$cfg_maximum_archive_size\fR = 0" 4 |
.IX Item "$cfg_maximum_archive_size = 0" |
Size of maximum size (in KiloBytes) of single unpacked archive file (0 \- unlimited file size). |
.IP "\fB$cfg_stopdir_prune\fR = 0" 4 |
.IX Item "$cfg_stopdir_prune = 0" |
Recursive review of the prohibited directories. |
0 \- Recursively to view all contents of directories marked for backup, including contents of directories prohibited by '!', '!d' and '=! rules. |
1 \- not use a recursive entrance to directory prohibited for backup (speed is increased, reduces flexibility of customization). |
.IP "\fB_\|_DATA_\|_\fR \- list of backuped path and regexp mask." 4 |
.IX Item "__DATA__ - list of backuped path and regexp mask." |
.Vb 3 |
\& /dir[/file] - backup file or directory. |
\& !/dir[/file] - NOT include this file or directory to backup. |
\& # - ignore this line. |
.Ve |
.Sp |
Mask: |
.Sp |
.Vb 6 |
\& =~ - regexp mask for include file or directory to backup. |
\& f~ - regexp file mask for include file to backup. |
\& d~ - regexp directory mask for include directory to backup. |
\& =! - regexp mask for NOT include file or directory to backup. |
\& f! - regexp file mask for NOT include file to backup. |
\& d! - regexp directory mask for NOT include directory to backup. |
.Ve |
.Sp |
Operation priority: |
.Sp |
.Vb 8 |
\& 1. =! |
\& 2. f! |
\& 3. f~ |
\& 4. d! |
\& 5. =~ |
\& 6. d~ |
\& 7. !path |
\& 8. path |
.Ve |
.SH "COPYRIGHT" |
.IX Header "COPYRIGHT" |
Copyright (c) 2001 by Maxim Chirkov <mc@tyumen.ru> |
http://www.opennet.ru/dev/fsbackup/ |
.SH "BUGS" |
.IX Header "BUGS" |
Look \s-1TODO\s0 file. |
.SH "AUTHORS" |
.IX Header "AUTHORS" |
Maxim Chirkov <mc@tyumen.ru> |