UMGUM.COM (лучше) 

Bacula installation ( Установка серверной составляющей Bacula. )

12 ноября 2010  (обновлено 31 января 2015)

OS: Linux Debian Lenny/Squeeze/Wheezy.
Application: Bacula v.2.4/v.5.2.

Инсталлируем компоненты Bacula:

# aptitude install bacula-director-mysql bacula-sd-mysql bacula-console mysql-server

В процессе инсталляции сервера bacula будет предложено конфигурировать подключение к СУБД. Я обычно отказываюсь от таких предложений, рассчитывая впоследствии вручную произвести все необходимые настройки.

Вывод инсталлятора, свидетельствующий о более или менее успешном завершении его работы:

....
Starting Bacula Director: bacula-dir.
....
Starting Bacula Storage daemon: bacula-sd.
....
Starting MySQL database server: mysqld.
....

Каждый сервис в составе Bacula имеет собственный файл настройки, имя которого можно задать при запуске используя ключ "-c". По умолчанию, в директории конфигураций сервисами ищется файл с соответствующим именем, типа: bacula-sd.conf, bacula-fd.conf, bacula-dir.conf, console.conf (bconsole.conf, bgnome-console.conf, bwx-console.conf, bat.conf).


В директории "/etc" появилась папочка "bacula" для конфигурационных файлов. В директории "/etc/init.d" инсталлятор разместил скрипты "bacula-director", "bacula-sd" управления сервисами Bacula.

Образцы конфигурационных файлов можно найти в директориях "/usr/share/bacula-common/defconfig" и "/usr/share/doc/bacula-common/examples". Забираем образцы конфигурационных файлов в директорию "/etc/bacula" (если их там ещё нет) и корректируем их под себя для пробного запуска сервисов Bacula:

# cp /usr/share/bacula-common/defconfig/bacula-dir.conf /etc/bacula/bacula-dir.conf
# cp /usr/share/bacula-common/defconfig/bacula-sd.conf /etc/bacula/bacula-sd.conf
# cp /usr/share/bacula-common/defconfig/bconsole.conf /etc/bacula/bconsole.conf

Для работы Bacula Director необходимо наличие сконфигурированной СУБД для хранения метаданных. В том случае, если мы выбрали себе MySQL - используем скрипт "/usr/share/bacula-director/make_mysql_tables" создания "схемы" СУБД подготовленный разработчиками. Перед использованием чуть дополняем и подкорректируем скрипт для полностью автоматизированной работы считая, что база чиста:

# cat /usr/share/bacula-director/make_mysql_tables

....
db_user="bacula"
db_password="strongPassword"
db_name="bacula"
....
if $bindir/mysql $* -f <<END-OF-DATA
....
CREATE DATABASE IF NOT EXISTS ${db_name};
GRANT alter,create,create temporary tables,delete,drop,index,insert,lock tables,select,update ON ${db_name}.* TO '${db_user}'@'localhost' IDENTIFIED BY '${db_password}';
....
USE ${db_name};
....

Исполняем скрипт создания "схемы" с указанием реквизитов суперпользователя СУБД, от имени которого будут произведены работы:

# /usr/share/bacula-director/make_mysql_tables -h localhost -u root -p

После того, как скрипт отработал, можно проверить, всё ли прошло гладко:

# mysql -h localhost -u bacula -p

#mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| bacula             |
+--------------------+
2 rows in set (0.00 sec)

#mysql> use bacula;
#mysql> show tables;

+------------------+
| Tables_in_bacula |
+------------------+
| BaseFiles        |
| CDImages         |
| Client           |
....

Убедимся в том, что MySQL успешно запущен и слушает назначенный ему порт:

# netstat -apn | grep mysql

tcp  0  0 127.0.0.1:3306  0.0.0.0:*  LISTEN  1768/mysqld

Заведём директорию файлового хранилища Bacula:

# mkdir -p /mnt/storage/bacula
# chown -R bacula:bacula /mnt/storage/bacula/

Заведем директорию для хранения файлов состояния резервных копий на случай отказа "Каталога":

# mkdir -p /mnt/storage/bacula/bsr
# chown -R bacula:bacula /mnt/storage/bacula/bsr

В том случае, если файловое хранилище расположено на файловой системе FUSE, вносим пользователя "bacula" в группу "fuse" (монтируем FUSE с опцией "allow_other"):

# cat /etc/group

....
fuse:x:104:bacula
....

Поработаем с конфигурацией "Storage Daemon", сервиса хранения файлов, так как он запускается первым и до его полной инициализации никакой другой компонент Bacula не будет работать. Почистим его от не применяемых нами типов хранилищ, уточним параметры применяемых:

# cat /etc/bacula/bacula-sd.conf

# Общее описание сервиса "Storage Daemon"

Storage {

  # Произвольное имя блока описания сервиса "Storage Daemon"
  Name = "sd0.backup.local"

  # Прослушиваемый службой адрес (адреса). Указываем полный диапазон для подключения от любого "Директора". Укажем порт, на котором ожидаются подключения "Директоров"
  SDAddress = 0.0.0.0; SDPort = 9103
  WorkingDirectory = "/var/lib/bacula"; Pid Directory = "/var/run/bacula"

  # Укажем максимальное количество одновременных обращений к сервису
  Maximum Concurrent Jobs = 20; Client Connect Wait = 20 minutes;

  # Указываем период посылки поддерживающих соединение пакетов. Необходимо для борьбы со слишком умными маршрутизаторами, которые закрывают соединение по истечению интервала не активности
  Heartbeat Interval = 30 sec;

}

# Список "Директоров" (Directors), которым разрешено использование описываемого сервиса

Director {
  # Имя и пароль для связи "Директора" со "Storage Daemon"
  Name = "dir0.backup.local"; Password = "strongPasswordForStorage"
}

# Список используемых сервисом устройств хранения данных (в нашем случае это просто выделенный каталог файловой системы)
# Для подключения к описываемым устройствам "Директору" необходимо указывать "Name" и "MediaType" из непосредственного описания устройства

Device {

  # Произвольное уникальное имя устройства
  Name = FileStorage

  # Произвольное описание типа устройства (своего рода - дескриптор)
  Media Type = File

  # Путь к устройству или точке файловой системы
  Archive Device = "/mnt/storage/bacula"

  # Разрешение для Bacula производить автоматическую разметку не размеченных устройств
  LabelMedia = yes; Random Access = Yes; AutomaticMount = yes; RemovableMedia = no; AlwaysOpen = no;

}

# Описание блока уведомлений

Messages {
  Name = Standard
  # Указание посылать все уведомления "Директору"
  Director = "dir0.backup.local" = all
}

Проверим корректность конфигурации средствами самого Bacula:

# bacula-sd -c /etc/bacula/bacula-sd.conf -t

Перезапустим "Storage Daemon":

# /etc/init.d/bacula-sd restart

Убедимся в том, что "Storage Daemon" успешно запущен и слушает назначенный ему порт:

# netstat -apn | grep bacula-sd

tcp  0  0 0.0.0.0:9103  0.0.0.0:*  LISTEN  4027/bacula-sd

Перейдем к конфигурационному файлу "Директора", расположим в ней описание общей (серверной) конфигурации:

# cat /etc/bacula/bacula-dir.conf

# Описание общей (серверной) конфигурации: begin

# Описываем "Директора" Bacula

