Когда серверов становится больше десятка, самодельные скрипты с rsync перестают отвечать на главные вопросы: что именно скопировано, где лежит копия и получится ли восстановить данные через полгода. Bacula решает это через единый каталог заданий и централизованное расписание. Директор знает обо всех клиентах, хранилище пишет данные на диск или ленту, а в базе остаётся история каждого файла. Разберём рабочую схему для парка серверов.
Из чего состоит Bacula
Система делится на четыре роли. Director (bacula-dir) — мозг: хранит расписание, запускает задания, общается с каталогом. Storage Daemon (bacula-sd) пишет тома на диск или ленту. File Daemon (bacula-fd) ставится на каждый защищаемый сервер и читает файлы. Каталог — обычная база PostgreSQL или MySQL с таблицами File, Job, Client и Volume.
Порты по умолчанию распределены следующим образом: 9101 у директора, 9102 у клиента, 9103 у хранилища. Открывайте их только между своими узлами, консоль подключайте через SSH-туннель.
Установка и каталог
В Debian пакеты разделены по роли: директор с PostgreSQL тянет зависимости сам, debconf спрашивает параметры базы.
sudo apt install bacula-director-pgsql bacula-sd bacula-fd bacula-console
sudo systemctl enable --now bacula-director bacula-sd bacula-fd
sudo -u postgres psql -c '\l' | grep bacula
В RHEL-семействе имена другие: bacula-director, bacula-storage, bacula-client. Если база уже существует, схему создают скриптом make_bacula_tables из каталога scripts.
Конфигурация директора
Файл /etc/bacula/bacula-dir.conf читается сверху вниз, ресурсы ссылаются по имени. Минимальный набор — каталог, хранилище, пул, расписание, клиент и задание.
Director {
Name = dir01
DIRport = 9101
QueryFile = "/etc/bacula/scripts/query.sql"
Password = "dir-secret"
}
Catalog {
Name = MyCatalog
dbname = "bacula_catalog"
user = "bacula"
password = "db-secret"
}
Storage {
Name = disk01
Address = 10.0.0.5
SDPort = 9103
Password = "sd-secret"
Device = FileStorage
MediaType = File
}
Pool {
Name = Daily
PoolType = Backup
Recycle = yes
AutoPrune = yes
VolumeRetention = 14 days
MaximumVolumeBytes = 20G
LabelFormat = "daily-"
}
Schedule {
Name = Weekly
Run = Full 1st sun at 02:05
Run = Differential 2nd-5th sun at 02:05
Run = Incremental mon-sat at 02:05
}
JobDefs {
Name = DefaultJob
Type = Backup
Level = Incremental
Storage = disk01
Pool = Daily
Schedule = Weekly
Messages = Standard
Priority = 10
}
Client {
Name = web01-fd
Address = 10.0.0.21
FDPort = 9102
Catalog = MyCatalog
Password = "fd-secret"
}
FileSet {
Name = web01-fs
Include {
Options {
Signature = SHA256
Compression = GZIP
}
File = /etc
File = /var/www
}
}
Job {
Name = web01
JobDefs = DefaultJob
Client = web01-fd
FileSet = web01-fs
}
Messages {
Name = Standard
mailcommand = "/usr/sbin/bsmtp -h localhost -f bacula -s \"Bacula %t %e\" root"
mail = 25
operator = 25
console = all
append = "/var/log/bacula/director.log" = all
}
Три отдельных пароля — директор-хранилище, директор-клиент и база — не обязаны совпадать, но пара «директор — клиент» должна быть одинаковой с обеих сторон.
Клиент: File Daemon
На защищаемом сервере нужен только bacula-fd. Ресурс Director перечисляет, кому разрешено управлять.
Director {
Name = dir01
Password = "fd-secret"
}
FileDaemon {
Name = web01-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
PidDirectory = /run/bacula
Maximum Concurrent Jobs = 5
}
Messages {
Name = Standard
director = dir01 = all
}
После правки: systemctl restart bacula-fd. Пароль читается при старте, без перезапуска не заработает. Отдельно проверьте права на каталоги /var/log/bacula и /srv/bacula: службы должны постоянно писать журнал и резервные тома.
Первый запуск и проверка
Флаг -t (test) проверяет конфигурацию: директор разбирает файл и завершается, ничего не запуская. Дальше работа идёт через консоль bconsole.
sudo bacula-dir -t -c /etc/bacula/bacula-dir.conf
sudo bconsole
*status director
*status client=web01-fd
*run job=web01 yes
*list jobs
Первый полный бэкап сделайте вручную и посмотрите журнал.
Политика хранения и ротация томов
Срок жизни задаётся на трёх уровнях: File Retention удаляет записи о файлах, Job Retention — задания, Volume Retention — тома. Для дискового пула включают Recycle и Truncate On Purge, иначе освободившееся место не вернётся файловой системе.
Pool {
Name = Daily
PoolType = Backup
Recycle = yes
AutoPrune = yes
VolumeRetention = 14 days
MaximumVolumeBytes = 20G
RecycleOldestVolume = yes
}
Device {
Name = FileStorage
MediaType = File
ArchiveDevice = /srv/bacula/volumes
LabelMedia = yes
RandomAccess = yes
AutomaticMount = yes
RemovableMedia = no
AlwaysOpen = no
MaximumConcurrentJobs = 2
}
Если том не переиспользуется, задания начнут завершаться с ошибкой «no more volumes». Контролируйте свободное место и заведите отдельный пул для ежемесячных копий.
Восстановление
Восстановление — единственная проверка, которая что-то доказывает. В bconsole команда restore открывает дерево каталога, где файлы отмечают через mark, затем подтверждают выбор и меняют место назначения.
*restore client=web01-fd
*cd /var/www
*mark *
*done
*mod
*where = /srv/restore
*yes
Если каталог потерян, тома читают напрямую: bls показывает содержимое без базы, bscan добавляет записи обратно. Оба обращаются к тому же Storage Daemon, поэтому его конфигурация и пароль должны оставаться целыми.
Диагностика
Проблемы видны по трём командам: status director показывает очередь и ошибки заданий, status storage — состояние устройства и томов, messages — журнал с кодами. Перед разбором журнала проверьте свободное место в ArchiveDevice: переполненный пул даёт каскад ошибок, похожих на сбой клиента. df -h по каталогу хранилища занимает секунду.
- Задание висит в running — проверьте связь до клиента и лимит Maximum Concurrent Jobs.
- Volume not found — том не отмечен или лежит вне каталога ArchiveDevice.
- Catalog backup failed — не настроен Run Before Job с make_catalog_backup.pl.
- Permission denied — служба клиента не читает каталог или не входит в нужную группу.
Каталог тоже резервируют: Run Before Job вызывает make_catalog_backup.pl, и дамп уезжает в тот же пул. Без этого восстановление превратится в ручной разбор томов.
Итог
Bacula требует дисциплины: единые пароли, понятные имена клиентов, описанные пулы и проверенное восстановление. Зато парк получает одну точку управления и предсказуемую ротацию. Начните с трёх клиентов и прогоните восстановление в тестовый каталог. Проверяйте его на отдельном стенде, а не в рабочем каталоге.