В данной статье не будет никакой воды, только полный разбор конфигураций bacula director.
Client {Настройки клиента}
Name = Имя клиента, задается вручную и будет использоваться в формировании Job.
Address = IP адрес, либо FQDN клиента
FD Port = Порт по которому директор будет обращаться к клиенту. По умолчанию установлен в 9102.
Catalog = Имя каталога, которое будет использоваться клиентом. По умолчанию Catalog = MyCatalog.
Password = Пароль от клиента. При установке соединения с клиентом, bacula будет использовать свое имя директора, которое мы указывали в самом начале конфига bacula-dir.conf и пароль, указанный в этой директиве. Важно, чтобы пароль совпадал в конфиге bacula-fd.conf у клиента с указанным здесь
File Retention = (Временной промежуток). По умолчанию установлен на 60 дней. Указывает на длительность хранения записей о файлах бэкапов в mysql базе. Если Autoprune установлена в “yes”, bacula будет удалять из базы записи о файлах через указанный промежуток времени.
Важно: Данная настройка затрагивает только базу и не будет удалить архивы ваших бэкапов!
Job Retention = То же самое, что и File Retention, но затрагивает только записи о совершенных задачах
Autoprune = yes/no По умолчанию установлено в “yes” и включает директивы FileRetention и JobRetention.
Maximum Concurrent Jobs = Количество задач, которые клиент может запустить в “конкурентном” режиме одновременно. По умолчанию установлено в 1.
Priority = Приоритет клиента перед другими клиентами. Устанавливается в диапазоне от 1 до 1000.
Pool {}
Для начала необходимо разъяснить, что такое Volume. Volume - это файл, который создает bacula и в который она же пишет бэкапы. При задаче бэкапа bacula использует последний использовавшийся volume, либо размечает новый. При задаче восстановления bacula обращается только к тем volume, которые были использованы в заданной задаче бэкапа.
Name = Имя pool'a.
Maximum Volumes = Максимальное количество volume в одном пуле. Если установить значение в 0, лимит будет убран.
Pool Type = Тип пула, который пересекается с типом задачи, использующей пул. Судя по официальной документации, может быть: Backup, Archive, Cloned, Migration, Copy, Save, однако пока что bacula воспринимает только тип Backup.
Storage = Имя Storage, которое мы задавали ранее.
Use Volume Once = yes/no будет означать то же самое, что и Maximum Volume Jobs = 1
Maximum Volume Jobs = Максимальное количество задач, которые могут использовать один volume. По умолчанию установлено в 0, что убирает лимиты. Если установить в 1, то bacula сможет использовать отдельный volume лишь единожды при создании бэкапов (т.е. при повторном запуске задачи bacula разметит для себя новый volume и будет писать в него, даже если предыдущий еще не заполнен).
Maximum Volume Files = Максимальное количество файлов, которые могут быть записаны в один volume. По умолчанию установлено в 0 (без ограничений).
Maximum Volume Bytes = Максимальный размер одного volume. По умолчанию тоже установлен в 0, что позволяет одному volume разрастаться без ограничений, пока физическое место на диске не закончится. При заполнении одного volume во время задачи бэкапа, bacula автоматически разметит новый и начнет писать в него, уведомив об этом в логах:
19-Dec 20:35 bacula-sd JobId 594: Volume "test_volume1028" previously written, moving to end of data.
19-Dec 20:37 bacula-sd JobId 594: End of medium on Volume "test_volume1028" Bytes=10,737,387,860 Blocks=166,441 at 19-Dec-2018 20:37.
19-Dec 20:37 bacula-dir JobId 594: There are no more Jobs associated with Volume "test_volume1029". Marking it purged.
19-Dec 20:37 bacula-dir JobId 594: All records pruned from Volume "test_volume1029"; marking it "Purged"
19-Dec 20:37 bacula-dir JobId 594: Recycled volume "test_volume1029"
19-Dec 20:37 bacula-sd JobId 594: Recycled volume "test_volume1029" on File device "test" (/backup/test), all previous data lost.
19-Dec 20:37 bacula-sd JobId 594: New volume "test_volume1029" mounted on device "test" (/backup/test) at 19-Dec-2018 20:37.
В данном примере размер volume указан 10G. В 20:35 bacula начала выполнять задачу бэкапа и обратилась к последнему volume, который закреплен за пулом в задаче бэкапа конкретного клиента. После того, как bacula нашла необходимый volume, она начала дописывать новые данные с того места, на котором остановилась в последний раз. В 20:37 bacula дописала последний байт в текущем volume, отработал триггер на то, что volume весит ровно 10 гигабайт и bacula автоматически разметила новый. После разметки нового volume, bacula отформатировала и начала использовать его для записи новых файлов.
AutoPrune = yes/no
По умолчанию установлено в yes и автоматически удаляет те volume, которые старше периода, указанного в Volume Retention.
Volume Retention = Временной промежуток, в который bacula будет хранить volume с бэкапами. Если директива Autoprune установлена в "yes", то после истечения указанного срока bacula “подрежет” старый volume, пометив его как “purged”, либо полностью удалит volume, если тот окажется сломанным, либо не читаемым.
Время может быть указано в секундах (seconds), минутах (minutes), часах (hours), днях (days), неделях (weeks), месяцах (months) и годах (years).
Recycle = yes/no
Директива, указывающая, может ли затертый (purged) volume быть перезаписан, по умолчанию установлена в "yes".
Label Format = Используется bacula как шаблон при разметке новых volume. Если указать Label Format = test_volume, bacula будет создавать test_volume0001, test_volume0002, test_volume0003 и т.д.
FileSet {Список файлов для бэкапа}
FileSet определяет список файлов, которые будут добавлены, либо исключены из задания бэкапа, тип и уровень сжатия и шифрование.
При изменении FileSet, bacula всегда создаст следующий бэкап полным (Full).
Name = Имя
Enable VSS = yes/no
VSS - Volume Shadow Copy Service. Используется для windows клиентов.
По умолчанию, установлена в "yes", что позволяет bacula обращаться к VSS на клиенте и бэкапить открытые, либо используемые другими приложениями файлы.
Include { Options {опции файлов}; File = }
Exclude {список файлов}
Options:
Существует достаточно много опций. Все их можно посмотреть в официальной документации, я же рассмотрю те, которые показались мне более полезными.
compression=GZIP
Все файлы будут сжаты с помощью gzip. Важно помнить, что сжатие происходит на стороне клиента, поэтому при недостатке мощности клиента, лучше указывать минимальный уровень.
По умолчанию, уровень сжатия GZIP равен 6, то есть compression=GZIP идентично compression=GZIP6.
signature=SHA1
signature=MD5
Выбор шифрования бэкапов. sha1 шифрует лучше, но медленнее, чем md5. Разработчики bacula настоятельно рекомендуют использовать шифрование своих бэкапов.
Также, вы можете использовать только один из методов шифрования в отдельном FileSet.
onefs=yes/no
По умолчанию установлено в "yes" и во время бэкапа, bacula затрагивает только ту файловую систему, директорию которой вы указали.
Если вы укажете "File = /", bacula проигнорирует директории файловых систем, которые монтируются автоматически (/dev /sys /proc и т.д.) и выдаст предупреждение об этом.
Если вы хотите бэкапить все файловые системы, вам нужно указать каждую из них отдельно:
File = /
File = /sys
File = /dev
Bacula также выдаст предупреждение о том, что /sys и /dev принадлежат другой файловой системе. Это произойдет потому, что bacula сначала обработает команду "File = /", а уже потом приступит к следующим.
wilddir=имя папки
wildfile=имя файла
Указывает имена файлов/папок, к которым применять правила бэкапа. Если установлено Exclude=yes, bacula будет пропускать все файлы/папки, указанные в этих параметрах.
exclude=yes/no
По умолчанию установлено в "no". При активации функции, bacula будет пропускать все файлы, указанные в данном "Options"
aclsupport=yes/no
xattrsupport=yes/no
По умолчанию установлено в "no". При установке в "yes", bacula будет сохранять ACL и Xattr всех файлов.
Важно помнить, что при восстановлении файлов на систему, в которой не установлен ACL, файлы не сохранят своих настроек.
Также при восстановлении сбросятся настройки xattr, если вы восстанавливаете бэкап одной ОС на другую (например с Linus на Solaris).
file-list
Список файлов, которые bacula должна бэкапить. Самый простой вариант - указывать в формате "File = ".
Если список конкретных файлов/директорий слишком большой, все их можно выписать в отдельный файл (в столбец) и вместо "File = " указать @/полный/путь/до/файла. Bacula прочитает этот файл только один раз во время запуска задачи бэкапа.
Пример:
FileSet {
Name = Defined_Client_Files
Include {
Options {
compression=GZIP1
signature=SHA1
}
@/etc/bacula/backup.list
}
Include {
Options {
wildfile = "*.sh"
Exclude = yes
}
File = /root/mydir
File = /home/mydir2
}
}
В данном примере bacula сначала забэкапит все файлы и директории, указанные в файле /etc/bacula/backup.list, сжав их с помощью gzip уровня 1 и зашифровав с sha1, после чего забэкапит /root/mydir и /home/mydir2 со всеми файлами и поддиректориями в них, но без каких либо опций и пропустив все файлы с расширением ".sh".
Если вам необходимо бэкапить только файлы с определенным расширением, вам подойдет этот пример:
FileSet {
Name = Defined_Client_Files
Include {
Options {
wildfile = "*.sh"
}
Options {
wildfile = ".*"
exclude = yes
}
File = /home
}
Если не указать wildfile = ".*" с опцией exclude = yes, bacula сначала забэкапит все файлы с расширением ".sh" в директории /home, а потом и всю директорию /home.
Shedule {Расписание}
Задание с таким расписанием будет делать полный бекап в воскресенье в час ночи и дописывать к нему инкременты каждый день в то же время:
Shedule {
Name = "Weekly_shedule"
Run = Level=Full sun at 01:00
Run = Level=Incremental mon-sat at 01:00
}
Пример расписания для месячного цикла.
В первое воскресенье месяца bacula сделает полный бэкап. Каждое следующее воскресенье этого месяца она будет дописывать дифференциал.
Также, для надежности, каждый день, кроме воскресенья, bacula будет писать инкременты.
Shedule {
Name = "Monthly_shedule"
Run = Level=Full 1st sun at 01:00
Run = Level=Differential 2nd-5th sun at 01:00
Run = Level=Incremental mon-sat at 01:00
}
Если вам не очень нужны дифференциальные бэкапы и вы можете позволить себе больше времени на восстановление, можно использовать другую схему.
Bacula сделает полный бэкап 1го числа текущего месяца и будет дописывать к нему инкременты каждый день в то же время.
Shedule {
Name = "Monthly_shedule_1"
Run = Level=Full on 1 at 01:00
Run = Level=Incremental on 2-31 at 01:00
}
Пример для запуска задачи каждые 10 минут:
Shedule {
Name = "Every_10_minutes"
Run = Level=Full hourly at 00:05
Run = Level=Full hourly at 00:15
Run = Level=Full hourly at 00:25
Run = Level=Full hourly at 00:35
Run = Level=Full hourly at 00:45
Run = Level=Full hourly at 00:55
}
Важно:
1. При несоответствии времени и расписания, bacula просто не запустит задачу.
Если в феврале будет 28 дней, а у вас в расписании указан запуск 10го, 20го и 30го, выполнится только 2 бэкапа.
Если в месяце только 4 воскресенья, а вы настроили расписание с 2го по 5ое, выполнится только 3 бэкапа с 2го по 4ое.
2. Также, время в bacula настроена по американскому стандарту, поэтому неделя начинается не с понедельника (monday), а с воскресенья (sunday).
3. Если в расписании указывается уровень бэкапа, прописывать его в задаче (Job) не нужно.
Job {тело задачи}
Name = Имя задачи
Когда задача будет запущена, уникальное имя команды будет состоять из того, что вы укажете в "Name", даты и времени.
Type = Тип задачи
Backup - Запуск задачи резервного копирования.
Restore - Запуск задачи восстановления. Может быть запущена только вручную.
Verify - Запуск задачи проверки. Обычно, запускается для проверки консистетности бэкапа, либо для сверки содержимого бэкапа и файловой системы клиента.
Admin - Запуск админской задачи. Может быть запущена для "подрезки" каталога.
Level = Уровень бэкапа
Full - Полный бэкапа всего, что указано в FileSet.
Incremental - Инкрементный бэкап. При каждом запуске Bacula будет проверять изменения в файлах, указанных в FileSet с момента предыдущего бэкапа.
Когда Director ищет последний удачный бэкап, он смотрит на следующее:
- То же имя задачи (Job name)
- То же имя клиента (Client name)
- Тот же список файлов (FileSet)
- Предыдущая задача имела тип "Backup" с уровнем "Full", "Diffenetial", или "Incremental"
- Задача завершилась удачно
Если директор не может найти предыдущий бэкап, соответствующий этим условиям, он сделает Full бэкап, после чего будет дописывать к нему инкременты:
05-Dec 14:39 bacula-dir JobId 291: No prior Full backup Job record found.
05-Dec 14:39 bacula-dir JobId 291: No prior or suitable Full backup found in catalog. Doing FULL backup.
Differential - Работает так же, как и инкрементный, но при запуске ищет последний успешный Full бэкап. Если такого нет, сделает Full бэкап сам. В отличии от инкрементного бэкапа, всегда будет записывать изменения, отталкиваясь от Full бэкапа, а не от последнего Incremental бэкапа.
Client = Имя клиента (его имя мы указываем отдельно в конфиге директора)
FileSet = "Имя" списка файлов и директорий (его имя мы указываем отдельно в конфиге директора)
Storage = Имя хранилища, которое указывалось в bacula-sd.conf
Pool = Имя пула (его имя мы указываем отдельно в конфиге директора)
Messages = Куда будут отправляться сообщения задачи. По умолчанию указывается "Standart" и пишет в лог файл /var/log/bacula/bacula.log.
RunScript {тело}
Runs On Success (Yes/No) - Запустить, если задача завершилась успешно.
Runs On Failure (Yes/No) - Запустить, если задача завершилась неудачно.
Runs On Client (Yes/No) - Запустить на клиенте.
Runs When (Before|After|Always|AfterVSS) - Когда запустить.
Fail Job On Error (Yes/No) - Если скрипт возвращает не 0, задача бэкапа отменяется.
Command - Путь до скрипта.
Console - Команда консоли.
Command:
- Весь вывод команд будет включен в Bacula job report.
- В строке Command должна быть указана команда, либо скрипт.
Есть замена данным командам:
Run Before Job - Запуск команды на сервере с директором перед запуском задачи (Job). При неудачном запуске команды, задача не запустится.
Run After Job - Запуск команды на сервере с директором после выполнения задачи. При неудачном выполнении задачи, не запустится.
Run After Failed Job - Запуск команды на сервере с директором после неудачного выполнения задачи.
Client Run Before Job - Запуск команды на сервере клиента перед запуском задачи (Job). При неудачном запуске команды, задача не запустится. Если хотите, чтобы сама задача выполнилась даже при неудачи скрипта, используйте форму RunScript.
Client Run After Job - Запуск команды на сервере клиента после выполнения задачи. При неудачном выполнении задачи, не запустится.
Run Before Job = echo test
выполнит то же самое, что и:
RunScript {
RunsOnFailure = yes
RunsWhen = Before
Command = "echo test"
}
Для Windows:
Command должен вести по корректному пути до скрипта (файл .com, .bat, или .exe). Команда может быть чем угодно, что может быть запущено через cmd.exe, или command.com.
Команда будет запущена в среде Win32, поэтому Unix команды не будут работать, пока вы не установите и не сконфигурируете Cygwin.
Пример команд для Windows:
ClientRunBeforeJob = yourscript.bat (если файл yourscript.bat находится в директории, куда установлена бакула)
ClientRunBeforeJob = "\"C:/Program Files/Bacula/yourscript.bat\"" (полный путь до того же скрипта)
Для проверки вашего скрипта можете ввести cmd /c “C:/Program Files/yourscript.exe”. Если скрипт выполняет то, что вы хотите, добавьте (\) перед каждыми кавычками, затем добавьте кавычки в начале и конце всей команды.
Если вам необходимо выполнить скрипт под определенным пользователем, необходимо указать это:
ClientRunBeforeJob = "su - User -c \"/path_to_script/script.sh\""
Rerun Failed Levels = yes/no
По умолчанию установлено в "no", следовательно, если не будет указано в задаче, не будет учитываться.
Если установить в "yes", бакула будет пересматривать свою очередь после выполнения задачи (удачного и неудачного).
Используется при бэкапах локальной сети, в которой есть ноутбуки. Если задача бэкапа недоступного клиента не запустится, bacula автоматически выдаст следующей задаче в очереди более высокий статус и запустит ее.
Job {
Name = Test_job
Type = Backup
Level = Incremental #не указывать, если задано в пункте Shedule
Client = My_Server
FileSet= Defined_Client_Files
Storage = Storage_for_My_Server
Pool = My_Server_Pool
Schedule = "Defined_Daily"
Messages = Standard
ClientRunBeforeJob = "echo starting"
ClientRunAfterJob = "echo complete"
RerunFailedLevels = yes
}