
Bacula — кроссплатформенное клиент-серверное программное обеспечение, позволяющее централизованно управлять резервным копированием, восстановлением, и проверкой данных по сети. Bacula также может выполняться полностью на единственном сервере или, распределённо, на нескольких, может записывать резервные копии на различные типы носителей, включая ленты, ленточные библиотеки, диски. Предлагает широкие возможности для управления хранилищами данных, облегчает поиск и восстановление потерянных или повреждённых файлов. Благодаря модульной структуре, Bacula легко масштабируеться и может работать как в маленьких так и в крупных сетях. Возможность управления через CLI, GUI и веб-интерфейс.
Содержание:
Введение
Bacula разделена на несколько отдельных модулей это придает ей гибкости в работе:
- Director (DIR) (порт 9101) — директор осуществляет централизованный контроль и администрирование всего комплекса задач. Планирование и управление заданиями на резервное копирование (Job). Обслуживание Каталога (Catalog) — центральной БД для хранения метаданных.
- Storage Daemon (SD) (порт 9103) — сервер хранения читает и пишет данные на физический носитель: диск, ленту, DVD, USB.
- File Daemon (FD) (порт 9102) — клиент выполняющий непосредственное копирование, восстановление и проверку данных по запросу Director. File Daemon должен быть установлен на нужной клиентской машине и обменивается информацией с Director и Storage Daemon.
- Console — консоль управления для администратора. Поддерживаются списки ACL для разных пользователей консоли. Типы консолей: TTY, wxWidgets (GUI) для Linux, Unix, Win32, GNOME (GUI), несколько веб-интерфейсов, Qt4.
- Catalog database — база данных для хранения метаданных SQL: MySQL, PostgreSQL, или SQLite.
- Tray Monitor — монитор это апплет GNOME/KDE/Win32 GUI для показа активности Director, File daemons, Storage daemon в реальном времени.
Планирование
Первое, что вы должны будете сделать это понять и описать кто, что и когда будет резервироваться. В нашем примере я будут использовать три сервера.
Оборудование
- thor.kmps.local — FreeBSD 8.2 amd64. ISC-DHCP, Web, NUT, Bacula и т.п. [DIR, SD, FD]
- srv1.kmps.local — Windows 2003, AD, сетевые директории, DNS, SEP, WSUS, Bacula и т.п. [FD]
- srv2.kmps.local — Windows 2003 БД 1С, Гарант, Консультант+, Bacula и т.п. [FD]
Как мы сказали выше Bacula может быть распределена в сети и при грамотном ведении хозяйства и бюджета наша задача выглядела примерно так.

Примечание: чтобы не усложнять схему я специально убрал из неё трей-монитор, командную консоль, и БД каталога тк их можно поставить на другие машины. Пример
К слову сказать готовые ленты желательно переносить в другое здание (или помещение) тк от чрезвычайных случаев никто не застрахован. И вот еще я как и все вы живем в России обычно бюджет фирм на ИТ небольшой и приходиться выкручиваться самому так, что реальная схема часто выглядит так.

Схема резервного копирования
Для начала вам понадобится нарисовать простую таблицу примерно такого вида.

