Разбираемся с томами Bacula/Bareos

Много лет подряд схема именования томов в Bacula/Bareos приводила меня в полное недоумение. Я не мог понять почему свежеустановленная система резервного копирования создаёт тома в строгом соответствии с настройками прописанными в секция pool, а через какое-то время “слетает с катушек” и начинает записывать данные в старые файлы. Оказалось причина в в том, что Bacula изначально была заточена под ленточные накопители. Агалогично она поступает и с дисками: тома на дисках воспринимаются как ленты. Следствие этой особенности в том, что если Bacula создала том (файл на жёстком диске) то она НИКОГДА не удаляет его с диска. У каждого пула и задания есть параметр Volume Retention который задаёт время по истечении которого файлы попавшие в этот том бакула считает удалёнными. Если установлена опция AutoPrune = yes то bacula удалит записи из каталога (SQL). А если установлена опция ActionOnPurge = Truncate то урежет размер файла до нуля.

В отчётах которые посылает Bacula при записи в существующий том будет наблюдаться отличие между Job и Volume name(s). Обратите внимание что Volume name(s) определено как множественное, тоесть задание может быть сохранено в несколько томов если их размер оказался недостаточным (задан параметр ограничивающий максимальный размер тома либо физически закончилось место на диске). Второе что будет присутствовать в отчёте это запись “Recycled volume”.

Чего я хочу добиться и для чего мне это нужно.

Когда я работаю с жёсткими дисками, а не лентами мне привычнее и удобнее видеть файлы бэкапов с именами тех клиентов с которых они были сделаны. Поэтому при сохранении бэкапов на диск я хочу добиться того чтобы имя тома совпадало с именем клиента к которому добавлен суффикс на конце с уровнем бэкапа, пулом, текущей датой и временем.
Это позволяет управлять бэкапами в произвольном порядке так как всегда понятно какой файл какие содержит данные. Например, если я проводя тестирование, вручную создал полный бэкап и хочу его сразу удалить. Этот бэкап не затронет другие бэкапы, и создаст новый файл который затем можно будет легко удалить и вычистить записи из каталога.
Если же “заливать” бэкапы в файлы, как на ленты то возникнут сложности при желании оперативно удалить какое либо задание которое находится в середи и тем самым освободить место.
Кроме этого в случае катастрофы с каталогом восстановоление при помощи bextract не представит большого труда, так как все нужные файлы для восстановления будут находиться в одном томе (файле).

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

  • Во-первых запретил повторное использование тома (Recycle).
  • Во-вторых увеличил время хранения всех данных до 1 года (Volume Retention).
  • В-третьих запретил использовать том для разных заданий (Maximum Volume Jobs).
  • В-четвёртых запретил автоматическую очистку каталога и томов (AutoPrune).
Pool {
  Name = Daily
  Pool Type = Backup
  RecyclePool = Daily
  Recycle = no                        # запретить повторное использование томов
  Recycle Oldest Volume = no
  AutoPrune = no                      # не удалять записи автоматически
  Volume Retention = 365 days         # на один год исключаем автоудаление записей из каталога и перезапись тома
  ActionOnPurge = Truncate
  Maximum Volume Jobs = 1             # Использовать том только для одного задания
                                      # после чего он сразу метится как использованный
                                      # и не используется для добавления пока не будет 
                                      # recycled если это разрешено
  Label Format = "${Client}_${Level}_${Pool}.${Year}-${Month:p/2/0/r}-${Day:p/2/0/r}-${Hour:p/2/0/r}-${Minute:p/2/0/r}"
}

После изменения настройки пула в файле конфига нужно перезагрузить директор

service bareos-dir restart
# или
echo -e "reload\n" | bconsole

Записи изменились в конфигурационных файлах и их нужно изменить в базе для уже созданных пулов. Эта команда загрузит из конфига настройки для пула Daily.

echo -e "update pool=Daily\n" | bconsole

Так нужно сделать для каждого пула. Вот скрипт который делает это для всех пулов.

while read POOL ; do echo -e "update pool=\"${POOL}\"" | bconsole; done < <(echo -e "show pools\n" | bconsole | grep 'Name' | sed -e 's/"//g;s/\t\+/ /g;s/Name *= *//g;s/^ *//g;s/ *$//g;/^$/d')

Мы произвели изменение настройки системы. Но это возымеет действие только на вновь создаваемые тома. И чтобы распространить настройки на уже созданные тома нужно выполнить команду обновления уже имеющихся в каталоге записей в таблице Media.

echo -e "update volume=${VOLUME} recycle=no" | bconsole

Так как таких записей много, нужно будет изменить все. И для этого лучше написать скрипт.

А когда место на диске заканчивается я запускаю скрипт удаления старых томов и связанных с ними записей в каталоге