Попала ко мне задача организовать резервное копирование с GUI и чтобы прям как у больших дядек. Ранее стоял rsnapshot и всё работало чудесно пока объёмы не возросли до сотен гигабайт, сайты и базы данных, сотни тестовых площадок. Увеличился парк серверов и управлять всем этим делом стало трудно. Из всех имеющихся решений мы выбирали опенсорс и остановились на bareos как на самом часто используемом, чтобы в случае чего быстренько загуглить.

Имелось сервер под ОС Centos 7, raid5 12Tb. Начал я с установки и сразу столкнулся с тем, что до меня уже пытался кто то поставить bareos. Дабы не мучатся и переделать с нуля выключил демоны mariadb, bareos-sd, bareos-fd, bareos-dir.

sudo systemctl stop mariadb bareos-dir bareos-sd bareos-fd

И удалил старые конфиги:

sudo systemctl stop mariadb
sudo rm -rf /etc/bareos/*
sudo rm -rf /etc/bareos/.* # при установке создаётся скрытый файл со сгенерированными паролями
mysql -uroot -p -e "DROP DATABASE IF EXISTS 'bareos';"

Если не знаете пароль root:

Сбросить пароль root mysql
sudo systemctl stop mariadb
sudo mysqld_safe --skip-grant-tables &
mysql -uroot -e "UPDATE mysql.user SET Password=PASSWORD('Ваш_новый_пароль') WHERE User='root';"
sudo systemctl restart mariadb


В случае если мы ещё не устанавливали bareos и mariadb.
Добавляем репозиторий bareos:

sudo wget http://download.bareos.org/bareos/release/latest/CentOS_7/bareos.repo -O /etc/yum.repos.d/bareos.repo && sudo sed -i 's/7/\$releasever/g' /etc/yum.repos.d/bareos.repo && sudo sed -i 's/\/1...\//\/latest\//g' /etc/yum.repos.d/bareos.repo 

Устанавливаем пакеты bareos и mariadb:

sudo yum install -y bareos-client bareos-database-tools bareos-filedaemon bareos-database-mysql bareos bareos-bconsole bareos-database-common bareos-storage bareos-director bareos-common mariadb-server
sudo systemctl enable mariadb && sudo systemctl enable bareos-fd && sudo systemctl enable bareos-sd && sudo systemctl enable bareos-dir && sudo systemctl start mariadb
sudo mysql_secure_installation

Создаём базу данных bareos:

/usr/lib/bareos/scripts/create_bareos_database
/usr/lib/bareos/scripts/make_bareos_tables -uroot -p
/usr/lib/bareos/scripts/grant_bareos_privileges -uroot -p

Теперь у нас есть база данных и пользователь bareos. Эти скрипты создают пользователя без пароля, укажем пароль для bareos:

mysql -uroot -e "UPDATE mysql.user SET Password=PASSWORD('Ваш_новый_пароль') WHERE User='bareos';"


Чтож, примитив кончился, теперь в чём был собственно затык. Всегда знал, что linux строится из огромного количества простых кусочков. Понять, как настроить bareos, мне показалось сложным, и вот почему. В многих мануалах в интернете описываются настройки конфигурации для bacula прародителя bareos, а документация написана так, что за 3 секунды не понять, что куда пихать. Многие мануалы имеют ошибки, в одном я вообще не понял, зачем секцию job помещают в демон storage. Скурив всю документацию по bareos и bacula я понял, что если я хочу понять, то придётся на бумажке рисовать каждую секцию и что она делает с полным описанием всех параметров и связей между демонами.

Схема связи с офф. документации
image

Итак, пойдём медленно по кусочкам. Забудем про все демоны и прочие прибулды кроме mariadb и bareos-dir. Весь основной функционал описывается в конфиге bareos-dir.conf, расположенном в каталоге /etc/bareos/. Права на каталог должны быть 770, владелец root группа bareos. Права на файлы в каталоге должны быть 640, владелец root группа bareos, если вы используете вложенные директории — не забывайте, что бит исполнения для каталога позволяет просматривать содержимое каталога, поэтому права вложенных каталогов так же должны быть 770, владелец root группа bareos.

/etc/bareos/bareos-dir.conf
# С решётки начинаются комментарии, обязательные параметры не закомментированы
Director { # начало описании секции сервера
Name = agima-dir # Имя этого сервера
#WorkingDirectory = "$HOME/bareos/bin/working" # Так указывается рабочая директория
#Pid Directory = "$HOME/bareos/bin/working" # Место расположения PID файла
QueryFile = "/usr/lib/bareos/scripts/query.sql" #набор sql запросов для работы с метаданными
#Maximum Concurrent Jobs = 10 # Максимальное количество одновременно запущенных задач
Password = «password» # Пароль для доступа к этому серверу
#Description = «Main Bareos Director» # Описание сервера
Messages = Daemon # указываем имя секции генерации сообщений
#Auditing = yes # записывать действия производимые на сервере(вход, запуск задачи, восстановлени и др.). Этот отдельный параметр отпочковался от параметра Messages.
#FD Connect Timeout = 180 # время сколько ожидать ответ клиента
#SD Connect Timeout = 1800 # время сколько ожидать ответ от сервера хранения
#Maximum Connections = 30 # максимальное количество одновременных подключений к этому серверу
#Maximum Console Connections = 30 # максимальное количество одновременных подключенных консолей к этому серверу

#Dir Address = 1.2.3.4 9101 # доменное имя или айпи адрес, порт должен быть указан через пробел или в отдельном параметре

#Dir Addresses = { # Чтобы указать несколько определённых доменов и/или айпи адресов
# ip = { addr = 1.2.3.4; port = 1205;}
# ipv4 = { addr = 1.2.3.4; port = http;}
# ipv6 = { addr = 201:220:222::2; port = 1205; }
# ip = { addr = server.example.com }
#}

#Dir Port = 9101 # номер порта на котором будет слушать сервер
}
# С символа @ начинаются вставки(include) других файлов
# Если вы хотите вставить несколько файлов из директории вы можете использовать конструкцию ниже
#@|«sh -c ’for f in /etc/bareos/jobs/*.conf; do echo @${f}; done’»
#@/etc/bareos/jobs/1.conf

# В файле указаны не все параметры секции Director, более полный список можно получить на официальном сайте программы bareos.org

Мы описали сервер, теперь мы можем его запустить:

systemctl start bareos-dir

Сервер есть, он работает, но ничего не делает и у него нет места куда бы положить наши бэкапы. За размещение файлов отвечает демон bareos-sd, его конфигурационный файл называется bareos-sd.conf:

/etc/bareos/bareos-sd.conf
Storage { # начало секции описания демона хранения
#Absolute Job Timeout = 20 # полное время ожидания задачи
#Allow Bandwidth Bursting = no # разрешить увеличивать ширину канала
#Client Connect Wait = 1800 #время сколько ожидать ответ консоли
#Collect Device Statistics = no # собирать статистику по устройствам
#Collect Job Statistics = no # собирать статистику по задачам
#Compatible = no # режим совместимости с bacula
Description = «First storage server» # Описание сервера
#FD Connect Timeout = 1800 # время сколько ожидать ответ клиента
#File Device Concurrent Read = no # разрешить одновременное чтение с устройств
#Maximum Bandwidth Per Job = 1 k/s # Максимальная ширина канала на 1 задачу, значения скорости k/s, kb/s, m/s or mb/s.
#Maximum Concurrent Jobs = 20 # Максимальное количество одновременно выполняемых задач
#Maximum Network Bu?er Size = 65536 # размер сетевого буфера в байтах, если низкая скорость попробуйте изменить. Иногда для повышения скорости стоит уменьшить размер буфера.
Messages = Standard # указываем имя секции генерации сообщений
Name = agima-sd # имя этого сервера хранения
#Pid Directory = /var/lib/bareos # Место расположения PID файла
#SD Address = 1.2.3.4 9103 # доменное имя или айпи адрес, порт должен быть указан через пробел или в отдельном параметре

#SD Addresses = { # Чтобы указать несколько определённых доменов и/или айпи адресов
# ip = { addr = 1.2.3.4; port = 1205;}
# ipv4 = { addr = 1.2.3.4; port = http;}
# ipv6 = { addr = 201:220:222::2; port = 1205; }
# ip = { addr = server.example.com }
#}

#SD Connect Timeout = 1800# Максимальное время ожидания соединения
#SD Port= 9103# номер порта на котором будет слушать сервер
#SD Source Address = # специфичный(отдельный) адрес который слушает сервер для связи с клиентом
#Secure Erase Command = string# параметр для указания, какую использовать команду для безвозвратного удаления
#Statistics Collect Interval = 30 # интервал для сбора статистики
#Working Directory = /var/lib # рабочая директория
}

Director { # начало описании секции подключения к этому серверу хранения
Name = agima-dir # указываем имя сервера который может подключаться к нам
Password=«password1» # пароль с которым будут подключатся
Description = «Backup server» # Описание сервера
#Key Encryption Key = password # ключ шифрования обмена данных
#Maximum Bandwidth Per Job = 1 k/s # Максимальная ширина канала на 1 задачу, значения скорости k/s, kb/s, m/s or mb/s.
#Monitor = no # Разрешает полный или ограниченный доступ к серверу. Ограниченный доступ позволяет только просматривать статус сервера.
}

Device { # начало описания места хранения
Always Open = no; # Всегда держать открытым устройство
Archive Device = /opt/backup # Путь сохранения
#Auto De?ate = out # Параметр работает только при включении модуля autox?ate-sd. Значения: in — сжатие потоков при чтении с устройства, out сжатие при записи на устройство, both сжати в обоих случаях.
#Auto De?ate Algorithm = GZIP # GZIP — gzip level 1–9, LZO, LZFAST, LZ4, LZ4HC
#Auto De?ate Level = 6 # уровень сжатия
#Auto In?ate = in # Параметр работает только при включении модуля autox?ate-sd. Значения: in — сжатие потоков при чтении с устройства, out сжатие при записи на устройство, both сжати в обоих случаях.
#Auto Select = yes # Автоматический выбор данного устройства
#Automatic Mount = yes; # автоматически монтировать устройство
#Block Checksum = yes # Включает проверку контрольных сумм CRC32, так же позволяет считывать битые данные
#Check Labels = yes # Включает проверку меток для записей не ANSI формата
#Close On Poll = no # перемонтировать устройство
#Collect Statistics = yes # Собирать статистику
Description = «Primary raid storage» # Описание устройства
#Device Options = string # опции устройства используются для внешних плагинов Ceph и GlusterFS
Device Type = File # Тип устройства: Tape касеты; File флешки, диски, сетевые диски; GFAPI (GlusterFS); Rados (Ceph Object Store); Fifo устройства последоватьльного доступа только для чтения или только для записи.
Label Media = yes; # разрешать серверу устанавливать метку на блоки / accept Bareos set label unlabeled media
Label Type = primary # метка которая будет установленна
Maximum Concurrent Jobs = 4 # максимальное количество одновременных задач
Maximum File Size = 500 Gb # максимальный размер файла
#Maximum Job Spool Size = # Максиамальный объём очереди задачи
#Maximum Network Bu?er Size = 65536 # размер сетевого буфера в байтах, если низкая скорость попробуйте изменить. Иногда для повышения скорости стоит уменьшить размер буфера.
Maximum Open Volumes = 1 # максимальное количество открытых томов
Maximum Open Wait = 15 # максимальное время ожидания устройства
#Maximum Spool Size = # Максиамальный объём очереди задач
Media Type = File # это текстовой параметр где вы можете свободно указать тип устройства какое вам больше всего нравится
#Mount Command = Strname # команда монтирования данного устройства
#Mount Point = Strname # точка монтирования
Name = AgimaStorage # имя этого места хранения
Random Access = yes; # указывает поддержку случайного доступа к данным, кассеты не имеют такой возможности
Removable Media = no; # указываем отключаемое ли устройство
Requires Mount = no # требуется ли монтирование данного устройства
#Spool Directory = directory # Директория для создания временных файлов, по умолчанию рабочий каталог
#Unmount Command = Strname # команда размонтирования
#Volume Capacity = # размер тома
}

Messages {
Name = Standard # название текущего уведомления
Description = «Standard messages file daemon» # описание уведомления
#Mail Command = # команда отправки email, должна быть описана перед параметрами Mail, Mail On Error, Mail On Success
#Mail Command = "/usr/sbin/bsmtp -h mail.example.com -f \"\(Bareos\) \%r\" -s \«Bareos: \%t \%e of \%c \%l\» \%r"

##%% = % символ процента
##%c = Client’s name \ Имя клиента
##%d = Director’s name \ Имя сервера
##%e = Job Exit code (OK, Error, ...) \ Статус завершения
##%h = Client address \ хост клиента
##%i = Job Id \ Идентификатор задачи
##%j = Unique Job name \ Уникально имя задачи
##%l = Job level \ приоритет задачи
##%n = Job name \ Имя задачи
##%r = Recipients \ получатели
##%s = Since time \ # Буду рад если кто то объяснит что же означает этот параметр
##%t = Job type (e.g. Backup, ...) \ Тип задачи
##%v = Read Volume name (Only on director side) \ Прочитано том с именем
##%V = Write Volume name (Only on director side) \ Записан том с именем

#Operator Command = string # должно быть описано до параметра Operator. Аналогично Mail Command, но отправляет оператору

##Типы уведомлений message-type:
##info информационные сообщения
##warning Уведомления
##error ошибки
##fatal ошибки из-за которых задачи останавливаются
##terminate сообщения при отключении сервера
##notsaved файлы не сохранены
##skipped пропущенные файлы, попавшие в исключения или при инкрементальном бэкапе или при других настройках или действиях пользователя
##mount монтирование завершено
##restored список восстановленных файлов
##all все сообщения
##security сообщения info и warning только при попытках подключится
##alert сообщения генерируемые tape alerts
##volmgmt сообщения управления томами
##audit сообщения о выполняемых действиях

#Append = [ address = ] message-type [, message-type ]* # Добавляет сообщение в файл, если файл не существует он будет создан
director = backup-dir = all # отправка сообщения на сервер bareos
#Catalog = # отправка сообщения в базу данных каталога
#Console = # отправка сообщения в консоль
#File = # отправка сообщения в файл, если файл существует он будет перезаписан
#Mail = # отправка сообщения на указанный адрес
#Mail On Error = # email при ошибке
#Mail On Success = # email при успехе
#Operator = # отправить email на указанный адрес оператору
#Stderr = # отправка сообщения в стандартный вывод ошибок
#Stdout = # отправка сообщения на стандартный вывод
#Syslog = # отправка сообщения в Syslog журнал
}

Итак теперь мы настроили сервер хранения, подключим его к нашему серверу, добавляем в конец файла:

/etc/bareos/bareos-dir.conf
Storage {
Address = 127.0.0.1 # адрес к которому подключаемся
Allow Compression = yes # Разрешить ли сжатие
#Auth Type = MD5 # метод авторизации None|Clear|MD5
#Collect Statistics = yes # Собирать ли статистику
Description = «Primary storage» # Описание текущей секции
Device = FirstStorage # используемое устройство, значение равно параметру name секции device
Enabled = yes # включен ли данный сервер хранения
#Maximum Bandwidth Per Job = 1 k/s # Максимальная ширина канала на 1 задачу, значения скорости k/s, kb/s, m/s or mb/s.
#Maximum Concurrent Jobs = 1 # максимальное количество одновременных задач
#Maximum Concurrent Read Jobs = 0 # максимальное количество одновременных задач на чтене
Media Type = File # это текстовой параметр где вы можете в свободной форме указать тип устройства какое вам больше всего нравится
Name = agima-sd # имя данной секции
Password = password1 # пароль для подключения к серверу хранения
#Port = 9103 # порт к которому подключатся
}

Catalog {
DB Address = localhost # сетевой адрес Базы данных
DB Driver = mysql # Выбираем СУБД postgresql | mysql | sqlite
DB Name = bareos # Имя базы данных
DB Password = «123» # Пароль пользователя для СУБД
DB Port = 3306 # Порт на котором работает СУБД
#DB Socket = string # путь до сокета Базы данных, если мы используем сокет
DB User = bareos # Пользователь субд СУБД
Description = «Catalog metadata for bareos» # Описание Секции
Disable Batch Insert = no # Разрешает множественные вставки
#Exit On Fatal = no # закрывать программу при ошибке
#Idle Timeout = 30 # Время ожидания связи с базой
#Inc Connections = 1 # Если закончились свободные соединения, можно добавить сколько указано в этом параметре
#Max Connections = 5 # Максимальное количество соединений
#Min Connections = 1 # Минимальное количество соединений
Name = agima-meta # Имя текущей секции
Reconnect = yes # Переподключаться к базе данных если связь разорвана
#Validate Timeout = 120 # Время проверки, работает ли БД или нет
}


Перезагружаем сервер и запускаем хранение:

sudo systemctl restart bareos-dir
sudo systemctl start bareos-sd

Если между ними нету связи настраиваем firewall.

Теперь у нас есть сервер и место куда складывать бэкапы. Серверы запущены, но бэкапы делать некому. Настроим клиент который будет делать бэкапы. Клиентом является демон bareos-fd, его конфигурационный файл называется bareos-fd.conf и он самый простой:

/etc/bareos/bareos-fd.conf
Client {
#Absolute Job Timeout = 20 # полное время ожидания задачи
#Allow Bandwidth Bursting = yes # разрешить увеличивать ширину канала
#Allowed Job Command = # Типы разрешённых команд для этого клиента: backup создание бэкапов; restore восстановление файлов; verify проверка файлов; estimate проверка разрешённых команд; runscript запуск скриптов
#Allowed Script Dir = # Директории из которых клиенту разрешено запускать скрипты
#Compatible = no # Режим совместимости с bacula
Description = «First client on server example.com» # описание клиента
#FD Address = 1.2.3.4 9102 # доменное имя или айпи адрес, порт должен быть указан через пробел или в отдельном параметре
#FD Addresses = { # Чтобы указать несколько определённых доменов и/или айпи адресов
# ip = { addr = 1.2.3.4; port = 1205;}
# ipv4 = { addr = 1.2.3.4; port = http;}
# ipv6 = { addr = 201:220:222::2; port = 1205; }
# ip = { addr = server.example.com }
#}
#FD Port = 9102 # номер порта на котором будет слушать клиент
#FD Source Address = # специфичный(отдельный) адрес который слушает клиент для связи с сервером хранения
#Maximum Bandwidth Per Job = 1 k/s # Максимальная ширина канала на 1 задачу, значения скорости k/s, kb/s, m/s or mb/s.
#Maximum Concurrent Jobs = 20 # Максимальное количество одновременно выполняемых задач
#Maximum Network Bu?er Size = 65536 # размер сетевого буфера в байтах, если низкая скорость попробуйте изменить. Иногда для повышения скорости стоит уменьшить размер буфера.
Messages = standard # указываем имя секции генерации сообщений
Name = agima-client # Имя данного клиента
#Pid Directory = /var/lib/bareos # Директория хранения PID файла
#Scripts Directory = directory # Директория где хранятся скрипты
#SD Connect Timeout = 1800 # Время ожидания для яподключения к серверу хранения
#Secure Erase Command = string # Команда бзвозвратного удаления
#Working Directory = /var/lib/bareos # Рабочая директория
}

Director {
#Address = 1.2.3.4 # Адрес к которому подключаемся
#Allowed Job Command = # Типы разрешённых команд для сервера: backup создание бэкапов; restore восстановление файлов; verify проверка файлов; estimate проверка разрешённых команд; runscript запуск скриптов
#Allowed Script Dir = "/etc/bareos" # Директории из которых серверу разрешено запускать скрипты
#Allowed Script Dir = "/path/that/is/also/allowed" #
Description = «General backup server» # Описание сервера
#Maximum Bandwidth Per Job = 1 k/s # Максимальная ширина канала на 1 задачу, значения скорости k/s, kb/s, m/s or mb/s.
#Monitor = no # Разрешает полный или ограниченный доступ к серверу. Ограниченный доступ позволяет только просматривать статус сервера.
Name = backup-dir # Имя сервера который может подключаться
Password = Md5password # пароль для подключения к клиенту зашифрованный в md5
}

Messages {
Name = Standard # название текущего уведомления
Description = «Standard messages file daemon» # описание уведомления
#Mail Command = # команда отправки email, должна быть описана перед параметрами Mail, Mail On Error, Mail On Success
#Mail Command = "/usr/sbin/bsmtp -h mail.example.com -f \"\(Bareos\) \%r\" -s \«Bareos: \%t \%e of \%c \%l\» \%r"

##%% = % символ процента
##%c = Client’s name \ Имя клиента
##%d = Director’s name \ Имя сервера
##%e = Job Exit code (OK, Error, ...) \ Статус завершения
##%h = Client address \ хост клиента
##%i = Job Id \ Идентификатор задачи
##%j = Unique Job name \ Уникально имя задачи
##%l = Job level \ приоритет задачи
##%n = Job name \ Имя задачи
##%r = Recipients \ получатели
##%s = Since time \ # Буду рад если кто то объяснит что же означает этот параметр
##%t = Job type (e.g. Backup, ...) \ Тип задачи
##%v = Read Volume name (Only on director side) \ Прочитано том с именем
##%V = Write Volume name (Only on director side) \ Записан том с именем

#Operator Command = string # должно быть описано до параметра Operator. Аналогично Mail Command, но отправляет оператору

##Типы уведомлений message-type:
##info информационные сообщения
##warning Уведомления
##error ошибки
##fatal ошибки из-за которых задачи останавливаются
##terminate сообщения при отключении сервера
##notsaved файлы не сохранены
##skipped пропущенные файлы, попавшие в исключения или при инкрементальном бэкапе или при других настройках или действиях пользователя
##mount монтирование завершено
##restored список восстановленных файлов
##all все сообщения
##security сообщения info и warning только при попытках подключится
##alert сообщения генерируемые tape alerts
##volmgmt сообщения управления томами
##audit сообщения о выполняемых действиях

#Append = [ address = ] message-type [, message-type ]* # Добавляет сообщение в файл, если файл не существует он будет создан
director = backup-dir = all # отправка сообщения на сервер bareos
#Catalog = # отправка сообщения в базу данных каталога
#Console = # отправка сообщения в консоль
#File = # отправка сообщения в файл, если файл существует он будет перезаписан
#Mail = # отправка сообщения на указанный адрес
#Mail On Error = # email при ошибке
#Mail On Success = # email при успехе
#Operator = # отправить email на указанный адрес оператору
#Stderr = # отправка сообщения в стандартный вывод ошибок
#Stdout = # отправка сообщения на стандартный вывод
#Syslog = # отправка сообщения в Syslog журнал
}

Ура мы описали клиента, теперь подключим его к нашему серверу, вставим в конец файла bareos-dir.conf:

/etc/bareos/bareos-dir.conf
Client {
#Allow Client Connect = yes # разрешить входящие соединения от клиента
#Auth Type = MD5 # Тип авторизации None|Clear|MD5
#Auto Prune = no # Автоматический очищать записи из каталога об устаревших задачах
#Catalog = resource-name # каталог используемый для хранения метаданых
#Description = string # описание данного клиента
#Enabled = yes # включен ли данный клиент
#FD Address = string # адрес для подключения к клиенту
#FD Password = password # пароль для соединения с клиентом
#FD Port = 9102 # порт на котором
#File Retention = 5184000 # Длительность хранения истории о файлах в каталоге
#Hard Quota = 0 # Объём данных доступный для ипспользования, при превышении задача отменяется
#Job Retention = 15552000 # Длительность хранения истории о задачах в каталоге
#Maximum Bandwidth Per Job = 1 k/s # Максимальная ширина канала на 1 задачу, значения скорости k/s, kb/s, m/s or mb/s.
#Maximum Concurrent Jobs = 1 # максимальное количество одновременно запущеных задач
#Name = agima-client # уникальное имя клиента к которому подключаемся
#Passive = no # пассивный режим, входящие соединения недоступны
#Quota Include Failed Jobs = yes # Учитывать объём неудачных задач в квотах
#Soft Quota = 0 # Объём данных доступный для ипспользования, при превышении задача не отменяется
}


Запускаем клиент, перезапускаем сервер и как обычно не забываем настраивать firewall.

sudo systemctl restart bareos-dir
sudo systemctl start bareos-fd

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

Развернуть
Pool {
#Action On Purge = Truncate # Обрезать разделы при очистке для уменьшения занятого объёма
Auto Prune = yes # Автоматически удалять устаревшие разделы
Catalog = resource-name # Указываем каталог в котором хранить метаданные
Catalog Files = yes # Записывать имена файлов в каталог
Description = string # Описание пула
#File Retention = time # Как долго сохранять записи о файлах в каталоге
#Job Retention = time # Как долго сохранять записи о задачах в каталоге
Label Format = «backup-» # префикс для файлов бэкапа
#Label Type = ANSI|IBM|Bareos # Тип префикса
#Maximum Blocksize = positive-integer # Максимальный размер блока по умолчанию 63КB
Maximum Volume Bytes = Size64 # Максимальное размер тома(файла резервного архива)
Maximum Volume Files = positive-integer # Максимальное количество задач в одном томе
Maximum Volume Jobs = positive-integer # Максимальное количество задач в одном томе
Maximum Volumes = positive-integer # Максимальное количество томов
Name = agima-pool # Имя данного пула
Pool Type = Strname # Тип пула Backup, *Archive, *Cloned, *Migration, *Copy, *Save
Purge Oldest Volume = yes # Удалять устаревшие тома
Recycle = yes # Если недостаточно места, искать устаревшие файлы и тома и очищать их
Recycle Current Volume = yes # Очищать текущий том
Recycle Oldest Volume = yes # Очищать устаревшие тома
Recycle Pool = resource-name # Очищать пул, повзоляет автоматически перемещать в другой пул бэкапы
Scratch Pool = resource-name # имя Scratch зарезервировано для пула запасных томов — при необходимости система самостоятельно переводит том из него в требуемый пул
Storage = ResourceList # Используемый серверы хранения
Use Catalog = yes # Сохранять метаданые в БД
Volume Retention = 31536000 # Как долго сохранять записи о томах в каталоге
Volume Use Duration = 7 days # Как долго том доступен для записи
}

FileSet { # правило набора файлов
Description = string # Описание текущих правил
#Enable VSS = yes # Включает теневое копирование тома для Windows
Name = agima-site# уникальное название данного правила
# Exclude { # указываем какие файлы мы исключаем
# Options {
# AutoExclude = yes # Используется для Windows. Проверят по реестру исключённые файлы.
# fstype=ext2 # Доступные файловые системы для полного копирования дискового тома. ext2, jfs, ntfs, proc, reiserfs, xfs, usbdevfs, sysfs, smbfs, iso9660
# sparse=yes # в raw файлах исключать нули если их 32К в блоке подряд
# onefs=yes # Использовать только 1 файловую систему
# signature=MD5 # SHA1 алгоритм для проверки изменений.
# recurse=yes # рекурсивный проход по директориям
# noatime=yes # не изменять время доступа к файлу
# mtimeonly=yes # Для инкрементального и диффиринциального копирования проверять только st_mtime. В выключенном состоянии проверяет ещё и st_ctime.
# keepatime=yes # не изменять время доступа
# check?lechanges=yes # проверять изменения файлов
# aclsupport=yes # Поддержка расширенного списка доступа для линукс
# xattrsupport=yes # Поддержка дополнительных атрибутов файла
# ignore case=yes # Не учитывать регистр
# DriveType=Windows-drive-type # Используемый тип диска для Windows: removable, ?xed, remote, cdrom, ramdisk
# hfsplussupport=yes # Поддержка файловой системы apple

# size=
#- — Select ?le in range size — size. # Размер в диапазоне
#<size — Select ?les smaller than size. # Файлы меньше чем указанный размер
#>size — Select ?les bigger than size. # Файлы больше чем указанный размер
#size — Select ?les which are within 1 % of size. # Файлы указаного размера ± 1%

# verify=
#i compare the inodes # Сравнения индексных дескрипторов
#p compare the permission bits # Сравнения прав на файл
#n compare the number of links # Количество ссылок на файл
#u compare the user id # Сравнение идентификатора пользователя
#g compare the group id # Сравнение идентификатора группы
#s compare the size # Сравнения размера
#a compare the access time # Сравнения времения доступа
#m compare the modi?cation time (st_mtime) # Сравнения времения модификации
#c compare the change time (st_ctime) # Сравнения времения изменения
#d report ?le size decreases # отчёт изменения файла размера
#5 compare the MD5 signature # Сравнение хеш сумм файлов MD5
#1 compare the SHA1 signature # Сравнение хеш сумм файлов SHA1
#A Only for Accurate option, it allows to always backup the ?le # опция Accurate при описании набора файлов (позволяет задать проверку контрольных сумм, а не только проверку времени создания/изменения файла при определении списка изменённых файлов)

# compression=GZIP5 # включить сжатие GZIP1-9|LZO|LZFAST|LZ4|LZ4HC
# }
# File = "|sh -c ’df -l | grep \"^/dev/hd[ab]\" | grep -v \".*/tmp\" | awk \"{print \\$6}\"’"
# File = /
# File = /usr
# }
Ignore File Set Changes = no # В случае изменения правила, следущая задача которая его использует будет делать полный бэкап. При установке значения yes до следущего полного бэкапа будет использоваться старое правило.
# Include { # указываем какие файлы мы берём
# Options {
# File = /
# File = /usr
# Exclude Dir Containing = .nobackup # исключить директорию содержащую файл
# }
}

Schedule {
Description = string # Описание расписания
Enabled = yes # Включение расписания
Name = MonthlyCycle # Уникальное имя расписания
Run = Level=Full Pool=Monthly 1st sun at 2:05
Run = Level=Differential 2nd-5th sun at 2:05
Run = Level=Incremental Pool=Daily mon-sat at 2:05
# Месяца jan | feb | mar | apr | may | jun | jul | aug | sep | oct | nov | dec | january | february |… | december | monthly
# Дни недели sun | mon | tue | wed | thu | fri | sat | sunday | monday | tuesday | wednesday | thursday | friday | saturday | daily
# Номера недель в месяце 1st | 2nd | 3rd | 4th | 5th | ?rst | second | third | fourth | ?fth | last
# часы и минуты «at 00:00»
# Номера недель в году w00 | w01 |… w52 | w53
# доступны номера дней в месяце и диапазоны через "-"
}

Job {
Accurate = yes # получает от директора список файлов, сохранённых в предыдущих заданиях, для файловых систем с большим количеством файлов требуется много ОП на клиенте
Add Pre?x = string # Добавление префикса
Add Su?x = string # Добавление постфикса
Allow Duplicate Jobs = yes # Разрешает дублировать запуск задачи
Allow Higher Duplicates = yes # если дубликаты запрещены, то выбрать задание с высшим приоритетом
Allow Mixed Priority = no # позволяет приоритетному заданию начаться, не дожидаясь завершения низкоприоритетного
Base = ResourceList # при любом типе резервного копирования файлы, не изменившиеся со времени базового копирования, не дублируются. Указывается имя задачи.
Bootstrap = directory # при резервном копировании в этот файл записывается информация, которая позволяет легче восстанавливать файлы

#%% — %
#%c — имя клиента
#%d — имя директора
#%e — статус выполнения (OK, Error, Fatal Error, Canceled, Differences, Unknown term code)
#%i — идентификатор задания
#%j — уникальный идентификатор задания
#%l — тип резервного копирования
#%n — имя задания
#%s — время (?)
#%t — тип задания
#%v — имя тома

Cancel Lower Level Duplicates = yes # если дубликаты запрещены, то прервать низкоприоритетную задачу
Cancel Queued Duplicates = yes # если дубликаты запрещены и в очереди уже стоит задание с тем же именем, то прервать его
Cancel Running Duplicates = yes # если дубликаты запрещены и задание с тем же именем уже выполняется, то прервать его
Catalog = agima-meta # Имя используемого каталога для сохранения метаданых
Client = agima-client # На каком клиенте запускать задачу
Client Run After Job = RunscriptShort # Запуск скрипта на клиенте после выполнения задачи
Client Run Before Job = RunscriptShort # Запуск скрипта на клиенте перед выполнением задачи
Description = string # Описание задачи
Di?erential Backup Pool = agima-pool # Используемый пул для диффиринциального бэкапа
Di?erential Max Runtime = time # Максимальное мремя выполнения дифф бэкапа
Enabled = yes # Включена ли задача
File Set = agima-site # Используемое правило набора файлов
Full Backup Pool = agima-pool # Используемый пул для полного бэкапа
Full Max Runtime = time # Максимальное мремя выполнения полного бэкапа
Incremental Backup Pool = agima-pool # Используемый пул для диффиринциального бэкапа
#Incremental Max Runtime = time # Максимальное время выполнения инкрементального бэкапа
#Job Defs = resource-name # Предустановки для описания задачи.
#Job To Verify = resource-name # Задача для проверки бэкапа
Level = BackupLevel # Устанавливает уровень для типа задачи: для создания бэкапов VirtualFull | Full | Incremental | Di?erential, для проверки InitCatalog проверка существующих файлов со списком из каталога | Catalog сравнения текущего списка и предыдущего | VolumeToCatalog сравнивает атрибуты файлов с записями в каталоге и если в каталоге записывают хэш суммы сравнивает и их | DiskToCatalog тоже что и предыдущий только для дисков, для восстановления Restore.
Max Concurrent Copies = 100 # Максимальное количество одновременно защеных копий задачи
Max Di? Interval = time # позволяет задать максимальный промежуток времени между дифференциальными резервными копиями, при его превышении резервное копирование изменений превращается в дифференциальное копирование
Max Full Interval = time # позволяет задать максимальный промежуток времени между полными резервными копиями, при его превышении резервное копирование изменений превращается в полное копирование
Max Run Time = time # максимальное время исполнения
Max Start Delay = time # максимальное ожидание в очереди на запуск
Max Virtual Full Interval = time # позволяет задать максимальный промежуток времени между пробными полными резервными копиями, при его превышении резервное копирование изменений превращается в пробное полное копирование
Max Wait Time = time # ожидание установки тома от момента запуска
Maximum Bandwidth = k/s # Максимальная ширина канала, значения скорости k/s, kb/s, m/s or mb/s.
Maximum Concurrent Jobs = 1 # количество одновременно запущенных задач
Maxrun Sched Time = time # (Max Start Delay + Max Run Time)
Messages = standard required # Используемые уведомления
Name = agima-site required # Уникальное имя задачи
#Next Pool = resource-name # имя пула назначения для задания миграции
Pool = agima-pool # Используемый пул
Prefer Mounted Volumes = yes # минимизирует количество монтирований или распараллеливает запись
Pre?x Links = no # при восстановлении «не на место» абсолютные символьные ссылки модифицируются в соответствии
Priority = 10 # Приоритет задачи чем больше цифра тем важнее. 1-255
Prune Files = no # очищать файлы из каталога
Prune Jobs = no # очищать задачи из каталога
Prune Volumes = no # очищать тома из каталога
Purge Migration Job = no # Удалять задачу миграции по окончании
Regex Where = string # При восстановлении
Replace = Always # always — всегда, ifnewer — если новее, never — никогда, ifolder — если старше При восстановлении заменять файлы по указаным правилам
Rerun Failed Levels = yes # повышать приоритет задачи при перезапуске
Reschedule Interval = 1800 # перезапустить через указанный интервал
Reschedule On Error = yes # Перезапускать задачу при ошибке
Reschedule Times = 5 # количество повторных попыток запуска
Run = «Nightly-backup level=%l since=\»%s\" storage=DDS-4" # Имя задачи, уровень, параметры сервер хранения
Run Script {
Command = «echo test» # выполняемая команда
Runs When = After # Когда запускать Never никогда | Before перед | After после | Always всегда | AfterVSS после теневого копирования
Runs On Failure = yes # Запуск при ошибке
Runs On Client = no # запуск на клиенте
Runs On Success = yes # Запуск при успехе
}
Schedule = MonthlyCycle # Используемое расписание
Storage = ResourceList # Используемый сервер хранения
Strip Pre?x = string # При восстановлении обрезать указанный префикс
Type = JobType # Backup создание бэкапа, Restore восстановление бэкапа, Verify проверка бэкапа, Migrate перемещение бэкапа, Admin запускается для автоочистки данных в каталоге, Copy проверка есть ли данные для копирования
#Virtual Full Backup Pool = resource-name # Используемый пул для полного виртаульного бэкапа
Where = directory # директория куда будут восстанавливаться файлы
Write Bootstrap = directory # директория сохранения файлов описывающих
Write Verify List = directory # место сохранения лога проверки
}

Messages {
Name = Standard # название текущего уведомления
Description = «Standard messages file daemon» # описание уведомления
#Mail Command = # команда отправки email, должна быть описана перед параметрами Mail, Mail On Error, Mail On Success
#Mail Command = "/usr/sbin/bsmtp -h mail.example.com -f \"\(Bareos\) \%r\" -s \«Bareos: \%t \%e of \%c \%l\» \%r"

##%% = % символ процента
##%c = Client’s name \ Имя клиента
##%d = Director’s name \ Имя сервера
##%e = Job Exit code (OK, Error, ...) \ Статус завершения
##%h = Client address \ хост клиента
##%i = Job Id \ Идентификатор задачи
##%j = Unique Job name \ Уникально имя задачи
##%l = Job level \ приоритет задачи
##%n = Job name \ Имя задачи
##%r = Recipients \ получатели
##%s = Since time \ # Буду рад если кто то объяснит что же означает этот параметр
##%t = Job type (e.g. Backup, ...) \ Тип задачи
##%v = Read Volume name (Only on director side) \ Прочитано том с именем
##%V = Write Volume name (Only on director side) \ Записан том с именем

#Operator Command = string # должно быть описано до параметра Operator. Аналогично Mail Command, но отправляет оператору

##Типы уведомлений message-type:
##info информационные сообщения
##warning Уведомления
##error ошибки
##fatal ошибки из-за которых задачи останавливаются
##terminate сообщения при отключении сервера
##notsaved файлы не сохранены
##skipped пропущенные файлы, попавшие в исключения или при инкрементальном бэкапе или при других настройках или действиях пользователя
##mount монтирование завершено
##restored список восстановленных файлов
##all все сообщения
##security сообщения info и warning только при попытках подключится
##alert сообщения генерируемые tape alerts
##volmgmt сообщения управления томами
##audit сообщения о выполняемых действиях

#Append = [ address = ] message-type [, message-type ]* # Добавляет сообщение в файл, если файл не существует он будет создан
director = backup-dir = all # отправка сообщения на сервер bareos
#Catalog = # отправка сообщения в базу данных каталога
#Console = # отправка сообщения в консоль
#File = # отправка сообщения в файл, если файл существует он будет перезаписан
#Mail = # отправка сообщения на указанный адрес
#Mail On Error = # email при ошибке
#Mail On Success = # email при успехе
#Operator = # отправить email на указанный адрес оператору
#Stderr = # отправка сообщения в стандартный вывод ошибок
#Stdout = # отправка сообщения на стандартный вывод
#Syslog = # отправка сообщения в Syslog журнал
}

Авторизация по сертификатам осталась вне этой статьи, вы всегда можете прочитать официальную документацию или другие руководства в интернете. Принимаются замечания по оформлению.

Комментарии (10)


  1. F1RST
    11.12.2015 12:44

    А чем все таки не устроила Bacula? По мне так она более распростронена и подробной документации по настройке уйма. Или Bareos имеет какие то существенные преимущества?


    1. AlexGluck
      11.12.2015 18:22
      +3

      Bareos свежий форк и в нём сейчас реализуются дополнительные фишки. При этом отличия от bacula минимальные и всё что было написано ранее для бакулы подходит на 80%


  1. Askon
    11.12.2015 23:16

    Такая статья эмоциональная, мне показалось автору ультиматум поставили: или настроишь или выгоним нахрен. Но он молодец, судя по всему, справился.


  1. Zolg
    12.12.2015 01:10

    Для того, чтобы лучше понять логику конфигов bacula (и, как следствие — bareos) нужно запомнить, что система затачивалась под ленточные накопители. И бэкап в файлы — всего лишь костыль, их эмулирующий.


  1. citius
    12.12.2015 14:53

    А веб интерфейсы для rsnapshot не рассматривали?
    Тот же Elkar Backup например.

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


    1. AlexGluck
      14.12.2015 10:20

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


  1. darkhex
    12.12.2015 17:06
    +2

    Советую вам еще прочитать следующие статьи
    swasher.pp.ua/razvertyvanie-bacula-v-malom-ofise.html
    habrahabr.ru/post/260955
    habrahabr.ru/post/211755
    + настроить web-интерфейс
    www.bareos.org/en/bareos-webui.html


  1. merlin-vrn
    13.12.2015 10:08
    +1

    Статья про бекапы? Хорошо.

    Где раздел про «бекапим что-то, не файлы»? Про «постоянно изменяемые файлы», например, круглосуточно используемая база данных? А если объём базы 3, 10, 30, 100, 300 гбайт?

    Где раздел «случилось страшное. Разворачиваем из бекапа»? Вариант «случилось не очень страшное. Разворачиваем из бекапа один файл»?

    Где раздел про планирование места для бекапов? Как прикинуть, сколько займут бекапы, рассчитать, сколько нужно места для того, чтобы гарантировано восстановить данные в течение, скажем, месяца?

    Теперь по поводу конкретной выбранной системы резервного копирования. Я уверен, вы ещё хлебнёте горя, когда кончится место. Просто так файлы-тома бакулы удалять нельзя, и сама она старые файлы-тома удалять не умеет. Так что вам нужно правильно настроить все размеры томов, максимальное количество томов в пуле, автопометку томов в пуле, срок хранения тома, информации о задании, информации о файлах в задании и т. д. чтобы она ожидаемо производила ротацию (перезапись) томов. Про то, как быть, если каталог умер (остались только тома бакулы) — как всё-таки развернуть данные (вот тут помогут файлы bootstrap, но как ими пользоваться)? Чем Purge отличается от Prune, что в действительности сделает Action On Purge = Truncate?

    Извините, написать apt-get install — ума много не надо. Сделать так, чтобы оно там что-то складывало регулярно — тоже несложно, тем более, что в большинстве дистрибутивов оно уже идёт «преднастроенное», так что какой-нибудь etc бекапится и добавить другие места можно по аналогии. А вот это — всё, что есть в вашей статье.

    Так себе статья, с трудом тянет на троечку.


    1. AlexGluck
      14.12.2015 10:28
      -1

      В статье описаны все параметры конфигов на русском языке с достаточно понятным объяснением что они делают(за исключением параметров касающихся касет и tls). Ничего более от этой статьи не требовалось. Если в дальнейшем после обретения большего опыта появится материал на темы указанные вами, то я его обязательно добавлю.


  1. Angel2S2
    13.12.2015 15:00
    +2

    Bareos/Bacula хорошая система. Но вот новичков часто пугает своими конфигами. Документацию, имхо, лучше читать на оф. сайте, а не выискивать статьи в сети. Все же в документации описано очень много особенностей системы, которые важно знать, чтобы понимать, что делаешь.
    В свое время написал несколько скриптов — bareos_init, для облегчения первичного развертывания и, в дальнейшем, добавления заданий. Возможно, кому-нибудь пригодится.