Так вы можете наглядно понять, что необходимо и как нужно сделать дальше следуйте вашей схеме. В процессе схему можете дополнять и оптимизировать не забывая все документировать. Вы документируете свою работу ведь правда?
Типы резервного копирования
Дополнительно опишем типы резервного копирования их плюсы и минусы:
- Полное копирование (Full backup) — производится копирование данных в полном объеме. Самый надежный способ копирования и в случае выхода из строя свежей копии данные можно восстановить из предыдущих копий. Эффективный и быстрый метод восстановления. Недостаток требует носителей большого объема и длительного времени выполнения.
- Дифференциальное копирование (Differential backup) — копируются файлы, изменившиеся после последнего Full backup. Данные копируются «нарастающим итогом», так что последняя копия всегда будет содержать все изменения с момента последнего Full backup. Выполняется быстрее чем Full backup повреждении одной из копий не приводит к потере всех данных за период (при наличии живого Full backup). Так или иначе требуется регулярный Full backup и бывает что последняя копия (при длительной работе) по размеру изменений приближается к Full backup.
- Инкрементное копирование (Incremental backup) — выполняется копирование только информации, измененной после выполнения предыдущего Incremental backup. Это самый быстрый метод резервирования и занимает меньше всего обьема, но и самый ненадежный метод. В случае повреждения одной из копии все последующие становятся шлаком. И соответственно при повреждении Full backup все становиться негодным. Восстановление данных занимает продолжительное время.
Итого предпочтителен Full backup но это«дорого» обходиться. Если данные не очень ценны или ресурсов мало то используйте Incremental backup. Differential backup это компромисс, но бывает что последняя копия приравниваться объему полного копирования так что следите за ним =). Есть еще и другие типы копирования такие как VirtualFull и Base вы можете познакомиться с ними сами.
Установка
Установка стандартна так что следуйте за белым кроликом…
# make search name=bacula-server
Port: bacula-server-5.0.3
Path: /usr/ports/sysutils/bacula-server
Info: The network backup solution (server)
Maint: dan@langille.org
B-deps: gettext-0.18.1.1 libiconv-1.13.1_1 postgresql-client-8.3.15,1
R-deps: gettext-0.18.1.1 libiconv-1.13.1_1 postgresql-client-8.3.15,1
WWW: _http://www.bacula.org/
# cd /usr/ports/sysutils/bacula-server
# make config
Options for bacula-server 5.0.3
[ ] SQLITE3 Use SQLite-3 database
[X] MYSQL Use MySQL database
[ ] POSTGRESQL Use PostgreSQL database
[ ] MTX Install mtx for control of autochanger devices
[X] NLS Native Language Support via gettext utilities
[X] OPENSSL Enable OpenSSL for encrypted communication
# make install clean
You may use the following build options (or make config):
WITH_CLIENT_ONLY=yes if you only want the file daemon.
WITH_MTX=yes if you want to use mtx instead of chio for autochanger control.
WITH_SQLITE3=yes if you want SQLite-3 as the database (not recommended).
WITH_OPENSSL=yes Enable OpenSSL for encrypted communication.
~~~
===> SECURITY REPORT:
This port has installed the following files which may act as network
servers and may therefore pose a remote security risk to the system.
/usr/local/lib/libbac.so.5
This port has installed the following startup scripts which may cause
these network services to be started at boot time.
/usr/local/etc/rc.d/bacula-sd
/usr/local/etc/rc.d/bacula-dir
If there are vulnerabilities in these programs there may be a security
risk to the system. FreeBSD makes no guarantee about the security of
ports included in the Ports Collection. Please type 'make deinstall'
to deinstall the port if this is a concern.
For more information, and contact details about the security
status of this software, see the following webpage:
http://www.bacula.org/
===> Cleaning for bacula-server-5.0.3
База данных
Для работы Bacula Director необходима база данных для накопления и оперирования всевозможными данными о собранных резервных копиях. Такая база называется Каталог (Catalog) и храниться она в СУРБД (MySQL, Postgres). Каталогов может быть несколько, в зависимости от потребностей. Перед запуском, необходимо подготовить хотя бы один.
Cоздадим базу данных в MYSQL, например BACULA_DB, и пользователя имеющего полные права на эту базу данных.
# mysqladmin -uADMIN_USER -pADMIN_PASS create BACULA_DB
# mysql -uADMIN_USER -pADMIN_PASS -e"GRANT ALL ON BACULA_DB.* TO \
BACULA_USER@localhost IDENTIFIED BY 'BACULA_USER_PASS'" BACULA_DB
Для заполнения базы необходимыми таблицами есть готовый скрипт находящийся /usr/local/share/bacula/make_mysql_tables. В нем по умолчанию используется база данных с именем bacula. Кто использует другое имя БД для Bacula то вам необходимо внести изменение в этот скрипт и запустить его.
# /usr/local/share/bacula/make_mysql_tables -u BACULA_USER -pBACULA_USER_PASS
Creation of Bacula MySQL tables succeeded.
Настройка
Необходимо создать директорию (а лучше взять новый диск для хранения резервных копий и еще лучше это использовать ленточный накопитель) куда будем писать резервные копии, и даем доступ на запись пользователю bacula и примонтируем (в моем случае) диск для бекапов:
# mkdir /home/bacula/backup
# chown bacula:bacula /home/bacula/backup
# mount /dev/ad6s1d /home/bacula/backup
Добавим в fstab строчку про монтирование диска (в моем случае).
# cat /etc/fstab
# Device Mountpoint FStype Options Dump Pass#
/dev/mirror/gm0s1b none swap sw 0 0
/dev/mirror/gm0s1a / ufs rw 1 1
/dev/mirror/gm0s1f /home ufs rw 2 2
/dev/mirror/gm0s1d /usr ufs rw 2 2
/dev/mirror/gm0s1e /var ufs rw 2 2
/dev/ad6s1d /home/bacula/backup ufs rw 2 2
/dev/acd0 /cdrom cd9660 ro,noauto 0 0
tmpfs /tmp tmpfs rw 0 0
Заметка: лучше всего монтировать сразу к корневому каталогу, а не выстраивать лесенок, так как могут быть последствия некорректного монтирования при недоступности вашей директории.
Director (DIR)
Необходимо создать конфигурационные файлы для DIR и SD на основе шаблонов и отредактировать их в соответствии с желаемой конфигурацией.
# cd /usr/local/etc
# ll |grep bacula
-r--r--r-- 1 root wheel 949B 11 май 11:56 bacula-barcodes.samples
-rw-r----- 1 root bacula 8,8K 11 май 11:56 bacula-dir.conf.sample
-rw-r----- 1 root wheel 5,8K 11 май 11:56 bacula-sd.conf.sample
# cp bacula-dir.conf.sample bacula-dir.conf
# cp bacula-sd.conf.sample bacula-sd.conf
Разберем дефолтный конфигурационный файл DIR:
# cat bacula-dir.conf
#
# Дефолтный файл конфигурации Bacula Director
#
# Единственное, что должно быть изменено, это добавить одну или
# несколько имен файлов или директорий в директиве Include
# набора FileSet.
#
# Для Bacula релиза 5.0.3 (04 августа 2010) - FreeBSD 8.2-RELEASE
#
# Вы также можете изменить адрес электронной почты по умолчанию
# от root до вашего адреса. См. директивы "mail" и "operator"
# в ресурсах сообщения.
#
Director { # Определим себя
Name = thor.kmps.local-dir # Имя
DIRport = 9101 # Порт который слушает DIR
QueryFile = "/usr/local/share/bacula/query.sql"
WorkingDirectory = "/var/db/bacula" # Рабочий каталог
PidDirectory = "/var/run"
Maximum Concurrent Jobs = 1 # Максимальное количество
# параллельных заданий. Не рекомендуется
# одновременно записывать
# несколько заданий в один пул.
Password = "SECRET" # Пароль для анонимной консоли (фулл контрол)
Messages = Daemon # Набор настроек для отправки сообщений
}
JobDefs { # Дефолтное задание
Name = "DefaultJob" # Имя задания
Type = Backup # Тип (backup, restore и т.д.)
Level = Incremental # Уровень бэкапа (Full, Incremental, Differential и тп)
Client = thor.kmps.local-fd # Имя клиента
FileSet = "Full Set" # Набора файлов для сохранения.
Schedule = "WeeklyCycle" # Расписание
Storage = File # Файловое хранилище
Messages = Standard # Поведение уведомлений
Pool = File # Пул, куда будем писать бэкапы
Priority = 10 # Приоритет. Давая заданиям приоритеты
# от 1 (max) до 10 (min), можно регулировать
# последовательность выполнения.
Write Bootstrap = "/var/db/bacula/%c.bsr" # Файл хранит информацию откуда извлекать
# данные при восстановлении
}
# Определим основные ночные сохранения заданий резервного копирования
# По умолчанию, работа резервного копирование будет на диске в /tmp
Job {
Name = "BackupClient1"
JobDefs = "DefaultJob"
}
#Job {
# Name = "BackupClient2"
# Client = thor.kmps.local2-fd
# JobDefs = "DefaultJob"
#}
# Резервное копирование каталога базы данных (после ночных сохранений)
Job {
Name = "BackupCatalog"
JobDefs = "DefaultJob"
Level = Full
FileSet="Catalog"
Schedule = "WeeklyCycleAfterBackup"
# Это создает копию ASCII из каталога
# Аргументы make_catalog_backup.pl являются:
# make_catalog_backup.pl <catalog-name>
RunBeforeJob = "/usr/local/share/bacula/make_catalog_backup.pl MyCatalog"
# Это удаляет копию каталога
RunAfterJob = "/usr/local/share/bacula/delete_catalog_backup"
Write Bootstrap = "/var/db/bacula/%n.bsr"
Priority = 11 # после основного резервного копирования
}
#
# Стандартный шаблон восстановления, который может изменен консольной программой
# Только одна такая работа необходима для всех Работа/Клиентов/Хранилищ...
# [единственное я изменил путь к Where для клиента thor.kmps.local-fd
# это куда Bacula будет складывать восстановленные из архивов файлы]
Job {
Name = "RestoreFiles"
Type = Restore
Client=thor.kmps.local-fd
FileSet="Full Set"
Storage = File
Pool = Default
Messages = Standard
#Where = /tmp/bacula-restores
Where = /home/bacula/bacula-restores
}
# Список файлов для резервного копирования
FileSet { # Список файлов
Name = "Full Set" # Имя списка файлов
Include {
Options {
signature = MD5 # Тип сигнатур MD5\SHA1
}
#
# Поместить список файлов, вы можете предшествует 'File =', по одному на строку
# или включить внешний список:
#
# File = <file-name
#
# Обратите внимание: "/" резервное копирование всего корневого раздела.
# если у вас есть другие разделы, такие как "/usr" / или "/home"
# вероятно, вы захотите, чтобы добавить их тоже.
#
# По умолчанию это определяется, чтобы указать для Bacula бинарный
# каталог, чтобы дать набор файлов для резервного копирования на
# диск во время начального тестирования.
#
File = /usr/local/sbin
}
#
# Если вы сохраняете корневой каталог, следующие два исключения
# файлов могут быть полезны
#
Exclude { # Исключения
File = /var/db/bacula ##Исключаемые директории
File = /tmp ##
File = /proc ##
File = /tmp ##
File = /.journal ###Исключаемые файлы
File = /.fsck ###
}
}
#
# Когда делать резервные копии, полную резервную копию в первое
# воскресенье месяца, дифференциальный (т.е. дополнительные к полной)
# каждые остальные воскресенья, так и инкрементный в другие дни.
Schedule { # Планировщик
Name = "WeeklyCycle" # Имя планировщика
Run = Full 1st sun at 23:05 # Запуск полного бекапа в..
Run = Differential 2nd-5th sun at 23:05 # Запуск диф. бекапа в..
Run = Incremental mon-sat at 23:05 # Запуск инк. бекапа в..
}
# Этот график для каталога. Он запускается после WeeklyCycle
Schedule {
Name = "WeeklyCycleAfterBackup"
Run = Full sun-sat at 23:10
}
# Это резервное копирование каталога Bacula [изменил из-за БД имя]
FileSet {
Name = "Catalog"
Include {
Options {
signature = MD5
}
#File = "/var/db/bacula/bacula.sql"
File = "/var/db/bacula/BACULA_DB.sql"
}
}
Client {
Name = thor.kmps.local-fd # Имя клиента
Address = thor.kmps.local # Адрес
FDPort = 9102 # Порт на котором клиент сидит
Catalog = MyCatalog # Каталог в MySQL
Password = "SECRET" # пароль для FileDaemon
File Retention = 30 days # 30 дней - период, на протяжении
# которого в каталоге будет храниться
# инфа о файлах этого клиента
Job Retention = 6 months # 6 месяцев - тоже, но про задания
AutoPrune = yes # Удаление истекших заданий/файлов
}
#
# Второй клиент (File Services) для резервного копирования
# Вы должны изменить имя, адрес и пароль, прежде чем использовать
#
#Client {
# Name = thor.kmps.local2-fd
# Address = localhost2
# FDPort = 9102
# Catalog = MyCatalog
# Password = "SECRET" # пароль для FileDaemon 2
# File Retention = 30 days # 30 дней
# Job Retention = 6 months # 6 месяцев
# AutoPrune = yes # Удаление истекших заданий/файлов
#}
# Определение устройства хранения файлов
Storage {
Name = File # Имя. Используется в определениях job
# Не используйте здесь "localhost"
Address = thor.kmps.local # Здесь использовать полное имя
SDPort = 9103 # Порт SD
Password = "SECRET" # Пароль к SD
Device = FileStorage # Устройство. Должно быть определено
# в настройках секции Device сервера хранения
Media Type = File # Файл, диск, лента
}
# Определение DDS ленточного устройство хранения данных
#Storage {
# Name = DDS-4
# Не используйте здесь "localhost"
# Address = localhost # Здесь использовать полное имя
# SDPort = 9103 # Порт SD
# Password = "SECRET" # пароль для Storage daemon
# Device = DDS-4 # должен быть таким же, как Device в Storage daemon
# Media Type = DDS-4 # должен быть таким же, как MediaType в Storage daemon
# Autochanger = yes # включить для авточейнджера устройства
#}
# Определение 8мм устройства хранения ленты
#Storage {
# Name = "8mmDrive"
# Не используйте здесь "localhost"
# Address = localhost
# SDPort = 9103
# Password = "SECRET"
# Device = "Exabyte 8mm"
# MediaType = "8mm"
#}
# Определение DVD накопителя
#Storage {
# Name = "DVD"
# Не используйте здесь "localhost"
# Address = localhost
# SDPort = 9103
# Password = "SECRET"
# Device = "DVD Writer"
# MediaType = "DVD"
#}
# Службы общего каталога
Catalog {
Name = MyCatalog
# Раскомментируйте следующую строку, если вы хотите использовать dbi драйвера
# dbdriver = "dbi:mysql"; dbaddress = 127.0.0.1; dbport =
dbdriver = "dbi:mysql"; dbaddress = 127.0.0.1; dbport = 3306
dbname = "kmps_bacula"; dbuser = "kmps_bacula"; dbpassword = "PASSWORD"
}
# Умеренная доставки сообщения - отправить большинство сообщений на адрес
# электронной почты и консоль
Messages {
Name = Standard
#
# ПРИМЕЧАНИЕ! Если вы отправляете на два почтовых адреса или более
# адресов электронной почты, необходимо будет заменить %r в поле
# (-f части) с одиним действительным адресом электронной почты в
# обоих mailcommand, так и operatorcommand. Что это делает, он
# устанавливает адрес электронной почты, сообщения электронной почты
# будет отображаться в поле «ОТ», который является по умолчанию
# такое же письмо, как они его передали. Однако если вы отправляете
# сообщение на более чем один адрес, то вам придется вручную,
# установить адреса на один адрес. Например, «no-reply@mydomain.com»,
# лучше так, что стремится сказать (большинству) людей, которые
# его получат с автоматизированного источника рассылки сообщений.
mailcommand = "/usr/local/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" /
-s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/local/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" /
-s \"Bacula: Intervention needed for %j\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
#
# ВНИМАНИЕ! Переменная указанная ниже создаст файл, который вам
# нужно будет ротировать newsyslog'ом Однако, он также будет
# держать все ваши сообщения, если они просматриваются
# с консоли.
append = "/var/db/bacula/log" = all, !skipped
catalog = all
}
#
# Доставка сообщений для демона сообщений (не работы).
Messages {
Name = Daemon
mailcommand = "/usr/local/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" /
-s \"Bacula daemon message\" %r"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/db/bacula/log" = all, !skipped
}
# Определение пула по умолчанию
# Pool - отдельное описание для каждого набора томов (лент, DVD, файлов)
# используется при описании задания для указания пула из которого
# должен быть взят том. В каждый пул может входить несколько томов.
Pool { # Пул
Name = Default # Имя пула
Pool Type = Backup # Тип пула
Recycle = yes # Bacula может автоматически рециркулировать тома (Volumes)
AutoPrune = yes # Удалять из каталога записи о файлах и
# заданиях, срок хранения которых истёк в
# соответствии с Volume Retention,
# при поиске доступного на запись тома.
Volume Retention = 365 days # Через один год
}
# Определения пула файлов
Pool { # Пул
Name = File # Имя пула
Pool Type = Backup # Тип пула
Recycle = yes # Bacula может автоматически рециркулировать тома (Volumes)
AutoPrune = yes # Удаление истекших томов (Volumes)
Volume Retention = 365 days # через один год
Maximum Volume Bytes = 50G # Ограничение размера тома
Maximum Volumes = 100 # Ограничить количество томов в пуле
}
# Определения пула Scratch
# Scratch зарезервировано для пула запасных том - при необходимости
# система самостоятельно переводит том из него в требуемый пул
Pool {
Name = Scratch
Pool Type = Backup
}
#
# Ограниченная консоль, используемая в трей мониторе для получения
# статуса директора DIR
#
Console {
Name = thor.kmps.local-mon
Password = "SECRET"
CommandACL = status, .status
}
# Свои конфигурационные файлы
#@/usr/local/etc/client_schedule.conf
@/usr/local/etc/client_thor.conf
@/usr/local/etc/client_srv1.conf
@/usr/local/etc/client_srv2.conf
Как вы заметили, я включил несколько конфигурационных файлов клиентов в конец файла конфигурации DIR, но об этом чуть позже.
Последовательность действий
Что бы эффективно управлять системой резервного копирования, нужно как следует подумать и попрактиковаться, пока не придет понимание как эта система работает. В конфигурационном файле вы должны описать к примеру работу для одного клиента несколькими переменными такими как Job, Storage, Pool, Client, FileSet, Schedule. Каждой переменной присваивается понятное имя и далее в Job указываются необходимые имена переменных чтобы это было законченной задачей и могло работать согласно вашим указаниям. Рабочий клиент состоит из 6ти элементов:
- Job (Работа) — это объект которому присваивают понятное имя и это совокупность вещей и указаний как, кого, что и куда будем резервировать. По его имени эту задачу можно определять, исполнять и вызывать из консоли.
- Client (Клиент) — здесь указывается имя клиента для этой работы, сам клиент и его имя определяется отдельно.
- FileSet (Набор файлов) — указывается набор файлов\директорий и их исключений для этой работы, сам набор файлов и его имя определяется отдельно.
- Schedule (Планировщик) — планировщик для этой работы, в нем описываем периодичность работы и перераспределение ресурсов это когда делать полное копирование когда дифференциальное и тд. Сам планировщик и его имя определяется отдельно и вы можете для удобства завести отдельный конфиг.
- Storage (Хранилище) — Определение устройства хранения файлов для этой работы. В этом хранилище есть секция Device (см по имени) в котором есть указание, где будем хранить резервные копии.
- Pool (Пул) — определяем для работы нужный нам Пул это отдельное описание для каждого набора томов (лент, DVD, файлов)
Примечание: Все переменные вы можете использовать в различных комбинациях указав нужное имя в нужной работе к примеру Schedule с именем Weekly_1st можете использовать в разных работах которым необходимо одинаковое время и периодичность работ.
Свои конфигурационные файлы
Создадим дополнительные конфигурационный файлы для трех серверов и включим их в bacula-dir.conf.
Клиент THOR
# cat client_thor.conf
# Клиент Thor
# Создаем задание thor_backup-job и указываем ресурсы.
Job {
Name = "thor_backup-job" # Имя задания
Type = Backup # Тип (backup, restore и т.д.)
Level = Full # Уровень бэкапа
Client = thor-fd # Имя клиента
FileSet = "thor-fileset" # Набора файлов для сохранения.
Schedule = "Month-1hrs-sun" # Расписание
Storage = backup-disk1 # Файловое хранилище
Messages = Daemon # Поведение уведомлений
Pool = thor-pool # Пул, куда будем писать бэкапы
Priority = 10 # Приоритет. Давая заданиям приоритеты
# от 1 до 10, можно регулировать
# последовательность выполнения.
Write Bootstrap = "/var/db/bacula/thor_backup-job.bsr"
}
# Определяем список резервируемых файлов
FileSet {
Name = "thor-fileset" # Имя списка
Include {
Options {
signature = MD5
}
File = /etc # Указываем каталоги, который будем бэкапить
File = /home/Raven2000
}
Exclude { # Исключим пару каталогов
File = /home/Raven2000/www/tmp
File = /home/Raven2000/www/log
}
}
# Pool - описание набора устройств хранение
# В каждый пул будет входить несколько томов. Регулировать, в какой конкретно
# том бакула будет писать задание нельзя. Я хотел, чтобы каждое задание
# у меня писалось в отдельный файл, поэтому на каждый backup job у меня
# будет отдельный пул.
Pool {
Name = thor-pool # Имя пула
Pool Type = Backup # Тип пула
Recycle = yes # Автоматически менять тома.
AutoPrune = yes # Автоматическое удаление из БД заданий с
# истекшим сроком годности.
Volume Retention = 365 days # Срок, по истечении которого тома будут
# удаляться из пула.
Maximum Volume Bytes = 50G # Ограничение размера тома
Maximum Volumes = 100 # Ограничить количество томов в пуле
Label Format = "thor-" # Шаблон для создания имени тома при
# автоматическом создании метки тома
# требует указания Label Media в
# настройках сервера хранения.
Recycle Oldest Volume = yes # Удаляем старые копии при нехватке места для новых
}
# Определения клиентов
Client {
Name = thor-fd # Имя клиента
Address = thor.kmps.local # адрес
FDPort = 9102 # Порт, на котором клиент нас ждет
Catalog = "MyCatalog" # Каталог в MySQL
Password = "SECRET" # Пароль к клиенту
File Retention = 30 days # Период, на протяжении которого в каталоге
# будет храниться инфа о файлах этого клиента
Job Retention = 3 months # То же, только о заданиях этого клиента
AutoPrune = yes # Удалять из каталога
# данные о файлах и заданиях, срок хранения
# которых истек.
}
# Определения файловых хранилищ.
Storage {
Name = backup-disk1 # Имя хранилища будет использоваться в
# определениях job
Address = thor.kmps.local # Адрес сервера хранения. Настоятельно не
# рекомендуется использовать localhost
SDPort = 9103 # Порт, где file storage нас ждет
Password = "SECRET" # Пароль к нему
Device = backup-disk1 # Устройство. Должно быть определено
# в настройках секции Device сервера хранения
Media Type = File # Файл, диск, лента и т.д.
}
# Планировщик
Schedule {
Name = "Month-1hrs-sun"
Run = Full 1st sun at 1:00
Run = Differential 2nd-5th sun at 1:00
Run = Incremental mon-sat at 1:00
}
Клиент SRV1
# cat client_srv1.conf
# Клиент SRV1
# Создаем задание srv1_backup-job и указываем ресурсы.
Job {
Name = "srv1_backup-job"
Type = Backup
Level = Full
Client = srv1-fd
FileSet = "srv1-fileset"
Schedule = "Month-1hrs-sun-srv1"
Storage = File-SRV1
Messages = Daemon
Pool = srv1-pool
Priority = 10
Write Bootstrap = "/var/db/bacula/srv1_backup-job.bsr"
}
FileSet {
Name = "srv1-fileset"
Enable VSS = YES # Использовать Volume Shadow Copy Service (VSS) для клиента Win32
# VSS позволяет Bacula копировать открытых файлы
Include {
Options {
compression = GZIP # Сжатие производится на стороне клиента пофайлово в один поток
signature = MD5 # Тип сигнатур MD5\SHA1
portable = no # переносимый формат сохраняет не все атрибуты NTFS
noatime = yes # Позволяет читать файлы без изменения времён atime и ctime
checkfilechanges = yes # Выдаётся предупреждение, если размер или время
# модификации файла изменяется при резервном копировании
Ignore Case = yes # Игнор-ть регистр букв при сопост-и шаблонов и рег-х выражений
wildfile = "*.avi" # Шаблон
wildfile = "*.wmv" # Шаблон
wildfile = "*.mp3" # Шаблон
wildfile = "pagefile.sys" # Шаблон
wildfile = "hiberfil.sys" # Шаблон
wilddir = "System Volume Information" # Шаблон
wilddir = "TEMP" # Шаблон
exclude = yes # Подошедшие под шаблоны файлы исключаются из списка
}
File = "D:/Shared_buch" # Что резервируем
File = "E:/Backup/Windows" # Что резервируем
}
}
Pool {
Name = srv1-pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 365 days
Maximum Volume Bytes = 50G
Maximum Volumes = 100
Recycle Oldest Volume = yes # Удаляем старые копии при нехватке места для новых
Label Format = "srv1-" # Шаблон для создания имени тома при
# автоматическом создании метки тома
# требует указания Label Media в
# настройках сервера хранения.
}
Client {
Name = srv1-fd
Address = srv1.kmps.local
FDPort = 9102
Catalog = MyCatalog
Password = "QbTQzNv/823/spZGTu4buOxFuKT/tiBfg+ZlESr3R1lU"
File Retention = 30 days
Job Retention = 6 months
AutoPrune = yes
}
Storage {
Name = File-SRV1
Address = thor.kmps.local
SDPort = 9103
Password = "SECRET"
Device = FileStorage-srv1
Media Type = File
}
Schedule {
Name = "Month-1hrs-sun-srv1"
Run = Full 1st sun at 3:00
Run = Differential 2nd-5th sun at 3:00
Run = Incremental mon-sat at 3:00
}
Клиент SRV2
# cat client_srv2.conf
# Клиент SRV2
# Создаем задание srv2_backup-job и указываем ресурсы.
Job {
Name = "srv2_backup-job"
Type = Backup
Level = Full
Client = srv2-fd
FileSet = "srv2-fileset"
Schedule = "Month-1hrs-sun"
Storage = backup-disk1
Messages = Daemon
Pool = srv2-pool
Priority = 10
Write Bootstrap = "/var/db/bacula/srv2_backup-job.bsr"
}
FileSet {
Name = "srv2-fileset"
Enable VSS = YES
Include {
Options {
compression = GZIP
signature = MD5
portable=no
noatime = yes
checkfilechanges = yes
Ignore Case = yes
wildfile = "*.avi"
wildfile = "*.wmv"
wildfile = "*.mp3"
wildfile = "pagefile.sys"
wildfile = "hiberfil.sys"
wilddir = "System Volume Information"
wilddir = "TEMP"
exclude = yes
}
File = "D:/1SBase"
File = "E:/Backup/Windows"
}
}
Pool {
Name = srv2-pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 365 days
Maximum Volume Bytes = 50G
Maximum Volumes = 100
Recycle Oldest Volume = yes # Удаляем старые копии при нехватке места для новых
Label Format = "srv2-" # Шаблон для создания имени тома при
# автоматическом создании метки тома
# требует указания Label Media в
# настройках сервера хранения.
}
Client {
Name = srv2-fd
Address = srv2.kmps.local
FDPort = 9102
Catalog = MyCatalog
Password = "MkfdcfGqds5qFoSL/W2uBG0DqIvY5bbVDWq/ZuHN39Ct"
File Retention = 30 days
Job Retention = 6 months
AutoPrune = yes
}
Storage {
Name = File-SRV2
Address = thor.kmps.local
SDPort = 9103
Password = "SECRET"
Device = FileStorage-srv2
Media Type = File
}
Schedule {
Name = "Month-1hrs-sun-srv2"
Run = Full 1st sun at 6:00
Run = Differential 2nd-5th sun at 6:00
Run = Incremental mon-sat at 6:00
}
Заметка: привыкайте делать включения в основной конфигурационный файл так будет аккуратней и проще в работе и эксплуатации.
Включим ваши конфиги в конец файла bacula-dir.conf
# cat bacula-dir.conf |grep client
#@/usr/local/etc/client_schedule.conf
@/usr/local/etc/client_thor.conf
@/usr/local/etc/client_srv1.conf
@/usr/local/etc/client_srv2.conf
Протестируем конфигурационный файл
# bacula-dir -t -d /usr/local/etc/bacula-dir.conf
# bacula-dir -t -d /usr/local/etc/client_thor.conf
# bacula-dir -t -d /usr/local/etc/client_srv1.conf
# bacula-dir -t -d /usr/local/etc/client_srv2.conf
Если шибок не выдало значит все в порядке.
Storage Daemon (SD)
# vi bacula-sd.conf
#
# Дефолтный файл конфигурации Bacula Storage Daemon
#
# Для Bacula релиза 5.0.3 (04 августа 2010) — FreeBSD 8.2-RELEASE
#
# Может потребоваться изменить имя вашего накопителя в директиве
# «Archive Device» в устройство ресурсов. Если изменить имя и/или
# «Тип носителя» в ресурсе устройства, убедитесь, что bacula-dir.conf
# имеет соответствующие изменения.
#
Storage { # Определим себя
Name = thor.kmps.local-sd # Имя
SDPort = 9103 # Порт, где ждать директора
WorkingDirectory = "/var/db/bacula"
Pid Directory = "/var/run" # Собственно PID
Maximum Concurrent Jobs = 20 # Дополнительные ограничения
}
#
# Список директоров, которым разрешается связаться с Демоном хранения (SD)
#
Director {
Name = thor.kmps.local-dir # Имя директора
Password = "SECRET" # Пароль
}
#
# Ограниченный директор, используемые в трей мониторе
# для получения статуса демона хранения
#
Director {
Name = thor.kmps.local-mon # Имя директора
Password = "SECRET" # Пароль
Monitor = yes
}
#
# Примечание, список дополнительных шаблонов устройств смотрите в
# каталоге <bacula-source>/examples/devices
# Или перейдите по следующей ссылке:
# _http://bacula.svn.sourceforge.net/viewvc/bacula/trunk/bacula/examples/devices/
#
#
# Устройства записи, поддерживаемые данным Демоном хранения (SD)
# это жесткий диск, ленточный накопитель, dvd.
# Для подключения, устройства к директору в bacula-dir.conf
# должны иметь то же Name и MediaType.
#
Device {
Name = FileStorage # Имя
Media Type = File # Укажем, что будем бекапить
Archive Device = /tmp # Каталог для бекапов
LabelMedia = yes; # разрешить Bacula размечать тома
Random Access = Yes;
AutomaticMount = yes; # когда устройство открыто, читать его
RemovableMedia = no;
AlwaysOpen = no;
}
#
# Авточенджер с двумя дисками
#
#Autochanger {
# Name = Autochanger
# Device = Drive-1
# Device = Drive-2
# Changer Command = "/usr/local/share/bacula/mtx-changer %c %o %S %a %d"
# Changer Device = /dev/sg0
#}
#Device {
# Name = Drive-1 #
# Drive Index = 0
# Media Type = DLT-8000
# Archive Device = /dev/nst0
# AutomaticMount = yes; # когда устройство открыто, читать его
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# AutoChanger = yes
# #
# # Включить команду Alert, только если у вас есть MTX пакет загрузки
# # Обратите внимание, по-видимому, в некоторых системах, tapeinfo
# # сбрасывает контроллер SCSI. Tаким образом если вы включаете это,
# # убедитесь, что он не сбрасывает ваш контроллер SCSI. У меня
# # никогда не было каких-либо проблем, и smartctl, по-видимому,
# # не вызывают таких проблем.
# #
# Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
# Если у вас есть smartctl, то он имеет больше информации, чем tapeinfo
# Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#Device {
# Name = Drive-2 #
# Drive Index = 1
# Media Type = DLT-8000
# Archive Device = /dev/nst1
# AutomaticMount = yes; # когда устройство открыто, читать его
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# AutoChanger = yes
# # Включить команду оповещения, только если у вас есть MTX пакет загрузки
# Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
# Если у вас есть smartctl, то он имеет больше информации, чем tapeinfo
# Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# Linux или Solaris LTO-2 ленточный накопитель
#
#Device {
# Name = LTO-2
# Media Type = LTO-2
# Archive Device = /dev/nrsa0
# AutomaticMount = yes; # когда устройство открыто, читать его
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# Maximum File Size = 3GB
## Changer Command = "/usr/local/share/bacula/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
# # Включить команду оповещения, только если у вас есть MTX пакет загрузки
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## Если у вас есть smartctl, то он имеет больше информации, чем tapeinfo
## Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# Linux или Solaris LTO-3 ленточный накопитель
#
#Device {
# Name = LTO-3
# Media Type = LTO-3
# Archive Device = /dev/nrsa0
# AutomaticMount = yes; # когда устройство открыто, читать его
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# Maximum File Size = 4GB
## Changer Command = "/usr/local/share/bacula/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
# # Включить команду оповещения, только если у вас есть MTX пакет загрузки
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## Если у вас есть smartctl, то он имеет больше информации, чем tapeinfo
## Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# Linux или Solaris LTO-4 ленточный накопитель
#
#Device {
# Name = LTO-4
# Media Type = LTO-4
# Archive Device = /dev/nrsa0
# AutomaticMount = yes; # когда устройство открыто, читать его
# AlwaysOpen = yes;
# RemovableMedia = yes;
# RandomAccess = no;
# Maximum File Size = 5GB
## Changer Command = "/usr/local/share/bacula/mtx-changer %c %o %S %a %d"
## Changer Device = /dev/sg0
## AutoChanger = yes
# # Включить команду оповещения, только если у вас есть MTX пакет загрузки
## Alert Command = "sh -c 'tapeinfo -f %c |grep TapeAlert|cat'"
## Если у вас есть smartctl, то он имеет больше информации, чем tapeinfo
## Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# FreeBSD ленточный накопитель
#
#Device {
# Name = DDS-4
# Description = "DDS-4 for FreeBSD"
# Media Type = DDS-4
# Archive Device = /dev/nsa1
# AutomaticMount = yes; # когда устройство открыто, читать его
# AlwaysOpen = yes
# Offline On Unmount = no
# Hardware End of Medium = no
# BSF at EOM = yes
# Backward Space Record = no
# Fast Forward Space File = no
# TWO EOF = yes
# IIf you have smartctl, enable this, it has more info than tapeinfo
# Alert Command = "sh -c 'smartctl -H -l error %c'"
#}
#
# Передать все сообщения директора, mount сообщения
# также отправляются на адрес электронной почты
#
Messages { # Будем отправлять все сообщения DIR
Name = Standard
director = thor.kmps.local-dir = all
}
Теперь соберем свой конфигурационный файл:
# cat bacula-sd.conf | grep -v ^#
Storage {
Name = thor.kmps.local-sd
SDPort = 9103
WorkingDirectory = "/var/db/bacula"
Pid Directory = "/var/run"
Maximum Concurrent Jobs = 20
}
Director {
Name = thor.kmps.local-dir
Password = "SECRET"
}
Director {
Name = thor.kmps.local-mon
Password = "SECRET"
Monitor = yes
}
Device {
Name = FileStorage
Media Type = File
Archive Device = /home/bacula/backup
#Archive Device = /tmp
LabelMedia = yes;
Random Access = Yes;
AutomaticMount = yes;
RemovableMedia = no;
AlwaysOpen = no;
}
Device {
Name = backup-disk1
Media Type = File
Archive Device = /home/bacula/backup
LabelMedia = yes;
Random Access = Yes;
AutomaticMount = yes;
RemovableMedia = no;
AlwaysOpen = no;
}
Device {
Name = FileStorage-srv1
Media Type = File
Archive Device = /home/bacula/SRV1
LabelMedia = yes;
Random Access = Yes;
AutomaticMount = yes;
RemovableMedia = no;
AlwaysOpen = no;
}
Device {
Name = FileStorage-srv2
Media Type = File
Archive Device = /home/bacula/SRV2
LabelMedia = yes;
Random Access = Yes;
AutomaticMount = yes;
RemovableMedia = no;
AlwaysOpen = no;
}
Messages {
Name = Standard
director = thor.kmps.local-dir = all
}
Протестируем
# bacula-sd -t /usr/local/etc/bacula-sd.conf
Ничего не выдало значит все в порядке.
Console
Настроим консоль
# cd /usr/local/etc
# cp bconsole.conf.sample bconsole.conf
# cat bconsole.conf
#
# Bacula User Agent (or Console) Configuration File
#
Director {
Name = thor.kmps.local-dir
DIRport = 9101
address = localhost
Password = "SECRET"
}
Посмотрим, что она может и отработаем несколько операций:
# /usr/local/sbin/bconsole
Connecting to Director localhost:9101
1000 OK: thor.kmps.local-dir Version: 5.0.3 (04 August 2010)
Enter a period to cancel a command.
*help
Command Description
======= ===========
add Добавить новый том к пулу в каталоге; для
форматирования тома используйте команду label
autodisplay Выдаётся извещение о наличии новых сообщений от директора
automount Лента монтируется автоматически после форматирования
командой label
cancel Отменить задание
create Создать запись Пула в БД из описания ресурса в файле
delete Удалить из каталога информацию о задании, томе
или пуле вместе со всеми зависимостями
disable Запретить автоматическое планирование работы задания
enable Разрешить автоматическое планирование работы задания
estimate Считает приблизительный объём сохраняемых данных до
сжатия, листинг дает полный список
exit Прекращение сессии Bconsole
gui Не интерактивный режим gui
help Печать справки по определенной команде
label Добавить новый том к пулу в БД и форматировать том;
предварительно может потребоваться размонтировать ленту;
если лента уже отформатирована, то требуется выполнить
команды purge и relabel
list Список объектов из каталога БД
llist Полный или длинный список, как список команд
messages вывести накопившиеся сообщения от директора
memory Вывести текущее использование памяти DIR
mount Монтировать хранилище
prune Удалить из БД информацию о файлах, заданиях или томах с
истёкшим сроком хранения и всё с нею связанное
purge Очистка записей из каталога о файлах, заданиях или томах
с истёкшим сроком хранения и всё с нею связанное
python Команда управления Python
quit Прекращение сессии Bconsole
query Запрос каталога
restore Восстановить файлы
relabel Заново отформатировать старый том (должен быть в
состоянии Purged или Recycle)
release перемотать ленту (перед следующим использованием
заново прочесть метку)
reload Перечитать заново конфигурационный файл bacula-dir.conf
run Запустить задание\работу
status Отчет о состоянии
setdebug Устанавить уровень отладки
setip Установить новый адрес клиента - если рзрешено
show Показать текущее значение ресурсов файла настройки
sqlquery Использование SQL для запроса каталога
time Показать текущее временя
trace Включение / выключение трассировки в файл
unmount Размонтирование хранилища
umount Размонтировать - для старых Unix парней, см. unmount =)
update Обновить информацию томов, пула или статистики
use Использовать каталог xxx
var Подстановка переменных
version Показать версию DIR
wait Ждать завершения задания
В режиме ввода команд, введите точку что бы отменить командный режим
Вам сообщение.
Работа с Томами
Добавим новый том и отформатируем его (это при условии что вы не выставили в Pool, Label Format = «ИМЯ_ТОМА» при этом том автоматически форматируется и добавляется). Для этого выберем нужный SD (backup-disk1) укажем название Тома (как он будет сохраняться на HDD) и выберем нужный Пул.
# bconsole
Connecting to Director localhost:9101
1000 OK: thor.kmps.local-dir Version: 5.0.3 (04 August 2010)
Enter a period to cancel a command.
*label
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
The defined Storage resources are:
1: File
2: backup-disk1
3: File-SRV1
4: File-SRV2
Select Storage resource (1-4): 3
Enter new Volume name: srv1_volume
Defined Pools:
1: Default
2: Scratch
3: thor-pool
4: File
5: srv2-pool
6: srv1-pool
Select the Pool (1-6