Настройка резервного копирования в bacula
Серверная часть
- /etc/portage/package.use/bacula
app-backup/bacula logwatch mysql -postgres python readline -sqlite3 ssl tcpd
Предварительные телодвижения.
# Ставим. emerge -avt app-backup/bacula rc-update add bacula-dir default rc-update add bacula-sd default rc-update add bacula-fd default # Создаём базу-каталог. /usr/libexec/bacula/grant_mysql_privileges /usr/libexec/bacula/create_mysql_database /usr/libexec/bacula/make_mysql_tables mysql -e "update user set Password=Password('bacula-db-passwd') where user.User = 'bacula'" mysql -e "FLUSH PRIVILEGES" # Готовим место, куда будем складывать бекапы. mkdir /bck chown bacula:bacula /bck # Создаём директорию, где будут лежать куски конфига директора, и сохраняем дефолтовые конфиги. cd /etc/bacula/ mkdir include for f in *.conf ; do cp ${f}{,.dist} ; done
Схема именования: {имя_хоста}-{тип_объекта}-{уточнение1}-…-{уточнениеN}
Этот файл почти весь по дефолтовому конфигу:
- bacula-sd.conf
Storage { Name = xxx-sd SDPort = 9103 WorkingDirectory = "/var/lib/bacula" Pid Directory = "/var/run" Maximum Concurrent Jobs = 20 Heartbeat Interval = 30 sec } Director { Name = xxx-dir Password = "xxx-sd-passwd" } Director { Name = xxx-mon Password = "xxx-sd-mon-passwd" Monitor = yes } Device { Name = xxx-sddev-bck Media Type = File Archive Device = /bck LabelMedia = yes; Random Access = yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no; } Messages { Name = Standard director = xxx-dir = all }
Эта часть конфига директора тоже почти вся по дефолту, кроме того, что описание пулов, клиентов и заданий вынесено в отдельные файлы:
- bacula-dir.conf
Director { Name = xxx-dir Description = "Main backup server" DIRport = 9101 QueryFile = "/usr/libexec/bacula/query.sql" WorkingDirectory = "/var/lib/bacula" PidDirectory = "/var/run" Maximum Concurrent Jobs = 1 Password = "xxx-dir-passwd" Messages = Daemon } Storage { Name = xxx-storage Address = xxx.sabitov.ru # N.B. Use a fully qualified name here SDPort = 9103 Password = "xxx-sd-passwd" Device = xxx-sddev-bck Media Type = File } Console { Name = xxx-mon Password = "xxx-console-passwd" CommandACL = status, .status } Catalog { Name = MyCatalog dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula-db-passwd" } Schedule { Name = "WeeklyCycle" Run = Full 1st sun at 00:25 Run = Differential 2nd-5th sun at 00:25 Run = Incremental mon-sat at 00:25 } Schedule { Name = "WeeklyCycleAfterBackup" Run = Full sun-sat at 00:27 } Messages { Name = Standard mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r" operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r" mail = root@xxx.sabitov.ru = all, !skipped operator = root@xxx.sabitov.ru = mount console = all, !skipped, !saved append = "/usr/var/bacula/working/bacula.log" = all, !skipped catalog = all } Messages { Name = Daemon mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r" mail = root@xxx.catalysis.ru = all, !skipped console = all, !skipped, !saved append = "/usr/var/bacula/working/bacula.log" = all, !skipped } @/etc/bacula/include/xxx-dir-default-jobs-pools-etc.conf @/etc/bacula/include/xxx-dir-win-client.conf @/etc/bacula/include/xxx-dir-xxx-client.conf
Тут описываем всё, что не относится к бекапу конкретных клиентов.
- include/xxx-dir-default-jobs-pools-etc.conf
Job { Name = RestoreFiles Type = Restore Client = xxx-fd FileSet = xxx-fileset Storage = xxx-storage Pool = Default-Pool Messages = Standard Where = /tmp/bacula-restores } Job { Name = BackupCatalog Type = Backup Client = xxx-fd Storage = xxx-storage Level = Full FileSet = Catalog Schedule = WeeklyCycleAfterBackup Messages = Standard Pool = Catalog-Pool RunBeforeJob = "/usr/libexec/bacula/make_catalog_backup.pl MyCatalog" RunAfterJob = "/usr/libexec/bacula/delete_catalog_backup" Write Bootstrap = "/var/lib/bacula/%n.bsr" Priority = 11 # run after main backup } FileSet { Name = Catalog Include { Options { signature = MD5 } File = "/var/lib/bacula/bacula.sql" } } Pool { Name = Default-Pool Pool Type = Backup Recycle = yes AutoPrune = yes Volume Retention = 365 days } Pool { Name = Catalog-Pool Pool Type = Backup Recycle = yes Recycle Oldest Volume = yes AutoPrune = yes Volume Retention = 365 days Label Format = "Catalog-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-${Hour:p/2/0/r}-${Minute:p/2/0/r}" } Pool { Name = Scratch Pool Type = Backup }
Описание виндового клиента:
- include/xxx-dir-win-client.conf
Job { Name = win-job-bck Type = Backup Level = Incremental Client = win-fd FileSet = win-fileset Storage = xxx-storage Pool = win-filepool Schedule = WeeklyCycle Messages = Standard Priority = 10 Write Bootstrap = "/var/lib/bacula/%c.bsr" } Client { Name = win-fd Address = win.locnet FDPort = 9102 Catalog = MyCatalog Password = "win7-fd-passwd" File Retention = 30 days Job Retention = 6 months AutoPrune = yes } FileSet { Name = "win-fileset" Include { Options { signature = MD5 } # Разделитель директорий юниксовый! Если есть пробелы и т.п. # в имени файла/директории, то они специально никак не экранируются File = "C:/Users" } Include { # Exclude in real Options { # Этот параметр означает, что файлы, удовлетворяющие условиям, # будут удалятся из набора Exclude = yes WildFile = "*.avi" WildFile = "*.mpg" WildFile = "*.mpeg" WildFile = "*.wma" WildFile = "*.wmv" WildFile = "*.wtv" WildFile = "*.wav" WildFile = "*.mp3" } } } Pool { Name = win-filepool Pool Type = Backup Recycle = yes # Bacula can automatically recycle Volumes Recycle Oldest Volume = yes AutoPrune = yes # Prune expired volumes Volume Retention = 365 days # one year Label Format = "${Client}-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-${Hour:p/2/0/r}-${Minute:p/2/0/r}" Maximum Volume Jobs = 1 Maximum Volume Bytes = 5G # Limit Volume size to something reasonable Maximum Volumes = 30 # Limit number of Volumes in Pool }
- include/xxx-dir-xxx-client.conf
Job { Name = xxx-job-bck Type = Backup Level = Incremental Client = xxx-fd FileSet = xxx-fileset Storage = xxx-storage Pool = xxx-filepool Schedule = "WeeklyCycle" Messages = Standard Priority = 10 Write Bootstrap = "/var/lib/bacula/%c.bsr" } Client { Name = xxx-fd Address = xxx.catalysis.ru FDPort = 9102 Catalog = MyCatalog Password = "xxx-fd-passwd" File Retention = 30 days Job Retention = 6 months AutoPrune = yes } FileSet { Name = "xxx-fileset" Include { Options { signature = MD5 } File = /boot File = /etc File = /root File = /tftproot File = /usr/local File = /var/lib/mysql File = /var/lib/portage File = /var/log File = /var/www } Exclude { File = /var/lib/bacula File = /tmp File = /proc File = /tmp File = /.journal File = /.fsck } } Pool { Name = xxx-filepool Pool Type = Backup Recycle = yes # Bacula can automatically recycle Volumes Recycle Oldest Volume = yes AutoPrune = yes # Prune expired volumes Volume Retention = 365 days # one year Label Format = "${Client}-${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-${Hour:p/2/0/r}-${Minute:p/2/0/r}" Maximum Volume Jobs = 1 Maximum Volume Bytes = 40G # Limit Volume size to something reasonable Maximum Volumes = 3 # Limit number of Volumes in Pool }
Клиентская часть
- /etc/portage/package.use/bacula
app-backup/bacula bacula-clientonly logwatch -mysql -sqlite3
Предварительные телодвижения.
# Ставим. emerge -avt app-backup/bacula rc-update add bacula-fd default # Сохраняем дефолтовые конфиги. cd /etc/bacula/ for f in *.conf ; do cp ${f}{,.dist} ; done
Это конфиг линуксового клиента:
- bacula-fd.conf
FileDaemon { Name = xxx-fd FDport = 9102 WorkingDirectory = /var/lib/bacula Pid Directory = /var/run Maximum Concurrent Jobs = 5 } Director { Name = xxx-dir Password = "xxx-fd-passwd" } Director { Name = xxx-mon Password = "xxx-fd-mon-passwd" Monitor = yes } Messages { Name = Standard director = yam-dir = all, !skipped, !restored }
Это конфиг виндового клиента:
- bacula-fd.conf
FileDaemon { Name = win-fd FDport = 9102 WorkingDirectory = "C:\\Program Files\\Bacula\\working" Pid Directory = "C:\\Program Files\\Bacula\\working" Maximum Concurrent Jobs = 3 } Director { Name = xxx-dir Password = "win-fd-passwd" } Director { Name = xxx-mon Password = "win-fd-mon-passwd" Monitor = yes } Messages { Name = Standard director = yam-dir = all, !skipped, !restored }
Все клиенты (fd) должны иметь доступ к директору (dir) по порту TCP9101 и к хранилищу по порту TCP9103. Все клиенты должны предоставлять доступ директору по порту TCP9102.
Для подключения нового клиента надо:
- на клиентской машине открыть на фаерволе доступ от директора к клиенту
- на серверной машине открыть доступ клиенту к директору и хранилищу
- на клиентскую машину поместить готовый конфиг от другого клиента и исправить:
- Имя клиента
- Пароли для директора и монитора
- на серверной машине скопировать готовый файл конфигурации xxx-dir-yyy-client.conf в xxx-dir-zzz-client.conf, где yyy и zzz — имена клиентов: существующего и нового. После чего исправить в конфиге все строки yyy на zzz. Проверить значение Client.Address и исправить FileSet.
Webacula
Для работы webacula у php должен быть поднят флаг pdo, и в систему должен быть установлен пакет dev-php/ZendFramework. Поскольку Zend у нас уже стоит в системе, разворачивать ZendFramework-*-minimal в библиотеки webacula не надо.
Качаем дистр от сюда http://webacula.sourceforge.net
Распаковываем в /var/www/localhost/htdocs, получаем webacula-5.5.1, делаем симлинк на эту директорию
ln -sndf webacula-5.5.1 webacula
Проверяем, что все ОК:
cd /var/www/localhost/htdocs/webacula-5.5.1/install/ ./check_system_requirements.php
Далее, разглядываем файл /var/www/localhost/htdocs/webacula-5.5.1/docs/txt/install.txt
и выполняем всё что там написано по шагам :)
Правим application/config.ini:
- db.config.host
- db.config.username
- db.config.password
- db.config.dbname
- def.timezone
- locale
- bacula.sudo = «/usr/bin/sudo» — в оригинальном конфиге идёт /bin/sudo
- email.to_admin
- email.from
- feed_title
- feed_desc
Добавляем в /etc/sudoers
- /etc/sudoers
apache ALL=NOPASSWD: /usr/sbin/bconsole
Далее разглядываем /var/www/localhost/htdocs/webacula-5.5.1/install/apache/webacula.conf:
- Копируем всё, начиная со строки «
Alias /webacula…
» в /etc/apache2/vhosts.d/default_vhost.include - Меняем все строки
/usr/share/webacula/
на/var/www/localhost/htdocs/webacula/
- у меня 2.4й индеец, поэтому:
- убиваем все сроки
Order deny,allow
- там, где нет Allow, меняем
Deny from all
наRequire all denied
- там, где есть Allow, убиваем
Deny from all
- меняем
Allow from
наRequire ip
иRequire host
Создаём таблицы для webacula:
cd /var/www/localhost/htdocs/webacula-5.5.1/install/MySql ./10_make_tables.sh ./20_acl_make_tables.sh mysql bacula mysql> UPDATE webacula_users SET pwd=MD5('new_root_pwd') WHERE login='root';
Генерация паролей
При сборке бакулы используется следующая команда для автоматической генерации паролей:
openssl rand -base64 33
"Рекомендации ведущих собаководов"
http://bacula.org/en/, http://wiki.bacula.org/ — это официальный сайт и их вики.
http://habrahabr.ru/post/86526/ — не очень глубокий гайд про настройку bacula. Хорош низким «порогом вхождения».
http://www.lissyara.su/articles/freebsd/programms/bacula/ — еще один простой гайд, как настроить, чтобы заработало.
http://ru.wikibooks.org/wiki/Bacula — попытка подробно расписать что есть что в bacula. К сожалению, описание местами рудиментарное, но в самом начале бывает полезно смотреть сюда, т.к. позволяет легко ориентироваться в сущностях бакулы.
http://www.bog.pp.ru/work/bacula.html — в высшей степени монументальный труд про настройку bacula. Подробно, всеобъемлюще и поэтому многа букаф.
http://www.opennet.ru/base/sys/backup_plan.txt.html — «О разработке процедур резервного копирования (backup).» Еще один монументальный труд про резервное копирование. Рассматривается как его правильно организовать. Собственно, bacula, как таковая, не рассматривается.
http://myunix.dk/category/bacula/ — Large scale disk-to-disk backups using Bacula (серия статей, как люди настраивают бекап «по настоящему»)
— Andrew A. Sabitov 2013-04-27 00:18