Когда серверов становится больше десятка, самодельные скрипты с 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 требует дисциплины: единые пароли, понятные имена клиентов, описанные пулы и проверенное восстановление. Зато парк получает одну точку управления и предсказуемую ротацию. Начните с трёх клиентов и прогоните восстановление в тестовый каталог. Проверяйте его на отдельном стенде, а не в рабочем каталоге.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте