Thank you for reading this post, don't forget to subscribe!
Bacula - это система резервного копирования корпоративного уровня. Она имеет клиент-серверную архитектуру и состоит из таких компонентов:
- Bacula Director (сервис bacula-dir) - основной сервис, который управляет всеми другими процессами по резервному копированию и восстановлению;
- Bacula Storage (сервис bacula-sd) - хранилище, предназначенное для сохранения резервных копий на диске;
- Bacula File Daemon (сервис bacula-fd) - клиентская часть сервиса, которая нужна для доступа к файлам на сервере, с которого будет выполнятся резервное копирование.
Все компоненты могут быть установлены как на одном сервере, так и на разных, но каждый из них должен иметь возможность обратится к другому по сети. Для управления всем этим используется утилита командной строки bconsole. Для неё существует как консольный так и веб-интерфейс, но основной способ управления - командная строка.
УСТАНОВКА И НАСТРОЙКА BACULA
ШАГ 1. УСТАНОВКА BACULA НА СЕРВЕР
Для версии сервера можно устанавливать полностью группу пакетов bacula. В Ubuntu по умолчанию будут установлены также такие пакеты, как PostgreSQL и Postfix. Команда установки будет выглядеть вот так:
sudo apt install bacula
Для работы Bacula нужна какая-нибудь база данных поэтому без Postgresql обойтись не получится, но Postfix можно не ставить, для этого просто допишите в команде установки postfix-. Например:
sudo apt install bacula postfix-
В процессе установки программа предложит настроить базу данных для Bacula. Лучше сделать это сейчас чтобы потом не делать вручную. Поэтому выберите Yes в следующем окне:
Поскольку база данных находится на том же сервере, что и Bacula достаточно выбрать localhost:
Далее введите пароль от будущей базы данных:
Установщик автоматически создаст базу данных, пользователя, а также пропишет их в конфигурационный файл Bacula. После завершения установки можно переходить к настройке программы.
ШАГ 2. НАСТРОЙКА BACULA STORAGE
Давайте первым делом настроем хранилище для Bacula. Конфигурация хранилища находится в файле /etc/bacula/bacula-sd.conf. В конфигурационном файле есть несколько секций:
- Storage - секция, с основными настройками хранилища, здесь настраивается имя хранилища, а также IP адрес на котором оно будет доступно, для локальной сети пока достаточно 127.0.0.1.
- Director - настраивается авторизация для управляющего сервиса, тут надо прописать имя сервиса, который может подключится и пароль, который он должен использовать.
- Device - здесь настраивается способ хранения файлов на физическом диске и путь к папке, где они будут хранится.
- Messages - отправка сообщений, можно оставить как есть.
Каждая секция имеет такой синтаксис:
имя_секции {
параметр = значение
}
Пробелы игнорируются интерпретатором, а регистр имен параметров не имеет значения. Секций с одним именем может быть несколько. Давайте теперь рассмотрим содержимое каждой секции, которая нам нужна подробнее. Старый конфигурационный файл можете переместить в _back, а для этой конфигурации создать новый:
sudo mv /etc/bacula/bacula-sd.conf{,_back}
sudo vi /etc/bacula/bacula-sd.conf
Удалять оригинальный файл не стоит, потому что может в будущем изменятся какие-либо пути и вам надо будет сверится с этим файлом. Сначала секция Storage:
1 2 3 4 5 6 7 8 9 |
Storage { Name = eizenhorn-sd #имя хранилища, hostname+sd SDPort = 9103 #порт на котором оно доступно WorkingDirectory = "/var/lib/bacula" Pid Directory = "/run/bacula" Plugin Directory = "/usr/lib/bacula" Maximum Concurrent Jobs = 20 SDAddress = 127.0.0.1 #IP адрес на котором будет ожидать соединений хранилище } |
Дальше секция Director:
1 2 3 4 |
Director { Name = eizenhorn-dir #director сервис будет называться hostname+dir Password = "очень сложный пароль" } |
Секция Device:
1 2 3 4 5 6 7 8 9 10 11 |
Device { Name = Local-Device #имя устройства Media Type = File #устройство является файлом Archive Device = /backup #путь в файловой системе где хранятся резервные копии LabelMedia = yes; Random Access = Yes; #поддерживает произвольный доступ AutomaticMount = yes; RemovableMedia = no; #не съемный накопитель AlwaysOpen = no; #открывать накопитель только при необходимости Maximum Concurrent Jobs = 5 #максимальное количество одновременно работающих задач } |
Некоторые опции довольно странные. Это потому что изначально программа использовала не жесткие диски, а накопители на магнитной ленте для хранения данных. Последняя секция Messages. Всё остается как было в оригинальном файле:
1 2 3 4 |
Messages { Name = Standard director = eizenhorn-dir = all } |
После завершения редактирования конфигурационного файла необходимо проверить его на ошибки. Для этого используйте такую команду:
sudo /usr/sbin/bacula-dir -t -c /etc/bacula/bacula-sd.conf
Если программа не вывела в консоль вообще ничего можно двигаться дальше. Перезапустите сервис чтобы применить изменения:
sudo systemctl restart bacula
ШАГ 3. НАСТРОЙКА ЛОКАЛЬНОГО КЛИЕНТА BACULA FILE DAEMON
Эта служба используется для доступа к файлам на сервере. Она должна быть запущена на машинах, с которых вы хотите делать резервные копии. Конфигурация стандартная, для локальной машины вы можете оставить то, что там есть по умолчанию. Рассмотрим основные секции:
sudo vi /etc/bacula/bacula-fd.conf
1 2 3 4 |
Director { Name = eizenhorn-dir #имя директора, который может сюда подключаться hostname+dir Password = "очень сложный пароль" } |
Дальше идет секция с основными настройками File Daemon:
1 2 3 4 5 6 7 8 9 |
FileDaemon { Name = eizenhorn-fd # название, используется при подключении, hostname+fd FDport = 9102 # порт, на котором программа ожидает подключения WorkingDirectory = /var/lib/bacula Pid Directory = /run/bacula Maximum Concurrent Jobs = 20 Plugin Directory = /usr/lib/bacula FDAddress = 127.0.0.1 # IP адрес на котором программа ожидает подключений } |
Ну и стандартная секция для отправки сообщений в Director:
1 2 3 4 |
Messages { Name = Standard director = eizenhorn-dir = all, !skipped, !restored } |
Если что-то меняли, не забудьте проверить конфигурацию на ошибки и перезапустить сервис bacula-fd.
ШАГ 3. НАСТРОЙКА BACULA DIRECTOR
Конфигурационный файл Bacula Director находится по такому пути /etc/bacula/bacula-director.conf. Здесь тоже всё разбито на секции. Вы можете поступить аналогично настройке Storage. Переименовать его и добавлять секции в пустой файл. Давайте рассмотрим основные секции. Главная секция, описывающая сам сервис управления называется Director:
1 2 3 4 5 6 7 8 9 10 11 |
Director { Name = eizenhorn-dir #имя сервиса hostname+dir DIRport = 9101 #порт, на котором ожидает соединений сервис QueryFile = "/etc/bacula/scripts/query.sql" #файл с запросами SQL WorkingDirectory = "/var/lib/bacula" PidDirectory = "/run/bacula" Maximum Concurrent Jobs = 20 #максимальное количество одновременно выполняемых задач Password = "очень сложный пароль" #используется для подключения к сервису из консоли Messages = Daemon DirAddress = 127.0.0.1 } |
Следующая секция не обязательная, но она есть в конфигурационном файле Bacula - JobDefs. Эта секция содержит значения по умолчанию, которые потом можно будет использовать при создании задач (Job):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
JobDefs { Name = "DefaultJob" #имя Type = Backup #тип задачи - резервное копирование (Backup) или восстановление (Restore) Level = Incremental - #тип резервного копирования Client = eizenhorn-fd - #имя клиента, который используется для доступа к файлам FileSet = "Catalog" - #имя набора файлов Schedule = "LocalDaily" #имя расписания Storage = eizenhorn-sd #имя хранилища Messages = Standard Pool = File #имя пула SpoolAttributes = yes Priority = 10 Write Bootstrap = "/var/lib/bacula/%c.bsr" - куда записывать файл с метаданными. } |
Файл с метаданными в формате bsr содержит информацию в ASCII о том, где и какие файлы находятся. Она необходима для того чтобы потом можно было восстановить из резервной копии отдельные файлы без восстановления всего что было сохранено. Дальше идёт секция с именем Catalog, в которой описывается способ подключения к базе данных Postgresql, которая была создана и настроена во время установки. Если всё сделано правильно, то в оригинальном конфигурационном файле уже есть верные данные:
1 2 3 4 |
Catalog { Name = MyCatalog dbname = "bacula"; DB Address = "localhost"; dbuser = "bacula"; dbpassword = "пароль" } |
Ещё тут есть секция Messages с именем Standart и секция Console. В них ничего менять не надо, просто скопируйте их из оригинального конфигурационного файла.
ШАГ 4. РЕЗЕРВНОЕ КОПИРОВАНИЕ ЛОКАЛЬНОЙ ПАПКИ
Теперь у вас есть полностью настроенное хранилище, eizenhorn-sd и файловый демон eizenhorn-fd. Можно приступать к настройке резервного копирования локальной папки. Для этого в конфигурационный файл директора надо добавить несколько секций. Давайте сначала добавим пул, где будут хранится данные. Фактически, эта секция описывает набор томов (Volume), а фактически файлов в файловой системе с одинаковым префиксом, в которые будут записываться резервные копии. Это полезно, например, если вы хотите хранить резервные копии каждой машины в отдельном файле:
sudo vi /etc/bacula/bacula-dir.conf
1 2 3 4 5 6 7 8 9 10 |
Pool { Name = LocalPool #имя пула Pool Type = Backup #тип пула, на данный момент доступно только это значение Recycle = yes # переиспользование не нужных больше томов AutoPrune = yes # включает автоматическое удаление данных, которые больше не нужны Volume Retention = 365 days # сколько надо хранить резервные копии Maximum Volume Bytes = 50G # максимальный размер тома Maximum Volumes = 100 # максимальное количество томов Label Format = "Local-" # метка для файлов тома в файловой системе } |
Пул готов, дальше надо определиться какой клиент мы будем использовать для доступа к файлам. Поскольку это локальная машина, надо использовать ранее настроенный eizenhorn-fd:
1 2 3 4 5 6 7 8 9 10 |
Client { Name = eizenhorn-fd # имя, должно совпадать с именем в настройках клиента Address = localhost # хост на котором ожидает соединений клиент FDPort = 9102 # порт, на котором ожидает соединений клиент Catalog = MyCatalog # каталог для метаданных, который мы создали ранее Password = "пароль" # пароль и настроек клиента File Retention = 60 days # сколько хранить информацию о файлах Job Retention = 6 months # сколько хранить информацию о задачах AutoPrune = yes # Автоматически удалять данные о файлах и задачах по истечении срока } |
Тут надо разобраться с группой параметров удаления данных. Раньше, в настройке пула использовался параметр Volume Retention, в настройке клиента ещё два. Вот их значения:
- Job Retention - период хранения информации о выполненных задачах. Она занимает не много места, поэтому хранить её можно долго. После удаления вы не сможете посмотреть какие задачи когда были выполнены.
- File Retention - период хранения информации о местонахождении файлов. Занимает уже больше места, но позволяет восстановить отдельные файлы из резервной копии. Без него вы сможете восстановить файлы только распаковав резервную копию полностью.
- Volume Retention - отвечает за хранение самих данных резервных копий. После удаления вы уже не сможете получить к ним доступ.
После того как клиент есть осталось понять какие файлы надо поместить в резервную копию, для этого есть секция FileSet:
1 2 3 4 5 6 7 8 9 |
FileSet { Name = "Local-configuration" Include { Options { signature = MD5 } File = /etc } } |
В данном случае интересен только параметр File, который указывает путь к папке, которую надо поместить в резервную копию. В данном случае это папка с конфигурацией системы - /etc.
Теперь надо указать когда запускать резервную копию с помощью секции Scedule:
1 2 3 4 |
Schedule { Name = "LocalDaily" Run = Level=Full daily at 06:00 } |
Имя Name может быть произвольным, вы его будете использовать позже, при составлении задачи, а параметр Run должен указывать когда надо запускать резервную копию, а также может переопределять параметры заданные в задаче (Job). Кроме того можно задать несколько директив Run для того чтобы настроить разные типы резервного копирования.
Переопределяя уровень резервирования (Level) можно указать такие параметры:
- Full - все файлы и каталоги перечисленные в FileSet не зависимо от того изменились они или нет.
- Incremental - только те файлы и каталоги из FileSet, которые изменились с момента последней резервной копии.
Подробно о формате времени можно узнать в официальной документации. В упрощенном варианте можно использовать такой синтаксис:
день at ЧЧ:ММ
Или:
месяц номер_недели день at ЧЧ:ММ
В качестве дня можно использовать daily (каждый день) или sun, mon, the, wed, thu, fri, sat. В качестве номера недели: 1st, 2st, 3st, 4st, 5st. Например, можно записать вот так:
1 2 3 4 5 6 |
Schedule { Name = "LocalWeekCycle" Run = Level=Full sun at 06:00 # в воскресенье в 6:00 Run = Level=Incremental mon-sat at 06:00 # с понедельника по субботу включительно Run = Level=Full monthly 1st sun at 06:00 # в первое воскресенье каждого месяца } |
Дальше осталось объединить всё созданное ранее в задаче (Job):
1 2 3 4 5 6 7 8 9 10 |
Job { Name = "LocalBackup" # имя задачи, будет использоваться для ручного запуска и выводится в логах JobDefs = "DefaultJob" # значения по умолчанию, которые мы определили раньше Enabled = yes # задача активна Level = Full # по умолчанию полная резервная копия FileSet = "Local-configuration" # набор файлов, должно совпадать с FileSet созданным раньше Schedule = "LocalDaily" # расписание запусков, должно совпадать c Schedule созданным раньше Storage = eizenhorn-sd # хранилище, в которое сохраняется резервная копия Pool = "LocalPool" # имя пула, созданного ранее } |
После завершения настройки проверьте конфигурационный файл на ошибки:
sudo /usr/sbin/bacula-dir -t -c /etc/bacula/bacula-dir.conf
И если всё хорошо, перезапустите сервис:
sudo systemctl restart bacula-dir
ШАГ 5. НАСТРОЙКА КОНСОЛИ
Конфигурационный файл консоли находится здесь /etc/bacula/bconsole.conf. В нём есть только одна секция и здесь нужно указать на каком IP адресе ожидает соединений Bacula Director, а также пароль, к нему настроенный в секции Director файла /etc/bacula/bacula-dir.conf. Например:
1 2 3 4 5 6 7 |
Director { Name = eizenhorn-dir #имя директора, должно совпадать с настроенным в директоре DIRport = 9101 # порт address = 127.0.0.1 # IP Password = "очень сложный пароль" } |
Дальше можно переходить к работе с консолью.
ШАГ 5. РЕЗЕРВНОЕ КОПИРОВАНИЕ В КОНСОЛИ
Работать с консолью Bacula довольно непривычно. Но у неё есть свои плюсы. Для запуска консоли выполните такую команду:
sudo bconsole
Вы увидите такое окно, с приглашением ввода в виде звездочки:
Для запуска задачи по резервному копированию выполните команду run. Поскольку сейчас задача одна, вам сразу же будет предложено её выполнить, в дальнейшем надо будет выбрать номер задачи или явно указать её имя команде в параметре команды run. После выполнения задачи она будет просто поставлена в очередь:
Больше ничего выведено не будет. Но результат выполнения задачи никуда не теряется. Он приходит вам в виде сообщений. Вы можете закрыть консоль и снова войти или просто нажать Enter и увидите сообщение о том, что You have messages:
Для того чтобы прочитать сообщения используйте команду messages:
messages
В данном случае будет выведена краткая статистика по задаче, а также результат её выполнения, ОК:
Посмотреть список выполненных задач можно командой list jobs:
Обратите внимание, что у каждой задачи есть свой ID и вы можете с помощью него посмотреть список файлов каждой задачи:
list files jobid=14
ШАГ 6. ВОССТАНОВЛЕНИЕ ДАННЫХ
Для восстановления данных можно создать специальную задачу (Job), а затем воспользоваться командой restore, которая позволяет восстановить нужную резервную копию. Сначала надо добавить нужную задачу в конфигурационный файл /etc/bacula/bacula-dir.conf. Например, для восстановления ранее сделанной резервной копии папки /etc:
1 2 3 4 5 6 7 8 9 10 |
Job { Name = "LocalRestore" # имя задачи Type = Restore # означает, что эта задача используется для восстановления Client= "eizenhorn-fd" # клиент для работы с файлами FileSet="Local-configuration" # набор файлов для восстановления Storage = eizenhorn-sd # хранилище Pool = "File" #пул Messages = Standard Where = /opt/restore # куда восстанавливать } |
Сохраните изменения и перезапустите bacula-dir, затем создайте папку, куда будет выполнятся восстановление:
sudo mkdir /opt/restore
Запустите консоль и выполните команду restore для того чтобы начать восстановление:
sudo bconsole
restore
Дальше вам надо знать задачу по резервному копированию, которую вы хотите восстановить. Узнать её можно несколькими способами:
- 1 - выведет последние 20 выполненных задач;
- 2 - выведет задачи, у которых есть указанные файлы;
- 3 - позволяет ввести вручную ID нужных задач;
- 4 - позволяет выполнить SQL запрос.
Все варианты я рассматривать не буду. Для примера можно воспользоваться первым, и выбрать одну из ранее выполненных задач:
Давайте попробуем восстановить файлы из резервной копии, созданной заданием с ID 15. Для этого нажмите 4 и введите 15:
Здесь нужно перемещаться по виртуальной файловой системе с помощью команд cd и ls, а также отмечать или снимать отметку для файлов которые надо извлечь командами mark и unmark. Когда всё будет готово выполните команду done:
После этого утилита предложит выбрать клиент с помощью которого будет выполнятся восстановление:
А затем утилита покажет общую информацию о будущем восстановлении и вам надо набрать yes для того чтобы продолжать.
После завершения восстановления файлы появятся в папке /opt/restore. Если вы хотите восстановить все файлы из последней резервной копии, то вам не надо делать всё это достаточно выполнить команду run и передать ей имя задачи по восстановлению:
run LocalRestore