Director {

  # Произвольное уникальное FQDN имя
  Name = "dir0.backup.local"

  # Прослушиваемый службой адрес (адреса). Указываем полный диапазон для подключения от любого клиента
  DirAddress = 0.0.0.0; DIRport = 9101

  # Пароль для подключения консоли управления
  Password = "strongPasswordForDirector"

  QueryFile = "/etc/bacula/scripts/query.sql"; WorkingDirectory = "/var/lib/bacula"; PidDirectory = "/var/run/bacula"

  # Количество одновременно исполняемых заданий
  Maximum Concurrent Jobs = 1;
  FD Connect Timeout = 20 minutes; SD Connect Timeout = 20 minutes

  # Указываем период посылки поддерживающих соединение пакетов. Необходимо для борьбы со слишком умными маршрутизаторами, которые закрывают соединение по истечению интервала не активности (после запуска задачи данные передаются между клиентом и "Storage Daemon" а "Директор" просто ждёт отчёта о результате; так вот, чтобы маршрутизаторы не удаляли информацию о простаивающем соединении из таблицы, например NAT, нужно поддерживать его периодическим посылом heartbeat-пакетов)
  Heartbeat Interval = 30 sec

  # Указание на блок обработки сообщений исходящих от службы (блок описывается далее)
  Messages = Standard

}

# Указываем на используемое файловое хранилище

Storage {

  # Произвольное уникальное имя хранилища
  Name = "sd0.backup.local"

  # Произвольный уникальный FQDN адрес, порт и пароль подключения к хранилищу
  Address = "sd0.backup.local"; SDPort = 9103
  Password = "strongPasswordForStorage"

  # Имя устройства используемого в хранилище
  Device = FileStorage

  # Тип устройства используемого в хранилище
  Media Type = File

  # Количество одновременно исполняемых заданий
  Maximum Concurrent Jobs = 1

}

# Описываем конфигурацию сервера СУБД используемого для хранения "мета-данных"

Catalog {
  Name = "cd0.backup.local"; dbname = "bacula"; dbuser = "bacula";
  dbpassword = "strongPasswordForCatalogDB"
}

# Описание "пула" для служебных нужд (вскользь прочитал о том, что он нужен для поддержки стриммеров)

Pool {
  Name = Scratch
  Pool Type = Backup
}

# Описание недельного расписания с одним полным резервированием во вторник и шестью инкрементальными

Schedule {
  Name = "WeeklyFullDailyInc"
  Run = Full tue at 22:05
  Run = Incremental wed-mon at 22:05
}

# Описание недельного расписания с семью полным резервированиями для особо критичных данных

Schedule {
  Name = "DailyFull"
  Run = Full mon-sun at 22:05
}

# Описание недельного расписания с одним полным резервированиями

Schedule {
  Name = "OnceAWeekFull"
  Run = Full wed at 22:05
}

# Описание блока обработки сообщений сервисов Bacula

Messages {
  Name = Standard
  Console = all, !skipped, !saved
  Append = "/var/lib/bacula/log" = all, !skipped
}

# Описание общей (серверной) конфигурации: end

# Описание общего на все задания блока восстановления из резервных копий данных: begin

Pool {
  Name = "pool-restore"
  Pool Type = Backup
}

Client {
  Name = "client-restore"
  Address = "restore.local"; FDPort = 9102; Password = "noPassword"
  Catalog = "cd0.backup.local"
}

FileSet {
  Name = "file-set-restore"
  Include {
    File = "/tmp"
  }
}

Job {
  Name = "job-restore"
  Type = Restore
  Client = "client-restore"
  FileSet = "file-set-restore"
  Storage = "sd0.backup.local"
  Pool = "pool-restore"
  Messages = Standard
  Where = "/tmp/bacula-restores"
}

# Описание общего на все задания блока восстановления из резервных копий данных: end

В конфигурационном файле выше мы определились с тем, что во вторник будем делать полное резервирование, а в остальные дни - инкрементальное. Тогда, чтобы восстановить данные в воскресенье, нужно будет использовать полную резервную копию за прошедший вторник и, последовательно, наложить на восстановленные данные резервные копии за прошедшие среду, четверг, пятницу и субботу.

Блок "задания на восстановление" описан таким образом, что при прямом исполнении он не отработает. В процессе исполнения задания на восстановление необходимо будет подставить все необходимые для запуска задания данные в режиме модификации. Bacula требует наличие как минимум одного такого блока в конфигурации и мы это сделали; создавать же для каждого задания на резервирование соответствующего блока на восстановление нерационально, так как в действительности, в хорошем доме, сервера не теряют данные часто и восстановление этих данные не приходится ставить на поток.

Bacula поддерживает механизм "включения" в конфигурационные файлы содержимого сторонних файлов. Опрометчиво было бы этим не воспользоваться в схемах с десятками и сотнями объектами резервирования. Включение сторонних ресурсов элементарно: "@/path/file.name.conf". Воспользуемся этим для вынесения конфигураций клиентов в отдельные файлы.

Заведем директорию для хранения файлов конфигураций клиентов Bacula:

# mkdir -p /etc/bacula/clients
# chown -R bacula:bacula /etc/bacula/clients

Создадим конфигурационный файл описания тестового клиента:

# touch /etc/bacula/clients/test.domain.local.conf
# cat /etc/bacula/clients/test.domain.local.conf

# С учётом того, что я хотел бы использовать для каждого задания отдельный "пул", определяем его

Pool {

  # Произвольное уникальное имя "пула" "томов"
  Name = "pool-test.domain.local"

  # Произвольный шаблон-префикс для автоматического маркирования "томов" в "пуле" (без этого параметра не будет работать автоматическая разметка "томов")
  Label Format = "test.domain.local-"
  Pool Type = Backup

  # Разрешаем Bacula повторное использование "томов" с устаревшими записями
  Recycle = yes

  # Разрешаем Bacula удалять устаревшие записи из СУБД по мере их исполнения
  AutoPrune = yes

  # Внесем конкретику в управление файловым пространством
  # Укзываем максимальное количество "томов" в "пуле" (условно, для нашей схемы, количество недель хранения)
  Maximum Volumes = 14

  # Указываем максимальное количество исполненных заданий для "тома" (условно, для нашей схемы, количество копий в неделе)
  Maximum Volume Jobs = 7

  # Указываем срок, после которого Bacula может начать очищать тома от данных (три месяца хранения - срок достаточный для обнаружения проблемы, на мой взгляд)
  Volume Retention = 93 days

}

# Описываем тестового резервируемого клиента

Client {

  # Произвольное уникальное имя описания
  Name = "client-test.domain.local"

  # Произвольный уникальный FQDN адрес клиента
  Address = "test.domain.local"

  # Порт на стороне клиента для подключения к нему
  FDPort = 9102

  # Используемый для хранения "мета-данных" каталог СУБД
  Catalog = "cd0.backup.local"

  # Пароль для подключения к клиенту
  Password = "strongPasswordForClient"

  # Срок хранения в СУБД информации о файлах
  File Retention = 93 days

  # Срок хранения информации о истёкших заданиях
  Job Retention = 93 days

  # Разрешение удалять файлы и задания с истёкшим сроком хранения
  AutoPrune = yes

}

# Определяем резервируемую область для последующего применения в задаче тестового клиента

FileSet {

  # Произвольное уникальное имя области резервирования
  Name = "file-set-test.domain.local"

  Include {
    Options {

      # Указываем способ сверки целостности передаваемых данных
      # signature = MD5
      signature = SHA1

      # Включаем сжатие файлов на стороне клиента
      compression = GZIP

      # Указываем на необходимость рекурсивного резервирования, включая все дочерние каталоги и файлы
      recurse = yes

      # Указываем не изменять время последнего доступа к файлу при его резервном копировании
      noatime = yes

      # Учитывать при резервировании файлы по "жёстким" ссылкам
      hardlinks = yes

    }

    File = "/etc"
    File = "/home"
    File = "/var/www"
  }

  Exclude {
    File = "/.journal"
    File = "/.fsck"
  }

}

Job {

  # Произвольное уникальное имя задания
  Name = "job-backup-test.domain.local"

  # Включаем: yes (или выключаем: no) задание
  Enabled = yes

  # Тип задания
  Type = Backup

  # Запуск полного резервирования если обнаружено некорректное завершение предыдущего резервирования
  Rerun Failed Levels = yes

  # Параметры перезапуска заданий завершившихся с ошибкой
  Reschedule On Error = Yes
  Reschedule Interval = 50 minutes
  Reschedule Times = 10

  # Уровень резервирования (Full/Incremental/Differential, параметр будет перекрыт указанным в блоке "Schedule")
  #  Level = Incremental

  # Произвольное уникальное имя описания клиента
  Client = "client-test.domain.local"

  # Имя описанной ранее области резервирования
  FileSet = "file-set-test.domain.local"

  # Имя блока описания расписания исполнения задания
  Schedule = "WeeklyFullDailyInc"

  Maximum Concurrent Jobs = 1

  # Указываем на файловое хранилище
  Storage = "sd0.backup.local"

  # Указываем на блок описания обработки уведомлений
  Messages = Standard

  # Указываем на "пул" для записи
  Pool = "pool-test.domain.local"

  # Применяем приоритет для задания
  Priority = 10

  # Файл резервного описания задания, с помощью которой данные могут быть восстановлены из резервной копии без наличия подключения к Bacula Catalog
  Write Bootstrap = "/mnt/storage/bacula/bsr/%n.bsr"

}

В конец основного конфигурационного файла добавляем ссылку на описание клиента:

# cat /etc/bacula/bacula-dir.conf

....
@/etc/bacula/clients/test.domain.local.conf
....

Проверим корректность конфигурации средствами самого Bacula:

# bacula-dir -c /etc/bacula/bacula-dir.conf -t

Типичный вывод сообщения об ошибке, если таковая обнаруживается, что-то вроде этого:

01-Jul 11:11 bacula-dir: ERROR TERMINATION at parse_conf.c:483
Config error: Could not find config Resource MyCatalog referenced on line 151 :   Catalog = MyCatalog
            : line 151, col 22 of file /etc/bacula/bacula-dir.conf
  Catalog = MyCatalog

После настройки и устранения всех обнаруженных ошибок пере-запускаем "Директора":

# /etc/init.d/bacula-director restart

Убедимся в том, что сервис успешно запущен и слушает назначенный ему порт:

# netstat -apn | grep bacula-dir

tcp  0  0 0.0.0.0:9101  0.0.0.0:*  LISTEN  4045/bacula-dir

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

# cat /etc/bacula/bconsole.conf

# Укажем на "Директора", к которому необходимо осуществить (и разрешено в соответствующем конфигурационном файле) подключение

Director {

  # Имя "Директора", к которому осуществляется подключение
  Name = "dir0.backup.local"

  # Порт, адрес и пароль подключения
  DIRport = 9101
  address = dir0.backup.local
  # address - localhost
  Password = "stongPasswordForConsole"
}

Подключаемся к "Директору" Bacula с помощью консоли:

# bconsole

Connecting to Director dir0.backup.local:9101
1000 OK: dir0.backup.local
Enter a period to cancel a command.
*
*help
  Command    Description
  =======    ===========
  add        add media to a pool
  autodisplay autodisplay [on|off] -- console messages
  automount  automount [on|off] -- after label
....
*
*status director
dir0.backup.local
Daemon started 01-Jul-10 15:50, 0 Jobs run since started.
Heap: heap=241,664 smbytes=24,011 max_bytes=24,467 bufs=133 max_bufs=140

Scheduled Jobs:
Level        Type    Pri Scheduled        Name               Volume
=============================================================================
Incremental  Backup  10  01-Jul-10 22:05  job-backup-test.domain.local test
....
*
*quit

"Звёздочка" в выводе - символ ожидания ввода в интерпретаторе консоли. Из вывода ясно, что сервер в общем функционирует нормально, есть задание для исполнения и для него создан соответствующий "том".

В общих чертах схема на стороне сервера запущена, остаётся сделать главное - произвести настройку, подключение и тестирование клиентов для резервирования.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )