@ Карта сайта News Автора!

Bog BOS: Сетевая система резервного копирования и восстановления данных bacula

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL

Последнее изменение файла: 2024.07.01
Скопировано с www.bog.pp.ru: 2024.11.23

Bog BOS: Сетевая система резервного копирования и восстановления данных bacula

Общая характеристика системы

Сетевая система резервного копирования и восстановления данных bacula позволяет системному администратору сохранять данные с многочисленных компьютеров сети на накопители на магнитной ленте, устройства записи на CD/DVD (удалено), файловую систему (файлы имитируют ленточные тома) или облако (имитирует файловую систему ;), а также искать и восстанавливать (проверять) данные. Имеется поддержка ленточных библиотек, автозагрузчиков со считывателем штрихкода с динамической разметкой томов (метки тома в форматах IBM и ANSI, утилита проверки совместимости). Возможность кеширования данных в файловую систему при записи на ленту и в облако. От простейших средств резервного копирования (tar, dump, rsync) отличается наличием каталога и правил. Каталог (данные о клиентах, заданиях, томах, сохранённых фалах) хранится в реляционной СУБД (PostgreSQL, MySQL/MariaDB, SQLite - только для тестирования, удалено), возможность кеширования метаданных в файловую систему перед записью в СУБД. Правила определяют сроки хранения и обеспечивают сохранность скопированных данных от преждевременного удаления.

Система хорошо масштабируема. Управляющий директор, СУБД, сервер хранения, сервер доступа к файловой системе (клиент), монитор и консоль выделены в отдельные процессы и могут быть в нескольких экземплярах расположены в различных узлах сети. При этом сохраняется возможность единой точки управления и мониторинга. Компоненты могут быть легко разнесены в нужные места сети или удалённых сетей, интерфейс прост, описан и управляем с точки зрения сетевого экрана.

Имена файлов произвольной длины (для Win32 в версии 1 не длинее 260 - исправлено). Хранение атрибутов файлов: времена создания (не используется при восстановлении), изменения и доступа, владелец и группа, права доступа, POSIX ACL (в т.ч. для NTFS), с версии 2 - ACL SunOS. В версии 3 - атрибуты для каждой платформы сохраняются особым образом и восстанавливаются только для родной платформы, добавлена поддержка Solaris ZFS/NFSv4 ACL (с возможностью конвертации из UFS в ZFS). Расширенные атрибуты (xattr, libattr, getxattr, setxattr) сохраняются, начиная с версии 3 (включая атрибуты SELinux и Samba). Начиная с версии ? возможно восстанавливать файлы с неродной платформы, но без атрибутов. Для каждого файла хранится также имя клиента и имя носителя. Возможность сохранения открытых файлов NTFS (с помощью VSS - Volume Shadow Copy; W98 и W2000 не имеют VSS!, только одна задача может использовать VSS!). Поддержка имён файлов в UTF-8 для Unix/Linux и UTF-16 для Win32 (преобразуется в UTF-8 при хранении). Возможность сохранять и восстанавливать разделы диска (только целиком) и fifo-файлы (это позволяет дописывать свои программы хранения и восстановления). Имеется возможность добавлять свои расширения (в комплекте расширения bpipe и был exchange).

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

Ограничения на размер файлов, файловых систем и разделов - не более 4 миллиардов файлов в СУБД. Если надо более, то необходимо разбить БД на несколько (по клиентам) или перед сборкой переключить FileId с 32-битного на 64-битное представление (в версии 3 переключено по умолчанию). Есть поддержка многотомных архивов.

Имеется (имелась?) отдельная процедура резервного копирования с целью восстановления "с нуля" (загружаемый CD). При этом восстанавливаются не только данные, но и большинство системной информации (разбиение на разделы, LVM). К сожалению, не восстанавливаются атрибуты файловых систем и софтовый RAID (md). Пользоваться невозможно, в версии 3 полностью переделано на загрузочную флешку.

Отсутствуют "тяжелые" механизмы типа CDP (имеется имитация с использованием inotify), LAN-free, Serverless, снятие копии со снапшота (что-то появилось, но не для всех), дедупликация (возможно с помощью внешних средств - ZFS и пр., требуется дополнение без исходных текстов, совместимое только с предкомпилированным компанией Bacula Systems пакетом - aligned-sd.so, не пробовал, но эффективность сомнительна; данные хранятся отдельно от метаданных и маленьких файлов с выравниванием каждого файла на границу записи), автоматическое распараллеливание копирования с одного клиента (мне не удалось увидеть скорость потока более 270МБ/сек: LZO, настоящий SSD).

Миграция заданий между пулами реализована в версии 2.2 (только перемещение и только внутри одного сервера хранения). В версии 3 добавлена возможность копирования заданий (опять внутри одного сервера хранения?). В версии 3 появилась функция консолидации архивов. В версии 9 доделана возможность создания виртуальной полной копии (создаётся на сервере из полной копии и изменений) с автоматическим удалением ненужного.

Возможность запускать скрипты до и после задания на клиенте и сервере хранения. Это позволяет создавать свои агенты для резервирования и восстановления БД.

Средств управления хранением данных (иерархическое хранения, учёт жизненного цикла) и работы с архивами нет.

Сжатие производится пофайлово на стороне клиента (gzip или LZO или zstd, однопоточное). Каждый блок (около 64 КБ, размер задаётся) тома содержит контрольную сумму. Возможность ограничения трафика появилась в версии ?.

Формат архива томов - свой (менялся в процессе развития). Имеются автономные утилиты получения оглавления, восстановления файлов (до версии 3 с ограничениями), восстановления БД по архивам, а также описание формата архива (и исходные тексты ;).

Основным интерфейсом управления является командная строка с выбором из меню при нехватке параметров. В версии 2.2 появился многообещающий графический интерфейс bat (остался многообещающим - требуется осторожность при больших установках). Графические консоли управления в предыдущих версиях бесполезны. Имеется веб-интерфейс baculum (не освоено, т.к. предыдущие варианты оставили плохие воспоминания и были заброшены). Интерактивное восстановление файлов с возможностью выбора нужной копии. Имеется возможность указывать исключения в списке файлов с помощью регулярных выражений. Автоматический запрос оператору на установку нужного тома. Извещения о проблемах и необходимости ручного вмешательства по email (различные сообщение на различные адреса для различных событий для различных групп серверов) и syslog.

Для индивидуального применения лучше подыскать другую программу (эта слишком тяжела в развёртывании), зато после настройки работает в полностью автоматическом режиме. Плохо переносит резкие смены конфигурации (как убрать все упоминания об удалённом клиенте, его заданиях и томах? в версии 9.2.1 появилась команда "delete client=имя", недоделанная). Плохая обработка ошибок при работе с диском (заполненный диск, глюки с созданием нового тома при наличии файла) и сетью, перезагрузке серверов и клиентов, завершившиеся с ошибкой задания остаются в БД навсегда (и, вообще, БД не чистится от мусора). Хорошо хоть оператора извещает. Много ручной работы (беготня по меню), нет создания нескольких копий одновременно, нет консолидации частично заполненных носителей, нет автоматического обнаружения новых серверов, файловых систем, СУБД. Ручная установка как серверов, так и клиентов. Средства перехода на новую версию - вручную.

Своя система аутентификации и авторизации для администраторов с возможностью разбивки по ролям и областям ответственности, учёт действий пользователей. Для аутентификации между процессами используется CRAM-MD5, обеспечивающий достаточный (?) уровень защиты, пароли не передаются, но хранятся в открытом виде. Передаваемые между серверами данные можно шифровать с помощью TLS. В версии 3 добавлена возможность аутентификации с помощью TLS. Шифровка данных на стороне клиента в версии 2 (метаданные не шифруются). SSL при обращении к СУБД с версии 7. Шифрование томов на сервере хранения в версии 15.

Высокая скорость (наличие каталога с информацией о местонахождении требуемого файла) и лёгкость восстановления (поиск по имени, времени). Слабая защита "от дурака" в текстовой версии. Независимость восстановления от платформы в версии 2 (с потерей атрибутов). Возможность восстановления на другой хост, другой каталог (и возможность ограничить это).

Информация о заданиях, томах и файлах сохраняется во внешней СУБД (MySQL от 4.1 (8 для bacula 15), PostgreSQL от 7.4 (9.6 для bacula 15), SQLite от 2.8.16 (SQLite 3 для bacula 15)): какой файл с какого клиента был записан на какой носитель и когда. Возможность восстановления каталога из резервной копии и с носителя. В версии 3 добавлна возможность доступа к СУБД через libdbi, потом удалена.

Управление и учёт носителей (сколько времени хранить, где находится, что содержит); метки на носителях (физические и логические), отслеживания перемещений нет. Группировка томов в пулы со своими свойствами и назначением.

Имеется режим верификации, который позволяет сопоставить атрибуты файлов в каталоге с текущим состоянием (в т.ч. MD5 или SHA1 хеши).

В версии 3 появилась возможность отслеживания удаления и переименования файлов после сохранения (иначе при восстановлении удалённые файлы появятся вновь).

Написание скриптов на python (2.2, 2.3, 2.4 или 2.5) - выкинули.

Серверная часть для Linux, FreeBSD 5.0 и выше, Solaris 8 и выше, MS Windows 2008. Клиенты для Linux, FreeBSD, Solaris, Win32 (W98, Me, NT, 2000, XP, 2003, Vista), Win64 (2008, Vista, Windows 7, Windows 8), MacOS X/Darwin, OpenBSD, Irix (?), Tru64 (?), AIX (?), HPUX (?). Документация сильно отстаёт от реальности, например, директора под MS Windows уже нет, а сервер хранения включён в комплект клиента. Система поставляется в виде исходных текстов, что позволяет адаптировать её под любую системы при наличии компилятора C++ не хуже gcc 4.3 (для версии 15). Требуется LD_ASSUME_KERNEL=2.4.19 для запуска в RH с ядром 2.4 (проблема с нитями).

Распространяется с открытыми источниками (почти GPL2 в версии 1 и просто GPL2 в версиях 2 и 3, с небольшими исключениями, сейчас Affero GPL Version 3). Документация под лицензией CC-BY-SA. Начальные разработчики - John Walker и Kern Sibbald (2000), передан Free Software Foundation of Europe. Создана фирма для поддержки пользователей - Bacula Systems S.A. (Kern Sibbald). Документация написана для версии 1 ("the current production Bacula release is version 1.38.11"), к которой приложена пачка изменений. Последняя бесплатная версия под MS Windows - 5.2.10 (вроде одумался и исполняемые файлы для версии 9 и выше имеются). Загрузка пакетов после регистрации, но без SMS (не пробовал). Работа с внешними снимками (LVM, ZFS, btrfs) и внешней дедупликацией (Deduplication Optimized Volumes, Aligned Volumes) только с помощью бинарных пакетов (bsnapshot и aligned), которые совместимы только с фирменными бинарными сборками.

Недовольные коммерциализацией и медленным развитием сделали форк - bareos (был суд), тоже не очень бурно развивается, плагины и рефакторинг, рефакторинг и платные плагины (версия 16.2). Квоты, дедупликация (такая же ерунда как в bacula?), аудит (?), стыковка с Gluster и Ceph, инициация со стороны клиента (?), Always Incremental.

При восстановлении наблюдалась скорость более 3 ГБ/сек.

Имеются проблемы при работе с большим количеством файлов в задании - тормозит как СУБД (MySQL), так и директор, особенно при восстановлении при большом количестве инкрементных заданий. Время обработки данных до начала восстановления (52 миллиона файлов, Xeon 3.5 GHz, ОП более чем достаточно, версия 5.2.13, Accurate в Job, "restore all done", директор работает в 1 поток - создаёт restore.bsr, экономит количество монтирований томов?):

Я не использовал НМЛ при работе с bacula.

Архитектура системы, основные понятия и компоненты

Система состоит из набора сервисов 5 типов и СУБД (может быть один или несколько сервисов каждого типа, расположение различных сервисов в сети определяется администратором):

Дополнительные компоненты:

В качестве РСУБД можно использовать MySQL/MariaDB (версии от 4.1 (от 8 для bacula 15) ; желательно не в режиме совместимости ANSI/ISO; при установке из пакетов потребуются пакеты mysql, mysql-server и mysql-devel; при самостоятельной сборке требуется указать --enable-thread-safe-client), PostgreSQL (не пробовал; 9.6 для bacula 15) или SQLLite (в крайнем случае или для тестирования). Автор рекомендует использовать PostgreSQL, если требуется более 2 миллионов файлов на задание в режиме Accurate. В версии 3 добавлена возможность доступа к СУБД через libdbi (пока к тем же самым типам СУБД, выброшен?). При установке bacula с MySQL устанавливаются скрипты работы с СУБД (в скриптах можно указывать дополнительные параметры, например: "-u root -p"):

Основной единицей работы является задание (Job). Директор даёт каждому заданию идентификатор - уникальный в рамках этого директора номер - JobId. Уникальный (относительно) идентификатор задания состоит из идентификатора задания и времени запуска. Сервер хранения даёт каждой сессии с клиентом (заданию) идентификатор VolSessionId, который образует уникальный (относительно) идентификатор сессии в совокупности с временем сессии (VolSessionTime).

Типы заданий

При описании задания определяются:

Запуск задания производится автоматически планировщиком или вручную с консоли, директор обращается к файловому серверу и серверу хранения, файловый сервер обращается к серверу хранения (если не используется "SD calls Client") и передаёт данные и метаданные, сервер хранения передаёт полученные метаданные директору для включения в каталог.

Типы заданий резервирования:

Информация хранится в БД ограниченное время. Можно отдельно задать периоды хранения информации о файлах (определяется в описании клиента при настройке директора), заданиях (при удалении задания удаляется информация о связанных с ним файлах; определяется в описании клиента при настройке директора) и томах (определяется в описании пула при настройке директора, вместе с информацией о томе удаляется информация о заданиях и файлах). Срок хранения информации о файлах и заданиях (берутся из текущих настроек, не из БД) обычно проверяется в конце задания резервирования для данного клиента. После удаления информации о файлах из каталога можно восстановить только всё задание целиком (или необходимо предварительно поменять параметры хранения и восстановить каталог утилитой bscan). Консоль имеет команды ручного удаления: prune (с учётом времени хранения) и purge (без учёта). Рекомендуется ежегодно выполнять dbcheck (удаление мусора) и OPTIMIZE TABLE в MySQL (или mysqldump с последующим восстановлением).

Данные сохраняются на тома (бобина магнитной ленты, файл, облако). Имя тома может состоять из букв, цифр и символов "-_:.". На один том можно записывать произвольное количество заданий (регулируется настройкой). Одно задание может быть разбито на несколько томов, если ен помещается на один. Имя файла является частью метки файлового тома, так что переименовывать файлы нельзя. Тома группируются в пулы томов: в описании задания указывается имя пула, а не конкретного тома. Типы пулов:

В начале каждого тома пишется метка тома, которая позволяет избежать установки неправильной ленты. Метка тома содержит: признак метки, версию формата метки, время создания метки, время первой записи, имя тома, имя предыдущего тома (?), имя пула, тип пула, MediaType, имя хоста, имя программы, версия программы.

В начале каждого задания пишется метка сессии: признак метки, версию формата метки, идентификатор задания, время, номер тома в последовательности (?), имя пула, тип пула, имя задания, имя клиента, уникальное имя задания, имя набора данных, тип задания, уровень задания, MD5 описания набора файлов.

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

Параметры пула задаются при настройке директора (записываются в каталог при запуске директора или командой create в консоли). При изменении параметров пула необходимо перезапустить директора или выполнить команду "update pool" в консоли. Для автоматического изменения информации о пуле в каталоге, пул должен быть упомянут хотя бы в одном задании. Информация о реальных томах, входящих в пул, хранится в каталоге.

Добавление тома в пул осуществляется командой label в консоли. Эта же команда (или утилита btape) записывает метку в начало тома. Команда relabel позволяет записать новую метку тома (том должен быть предварительно очищен). Команда add добавляет том в пул, не записывая метку. Возможно автоматическое (по потребности) добавление томов в пул (полезно для файловых томов). При инициализации тома его атрибуты по умолчанию берутся из описания пула в каталоге (можно изменить командой "update volume" из консоли, в меню есть возможность обновить все параметры томов в пуле по изменившемуся описанию пула - reload, update pool). Атрибут "Media Type" тома должен соответствовать типу носителя, который описан для указанного в задании устройства хранения. Возможные состояния тома:

Срок хранения информации в каталоге о томе проверяется только когда требуется новый том для записи, а свободного (Append) тома в пуле не найдено. В этом случае просматриваются все полностью заполненные (Full) или запрещённые к дальнейшему использованию (состояние Used) тома (превышение времени использования, числа заданий и т.п.), помеченные для автоматической очистки (атрибут AutoPrune при описании пула) и информация о файлах и заданиях на этом томе удаляется из каталога в соответствии со сроком хранения. Если в результате была удалена информации о всех файлах и заданиях, относящихся к данному тому, то он переводится в состояние очищенного (Purged). Из этого состояния том может быть немедленно переведён в состояние Recycled и использован для записи, если отмечена возможность его повторного использования (атрибут Recycle при описании пула), и он является самым старым (RecycleOldestVolume). Опция PurgeOldestVolume позволяет повторно использовать самый старый том независимо от установленных сроков хранения информации в БД. Опция Recycle Current Volume позволяет повторно использовать текущий том, установленный в устройстве. Если подходящего тома найти не удалось и не разрешена автоматическая разметка новых томов (перед разметкой происходит событие NewVolume для интерпретатора python) или достигнут разрешённый максимум числа томов, то bacula требует вмешательства оператора. При использовании автоподатчиков и ленточных библиотек bacula стремится минимизировать ручное вмешательство. Имеется возможность создать специальный пул Scratch, тома из которого автоматически передаются в требуемый пул (настройки тома берутся из текущего пула). Состояние тома можно узнать командой консоли "list volumes". Удалить вручную информацию о заданиях и файлах на этом томе без проверки сроков хранения можно командой консоли "purge jobs volume": (том переводится в состояние очищенного - Purged), с проверкой сроков хранения - prune. Удаление тома из каталога производится командой: delete volume (у меня удаление тома занимает 5 минут; размер БД более 4 ГБ).

Содержимое тома делится на блоки, блок состоит из заголовка блока (метка, размер, контрольная сумма, номер, идентификатор сессии, время сессии) и последовательности записей. Чтение и запись производится блоками (Maximum block size?), содержащими данные одного задания. Каждый файл внутри задания получает номер от клиента, начиная с 1 (FileIndex). Для файла хранится несколько потоков различного типа (создаются и разбираются клиентом) - атрибуты, содержимое файла и т.д.. Каждая запись содержит заголовок записи (индекс файла, тип сессии, размер) и данные. Обмен между сервером хранения и клиентом производится записями (Maximum Network Buffer Size?). Потоки (частично):

При описании каждого задания (Job) указывается какие файлы и как сохранять (FileSet), откуда их сохранять (Client), когда сохранять (Shedule), куда сохранять (Pool, Storage). Кроме заданий на сохранение можно описывать задания на восстановление, верификацию и администрирование.

Общий синтаксис файлов настройки и ключи

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

Каждый конфигурационный файл состоит из "ресурсов" различных типов. Ресурс состоит из имени типа ресурса и перечня директив в фигурных скобках. Каждая директива располагается на отдельной строке и состоит из имени директивы и значения, разделённых знаком равенства. Длина строки ограничена 499 байтами (2000?) до версии 7.0. Пробелы в имени являются незначащими, прописные и строчные буквы не различаются. Значение, содержащее пробелы и прочие "нехорошие" символы, необходимо заключать в кавычки. Обратная косая черта маскирует специальное значение следующего символа. Пустые строчки и символы от знака '#' до конца строки игнорируются. Символ ';' означает конец директивы, далее может идти следующая директива. Конструкция '@абсолютное-имя-файла' на месте любой лексемы включает содержимое указанного файла. Конструкция '@|sh -c команда' позволяет сгенерировать список включаемых файлов. Каждый ресурс должен иметь директиву Name (с уникальным значением) и может иметь директиву Description (должно показываться оператору, но непоказывается даже в команде show). Например:

Storage {
  Name = FileStorage; Description = "huge hard disk storage"
  Address ...
}

Типы данных:

Общие ключи запуска серверов:

Во всех файлах настройки задаётся ресурс Messages, который управляет рассылкой сообщений, в зависимости от типа сообщения и имени задания. Можно задавать несколько ресурсов Messages для заданий различного типа (имя ресурса Messages указывается при описании задания). Сообщение может быть отправлено в несколько мест назначения (в syslog и по e-mail) или не отправлено никуда. Рекомендуется настраивать файловые сервера и сервера хранения так, чтобы все сообщения пересылать директору - это позволяет централизовать обработку сообщений.

Каждое сообщение имеет один из следующих типов:

Директивы:

TLS. Во всех файлах настройки (директор, сервер хранения, клиент, консоль) могут быть заданы директивы, обеспечивающие шифрование передачи данных (не хранение!) с помощью TLS и системы сертификатов PKI (не путать с директивами PKI, обеспечивающими шифрование хранения!). Не поддерживается режим анонимного согласования Diffie-Hellman. Имеется возможность использовать TLS для аутентификации вместо CRAM-MD5. В данном описании клиентом называется тот, кто обращается к серверу, а сервером - тот кто отвечает на запросы клиента. Директивы (пример использования):

Сервер хранения

В файле настройки (/usr/local/bacula/etc/bacula-sd.conf) должны быть описаны следующие ресурсы:

Файловый сервер (клиент)

В файле настройки (/usr/local/bacula/etc/bacula-fd.conf) должны быть описаны следующие ресурсы:

Клиент может работать в режиме "читать всё, без права записи": "bacula-fd -k -u nobody -g nobody".

Обещана работа клиента под Windows XP, Windows Server 2000, Windows Server 2003, Windows Server 2008, Vista, Windows 7 и Windows 8. Запускается как системный сервис, иконка с меню в трее.

Клиент версии 7.0 периодически посылает сообщения директору о количестве обработанных файлов и байт. Директора старых версий пугаются.

Клиент версии 11 несовместим с bacula-sd версии 9: "Fatal error: hello.c:191 Bad caps from SD : auth cram-md5 ssl=1".

Консоль управления

Модификации консоли:

Аутентификация и авторизация доступа к директору может быть 3 типов:

В файле настройки (bconsole.conf, gnome-console.conf, wx-console.conf, bat.conf) должны быть описаны следующие ресурсы:

Ключи bconsole:

Интернационализация отсутствует. Выбрана гадкая локализация с разделением троек цифр в числе запятыми. Попытка заменить LANG при запуске bacule-dir и bconsole не исправили ситуацию. Для вывода информации из БД помогает команда консоли "gui on" в течении сеанса, но тогда отключается предупреждение о наличии новых сообщений. Сервера в любом случае выводят числа с разделением групп цифр, включая отчёты о завершении заданий.

Команды консоли (имя команды можно сокращать (даже при неоднозначности!), имя параметра - нет; если параметров недостаточно, то недостающие будут запрошены; для прерывания интерактивного задания параметров - не при вводе имени тома - необходимо ввести "."; запущенную на выполнение команду прервать нельзя (^C не работает); команды могут читаться из файла перенаправлением ввода; максимальная длина команды - 511 символов; jobid - номер задания, ujobid - уникальный идентификатор задания состояит из имени задания и времени запуска экземпляра):

Команды для работы в пакетном режиме и для графических оболочек:

Команды, выполняемые самой консолью (только текстовый вариант):

bconsole может быть использована в пакетном режиме.

Команды интерактивного режима выбора файлов при восстановлении ("нехорошие" имена файлов необходимо заключать в кавычки):

gnome-console (gnome-console.conf) и wx-console отличаются только возможностью выбирать восстанавливаемые файлы мышкой (wx-console медленна и с неправильным шрифтом). Удалены.

Монитор

Монитор позволяет узнать состояние серверов (директоров, файловых серверов, серверов хранения), к которым ему разрешён доступ. Неудобен при большом (более 20) количестве демонов.

В файле настройки (/usr/local/bacula/etc/tray-monitor.conf) должны быть описаны следующие ресурсы:

Директор

В файле настройки (bacula-dir.conf) должны быть описаны следующие ресурсы (рекомендую не использовать ресурсы повторно, т.е. для каждого Client/FileSet определять отдельные задание, планировщик, хранитель, пул; каждое задание в отдельный том):

Схема "перекрёстного опыления" на дисковые массивы

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

В нашем случае мы имеем два здания, соединённых достаточно быстрым каналом связи (100/1000 Mbps). В каждом здании имеется серверная, в которой расположены основные серверы организации и коммутационное оборудование. Часть серверов и рабочих станций, подлежащих копированию, разбросана по зданиям. Было принято решение установить по серверу резервного копирования в каждой серверной и настроить их таким образом, чтобы резервное копирование компьютеров из первого здания осуществлялось сервером копирования из второго здания, а компьютеров из второго здания - сервером копирования из первого здания. Это обеспечивает сохранность резервных копий в случае локальных катастроф (пожар или приход ОБЭП ;), в т.ч. копий самих серверов копирования. В качестве носителей было принято решение использовать НЖМД (каталог /backup/bacula на отдельном разделе - в нашем случае RAID-5).

После установки и опробования начнём настройку компонент bacula. Основной принцип - разделяй и властвуй, т.е. для каждого клиента определяется отдельное задание, отдельный планировщик, отдельный FileSet, отдельные пулы (для каждого типа задания отдельный пул), отдельный каталог (MediaType) и т.д. Несколько раз пробовал группировать для упрощения настройки и каждый раз жалел при первом же изменении стратегии резервного копирования. Отдельный вопрос - настройка сетевых экранов.

Настройка первого сервера хранения (bacula-sd.conf, для второго сервера хранения настройки аналогичны):

Storage {
  Name = backup1-sd
  Description = "backup storage server здание А"
  WorkingDirectory = "/usr/local/bacula/var"
  Pid Directory = "/var/run"
  Maximum Concurrent Jobs = 20 # реальное ограничение в настройках директора
  SDPort = 9103
}
Director {
  Name = backup1-dir
  Password = "backup1-dir-to-backup1-sd"
}
Director {
  Name = backup2-dir
  Password = "backup2-dir-to-backup1-sd"
}
Director {
  Name = console-mon
  Password = "tray-password"
  Monitor = yes
}
# для каждого клиента отдельное "устройство"
Device {
  Name = FileStorage-ИмяКлиента
  Archive Device = /backup/bacula/ИмяКлиента
  Device Type = File
  Media Type = File-ИмяКлиента
  Removable Media = no
  Random Access = Yes
# Block Positioning = no # при чтении старых томов в новой версии
  LabelMedia = Yes
  Automatic Mount = Yes
  AlwaysOpen = No
  Maximum Network Buffer Size = 65536
}
...
Messages {
  Name = Standard
  director = backup1-dir = all
}

Клиенты из второго здания первого сервера хранения (bacula-fd.conf, для клиентов второго сервера хранения настройки аналогичны):

Director {
  Name = backup1-dir
  Password = "backup1-dir-to-ИмяКлиента-fd"
}
Director {
  Name = backup2-dir
  Password = "backup2-dir-to-ИмяКлиента-sd"
}
Director {
  Name = console-mon
  Password = "tray-password"
  Monitor = yes
}
FileDaemon {
  Name = ИмяКлиента-fd
  FDport = 9102
  # FDAddress для компьтеров с несколькими интерфейсами
  WorkingDirectory = /usr/local/bacula/var
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20 # реальное ограничение в настройках директора
}
Messages {
  Name = Standard
  director = backup1-dir = all, !skipped, !restored
}

Настройка первого директора (bacula-dir.conf, настройки второго директора аналогичны):

Director {
  Name = backup1-dir
  Description = "backup director здания А"
  Password = "universal-password-to-backup1-dir"
  Messages = Daemon
  WorkingDirectory = "/usr/local/bacula/var"
  PidDirectory = "/var/run"
  # Scripts Directory
  QueryFile = "/usr/local/bacula/etc/query.sql"
  Maximum Concurrent Jobs = 5 # подбирается экспериментально
  DIRport = 9101
}
#
# для каждого клиента
#
Job {
  Name = ИмяКлиента
  # Enabled = No # для временного отключения планирования
  Type = Backup
  Level = Full
  Write Bootstrap = "/usr/local/bacula/var/ИмяКлиента.bsr"
  Client = ИмяКлиента-fd
  FileSet = ИмяКлиента
  Messages = Standard
  Pool = ИмяКлиента-monthly
  Incremental Backup Pool = ИмяКлиента-daily
  Schedule = ИмяКлиента-year
  Rerun Failed Levels = Yes
# для рабочих станций
#  Run Script {
#    Runs When = Before
#    Runs On Client = No
#    Fail Job On Error = Yes
# не запускать по праздникам
#    Command = /usr/local/bacula/etc/holiday.sh
#  }
#  Reschedule On Error = Yes
#  Reschedule Interval = 30 minutes
#  Reschedule Times = 16
}
#
# для каждого клиента под Linux
#
FileSet {
  Name = ИмяКлиента
# не делать полное копирование после изменения списка
# Ignore FileSet Changes = Yes
  Include {
    Options {
      compression = GZIP
      signature = SHA1
      onefs = yes
      aclsupport = yes
      noatime = yes
      checkfilechanges = yes
    }
    File = /
# каждую файловую систему отдельно
    ...
  }
  Exclude {
    File = /proc
    File = /sys
    File = /net
    File = /media
# для devfs
#    File = /dev
# для прочих
    File = /dev/pts
    File = /dev/shm
    File = /tmp
    File = /var/cache/yum
    File = /.journal
    File = /.fsck
    File = /var/lib/nfs/rpc_pipefs
    File = /.autofsck
    File = /selinux
    File = /var/named/chroot/proc
    File = ...
  }
}
#
# для каждого клиента под MS Windows XP/2003
#
FileSet {
  Name = ИмяКлиента
# не делать полное копирование после изменения списка
# Ignore FileSet Changes = Yes
  Enable VSS = Yes
  Include {
    Options {
      compression = GZIP
      signature = SHA1
      onefs = yes
      portable = no
      noatime = yes
      checkfilechanges = yes
      Ignore Case = yes
      wildfile = "*.avi"
      wildfile = "*.wmv"
      wildfile = "*.mp3"
      wildfile = "pagefile.sys"
      wildfile = "hiberfil.sys"
      wilddir = "System Volume Information"
      wilddir = "TEMP"
      wild = ...
      exclude = yes
    }
    File = "e:/"
# каждый диск отдельно
    ...
  }
}
# долговременное хранение для серверов с возможностью восстановления 
# состояния на любой день в течении недели, на любое воскресенье в течении месяца,
# на первое воскресенье в течении года
#   ночью первого воскресенья месяца - полное копирование на тома пула ИмяКлиента-monthly
#   в остальные воскресенья - полное копирование на тома пула ИмяКлиента-weekly
#   в прочие дни - копирование изменений на тома пула ИмяКлиента-daily
Schedule {
  Name = "ИмяКлиента-year"
  Run = Level=Full Pool=ИмяКлиента-monthly 1st sun at 00:05
  Run = Level=Full Pool=ИмяКлиента-weekly 2nd-5th sun at 00:05
  Run = Level=Incremental Pool=ИмяКлиента-daily mon-sat at 00:05
}
# среднесрочное хранение для серверов с возможностью восстановления 
# состояния на любой день в течении недели, на любое воскресенье в течении месяца
#   ночью в воскресенье - полное копирование на тома пула ИмяКлиента-weekly
#   в прочие дни - копирование изменений на тома пула ИмяКлиента-daily
Schedule {
  Name = "ИмяКлиента-year"
  Run = Level=Full Pool=ИмяКлиента-weekly sun at 00:05
  Run = Level=Incremental Pool=ИмяКлиента-daily mon-sat at 00:05
}

#
# для каждого клиента
#
Client {
  Name = ИмяКлиента-fd
  Address = полное-имя-или-адрес
  FDPort = 9102
  Catalog = MyCatalog
  Password = "backup1-dir-to-ИмяКлиента-fd"
  AutoPrune = yes
# это ограничение на срок хранения сверху, реальный срок задаётся в Pool
  File Retention = 1 year
  Job Retention = 1 year
}
#
# для каждого клиента
#
Storage {
  Name = File-ИмяКлиента
# DNS-разрешение происходит на клиенте, не надо вписывать сюда 127.0.0.1!
  Address = адрес-первого-сервера-хранения
  SDPort = 9103
  Password = "backup1-dir-to-backup1-sd"
  Device = FileStorage-ИмяКлиента
  Media Type = File-ИмяКлиента
}
#
# каталог один на всех
#
Catalog {
  Name = MyCatalog
# DB Address и DB Port, если сервер SQL вынесен на другой хост
  dbname = bacula; user = bacula; password = "пароль для MySQL"
}
#
# обработка сообщений, приписанных заданию
#
Messages {
  Name = Standard
  mailcommand = "/usr/local/bacula/sbin/bsmtp -h SMTP-сервер -f \"\(Bacula: %d\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/local/bacula/sbin/bsmtp -h SMTP-сервер -f \"\(Bacula: %d\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = e-mail-адрес = all, !skipped, !saved, !restored
  operator = e-mail-адрес = mount, terminate, alert
  console = all, !skipped, !saved, !restored
  append = "/var/log/bacula.log" = all, !skipped
  syslog = all, !skipped, !saved, !restored
  catalog = all, !skipped
}
#
# обработка сообщений вне заданий
#
Messages {
  Name = Daemon
  mailcommand = "/usr/local/bacula/sbin/bsmtp -h SMTP-сервер -f \"\(Bacula: %d\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = e-mail-адрес = all, !skipped, !saved
  console = all, !skipped, !saved, !restored
  append = "/var/log/bacula.log" = all, !skipped
  syslog = all, !skipped
  catalog = all, !skipped
}
#
# для каждого клиента описываются 3 пула (ежемесячный, еженедельный, ежедневный)
#
Pool {
  Name = ИмяКлиента-monthly
  Pool Type = Backup
  Maximum Volume Jobs = 1
  Maximum Volume Bytes = 4650000000 # по размеру DVD-R
  Volume Retention = 1 year
  AutoPrune = yes
  RecyclePool = ИмяКлиента-monthly
  Recycle = yes
  Recycle Oldest Volume = yes
  Label Format = "ИмяКлиента-monthly-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}"
  Storage = File-ИмяКлиента
}
Pool {
  Name = ИмяКлиента-weekly
  Pool Type = Backup
  Maximum Volume Jobs = 1
  Maximum Volume Bytes = 4650000000 # по размеру DVD-R
  Volume Retention = 35 days
  AutoPrune = yes
  RecyclePool = ИмяКлиента-weekly
  Recycle = yes
  Recycle Oldest Volume = yes
  Label Format = "ИмяКлиента-weekly-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}"
  Storage = File-ИмяКлиента
}
Pool {
  Name = ИмяКлиента-daily
  Pool Type = Backup
  Volume Use Duration = 6 days 18 hours
  Maximum Volume Bytes = 4650000000 # по размеру DVD-R
  Volume Retention = 7 days
# Volume Retention = 31 days # для восстановления состояния на любой день месяца
  AutoPrune = yes
  RecyclePool = ИмяКлиента-daily
  Recycle = yes
  Recycle Oldest Volume = yes
  Label Format = "ИмяКлиента-daily-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}"
  Storage = File-ИмяКлиента
}
#
# права для мониторинга
#
Console {
  Name = console-mon
  Password = "tray-password"
  CommandACL = status, .status
}

Проще всего сгенерировать шаблон для каждого клиента с помощью скрипта bacula-client-gen.sh (параметры: имя клиента, тип ОС клиента (Linux, Windows), server/workstation), отредактировать (список файлов и исключений; адрес и пароль клиента; адрес и пароль сервера хранения) и поместить в файл /usr/local/bacula/etc/Имя-клиента.include, и включать в конфигурационный файл с помощью директивы '@'.

Схема исключительно инкрементального копирования на дисковые массивы с архивацией и перекрёстным опылением

Мотивация. После многих лет успешного использования схемы перекрёстного опыления стала мешать необходимость еженедельно делать полную копию всего набора файлов несмотря на то, что за неделю меняется порядка 10%. Количество наборов, которые не успевают сохраняться за сутки, перевалило за десяток, несмотря на все ухищрения в виде ручного деления набора и использование lvmcache. Пришло время опробовать средство консолидации резервных копий, которое позволяет обойтись исключительно инкрементальными копиями, что сокращает время копирования и уменьшает нагрузку на рабочие массивы. К сожалению, увеличивается нагрузка на массив резервной копии, но эта нагрузка имеет последовательный характер.

Диспозиция. Имеется 2 серверных помещения, в которых размещены более сотни серверов, которые большей частью представляют собой вычислительные узлы и файловые серверы общего пользования для оперативной работы (быстрые диски и SSD кеш) и долговременого хранения (медленные диски). В большинстве случаев применяются различные версии CentOS, в небольшом количестве Solaris, HP-UX и Windows. Основной объём хранимой информации представляет собой домашние каталоги разработчиков, а также коллективные архивы групп. Имеются также сверхоперативные хранилища, но они не резервируются. Также по 13 этажам здания разбросаны ПК сотрудников (различные виды Linux и Windows), информацию с которых также необходимо резервировать. Изначально было выбрано резервное копирование на диски.

Задачи резервного копирования были сгруппированы по следующим типам:

При наличии 2 серверных было принято решение использовать 2 сервера копирования со схемой "перекрёстного опыления" (резервное копирование серверов из первой серверной осуществлялось сервером копирования из второй серверной, а серверов из второй серверной - сервером копирования из первой серверной), чтобы увеличить катастрофоустойчивость решения и обеспечить возможность восстановления самих серверов резервного хранения и накопленных БД. Выбор сервера копирования для ПК осуществляется исходя из наличия места. Сервер копирования включает сервер хранения, директор и СУБД. Возможно добавление серверов хранения на удалённой территории для архивных пулов, но требуется большая пропускная способность каналов передачи данных (пересылаются полные копии). Предварительно обеспечить взаимное резервное копирования каталогов директоров.

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

Director {
  Name = первый-dir
  Password = "пароль от директора 1 к клиенту N"
}
Director {
  Name = второй-dir
  Password = "пароль от директора 2 к клиенту N"
}
FileDaemon {
  Name = ИмяХоста-fd
  FDport = 9102
  WorkingDirectory = /usr/local/bacula921/var
  Pid Directory = /var/run
  Maximum Concurrent Jobs = 20
  Plugin Directory = /usr/local/bacula921/lib
}
Messages {
  Name = Standard
  director = backup-orvs-dir = all, !skipped, !restored
# к сожалению пока bacula не проверяет имя директора
#  director = backup2-orvs-dir = all, !skipped, !restored
}

Настройки серверов хранения, резервные копии хранятся в /backup/bacula (права 750 для baculas:bacula), общая часть (приведён первый, второй по аналогии):

Storage {
  Name = первый-sd
  Description = "test backup storage server in подразделение (расположение) Имя-Хоста"
  SDPort = 9103
# здесь хранится кеш атрибутов файлов до завершения задания, требуется сотня гигабайт, права 775 для baculas:bacula
  WorkingDirectory = "/backup/bacula/spool"
  Pid Directory = "/var/run"
  Plugin Directory = "/usr/local/bacula921/lib"
  Maximum Concurrent Jobs = 20
  Client Connect Wait = 60m
  TLS Enable = yes
# пусть клиент решает, нужна защита иили нет
  TLS Require = no
# проверка клиента по разовому паролю, полученному от директора
  TLS Verify Peer = no
  TLS CA Certificate File = "/usr/local/bacula921/etc/ca.crt" # сертификат нашего центра сертификации
  TLS Certificate = "/usr/local/bacula921/etc/доменное-имя-сервера.crt" # сертификат сервера
  TLS Key = "/usr/local/bacula921/etc/доменное-имя-сервера.open.key" # открытый ключ сервера
}
Director {
  Name = первый-dir
  Password = "пароль от директора 1 к серверу хранения 1"
  TLS Enable = yes
# передача от директора д.б. защишена
  TLS Require = yes
# сертификат директора надо проверить
  TLS Verify Peer = yes
  TLS Allowed CN = "доменное имя хоста директора 1"
  TLS CA Certificate File = "/usr/local/bacula921/etc/ca.crt" # сертификат нашего центра сертификации
  TLS Certificate = "/usr/local/bacula921/etc/доменное-имя-сервера.crt" # сертификат сервера
  TLS Key = "/usr/local/bacula921/etc/доменное-имя-сервера.open.key" # открытый ключ сервера
}
Director {
  Name = второй-dir
  Password = "пароль от директора 2 к серверу хранения 1"
  TLS Enable = yes
# передача от директора д.б. защишена
  TLS Require = yes
# сертификат директора надо проверить
  TLS Verify Peer = yes
  TLS Allowed CN = "доменное имя хоста директора 2"
  TLS CA Certificate File = "/usr/local/bacula921/etc/ca.crt" # сертификат нашего центра сертификации
  TLS Certificate = "/usr/local/bacula921/etc/доменное-имя-сервера.crt" # сертификат сервера
  TLS Key = "/usr/local/bacula921/etc/доменное-имя-сервера.open.key" # открытый ключ сервера
}
@/usr/local/bacula921/etc/НаборФайлов1.sd.include
...
Messages {
  Name = Standard
  director = первый-dir = all
# пока имя директора не проверяется
#  director = второй-dir = all
}

Настройки серверов хранения, для каждого набора файлов (создаётся подкаталог /backup/bacula/НаборФайлов1 для хранения томов пула и архивного пула; такая вычурная конструкция необходима для заданий виртуального копирования, которые читают и пишут в один и тот же пул, а ещё хочется иметь возможность восстанавливаться, пока что-то пишется):

Autochanger {
  Name = FileStorage-НаборФайлов1
  Device = FileStorage-НаборФайлов1-Dev1, FileStorage-НаборФайлов1-Dev2, FileStorage-НаборФайлов1-Restore
  Changer Command = /dev/null
  Changer Device = /dev/null
}
Device {
  Name = FileStorage-НаборФайлов1-Dev1
  Archive Device = /backup/bacula/НаборФайлов1
  Device Type = File
  Media Type = File-НаборФайлов1
  Maximum Concurrent Jobs = 1
  Random Access = Yes
  Maximum Network Buffer Size = 65536
  LabelMedia = yes
  Maximum block size = 262144
  RemovableMedia = no
  Autochanger = yes
}
Device {
  Name = FileStorage-НаборФайлов1-Dev2
  Archive Device = /backup/bacula/НаборФайлов1
  Device Type = File
  Media Type = File-НаборФайлов1
  Maximum Concurrent Jobs = 1
  Random Access = Yes
  Maximum Network Buffer Size = 65536
  LabelMedia = yes
  Maximum block size = 262144
  RemovableMedia = no
  Autochanger = yes
}
Device {
  Name = FileStorage-НаборФайлов1-Restore
  Archive Device = /backup/bacula/НаборФайлов1
  Device Type = File
  Media Type = File-НаборФайлов1
  Maximum Concurrent Jobs = 1
  Random Access = Yes
  Maximum Network Buffer Size = 65536
  LabelMedia = yes
  Read Only = yes
  Maximum block size = 262144
  RemovableMedia = no
  Autochanger = yes
  AutoSelect = no
}

Настройки директоров, общая часть (приведён первый, второй по аналогии):

Director {
  Name = первый-dir
  Description = "first backup director подразделение at доменное имя хоста (расположение)"
  Password = "пароль для консоли"
  Messages = Daemon
  WorkingDirectory = "/usr/local/bacula921/var"
  PidDirectory = "/var/run"
  QueryFile = "/usr/local/bacula921/etc/query.sql"
  TLS Enable = yes
  TLS Require = yes
  TLS Verify Peer = yes
  TLS CA Certificate File = "/usr/local/bacula921/etc/ca.crt" # сертификат нашего центра сертификации
  TLS Certificate = "/usr/local/bacula921/etc/доменное-имя-сервера.crt" # сертификат сервера
  TLS Key = "/usr/local/bacula921/etc/доменное-имя-сервера.open.key" # открытый ключ сервера
  TLS Allowed CN = "bacula-console@доменное-имя-консоли1"
...
  Heartbeat Interval = 60
  Maximum Concurrent Jobs = 20
  FD Connect Timeout = 30m
  SD Connect Timeout = 60m
  DIRport = 9101
  MaximumReloadRequests = 256
}
Job {
  Name = "RestoreFiles"
  Type = Restore
#  Bootstrap = /usr/local/bacula921/var/.bsr
  Client=НаборФайлов1-fd
# The FileSet and Pool directives are not used by Restore Jobs
# but must not be removed
  FileSet=НаборФайлов1
  Pool = НаборФайлов1
  Messages = Standard
  Where = /tmp/bacula-restores
  Maximum Concurrent Jobs = 20
  Allow Mixed Priority = Yes
}
Job {
  Name = Verify
  Type = Verify
  Level = VolumeToCatalog
  Accurate = Yes
  Client = НаборФайлов1-fd
  FileSet = НаборФайлов1
  Messages = Standard
  Pool = НаборФайлов1
  Maximum Concurrent Jobs = 20
  Allow Mixed Priority = Yes
}

@/usr/local/bacula921/etc/НаборФайлов1.dir.include
...
Catalog {
  Name = MyCatalog1
  DB Socket = /var/lib/mysql/mysql.sock
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "пароль пользователя bacula для MySQL"
}
Messages {
  Name = Standard
  mailcommand = "/usr/local/bacula921/sbin/bsmtp -h smtp-хост -f \"\(Bacula\: первый-dir имя-хоста) \<%r\>\" -s \"Bacula 1: %t %e of %n (%c) %l\" %r"
  operatorcommand = "/usr/local/bacula921/sbin/bsmtp -h smtp-хост -f \"\(Bacula\: первый-dir имя-хоста \<%r\>\" -s \"Bacula 1: Intervention needed for %j\" %r"
  mail = email-адрес-администратора = all, !skipped
  operator = email-адрес-администратора = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
  catalog = all, !skipped
}
Messages {
  Name = Daemon
  mailcommand = "/usr/local/bacula921/sbin/bsmtp -h smtp-хост -f \"\(Bacula\: первый-dir имя-хоста) \<%r\>\" -s \"Bacula 1 daemon message\" %r"
  mail = email-адрес-администратора = all, !skipped
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
}

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

Job {
  Name = НаборФайлов1
#   Enabled = No # для временного отключения планирования
  Type = Backup
  Accurate = Yes
  Write Bootstrap = "/usr/local/bacula921/var/НаборФайлов1.bsr"
  Client = НаборФайлов1-fd
  FileSet = НаборФайлов1
  Messages = Standard
  Pool = НаборФайлов1
  Schedule = НаборФайлов1-incremental-virtualfull
  Next Pool = НаборФайлов1
# разрешить только 1 задачу, чтобы задание виртуальной копии дожидалось завершения инкрементальной копии
  Maximum Concurrent Jobs = 1
# нам не нужны дполонительные полные копии - места нет
  Reschedule Incomplete Jobs = No
# задание виртуальной копии имеет то же самое имя, должно вставать в очередь
  Allow Duplicate Jobs = Yes
# требуется для механизма синхронизации заданий резервного копирования каталогов
  Allow Mixed Priority = Yes
}
Schedule {
  Name = НаборФайлов1-incremental-virtualfull
  Run = Level=Incremental mon-sun at 00:00
# рекомендуется разнести клиентов по дням недели
  Run = Level=VirtualFull mon at 00:10
}
Client {
  Name = НаборФайлов1-fd
  Address = доменное-имя-клиента
  FDPort = 9102
  Catalog = MyCatalog1
  Password = "пароль от директора 1 к клиенту 1"
  File Retention = 10 year
  Job Retention = 10 year
  Maximum Concurrent Jobs = 1
}
FileSet {
  Name = НаборФайлов1
# не делать полное копирование после изменения списка
  Ignore FileSet Changes = Yes
  Include {
    Options {
      wildfile = "*.gz"
      wildfile = "*.tgz"
      wildfile = "*.tar"
      wildfile = "*.Z"
      wildfile = "*.xz"
      wildfile = "*.7z"
      wildfile = "*.DNG"
      wildfile = "*.JPG"
      wildfile = "*.jpg"
      wildfile = "*.VOB"
      wildfile = "*.MOV"
      wildfile = "*.m2ts"
      wildfile = "*.bz2"
      wildfile = "vstorm2.tran_int*"
      wildfile = "*.rar"
      wildfile = "*.zip"
      wildfile = "*.rpm"
      wildfile = "*.iso"
      wildfile = "*.ISO"
      wildfile = "*.nrg"
      signature = SHA1
      accurate = pinscmug
      onefs = yes
      noatime = yes
      checkfilechanges = yes
      aclsupport = yes
      xattrsupport = yes
      verify = pinscm1ug
    }
    Options {
      compression = LZO
      signature = SHA1
      accurate = pinscmug
      onefs = yes
      noatime = yes
      checkfilechanges = yes
      aclsupport = yes
      xattrsupport = yes
      verify = pinscm1ug
    }
# каждую файловую систему отдельно
    File = /НаборФайлов1
  }
  Exclude {
    File = /proc
    File = /sys
    File = /net
    File = /media
# для devfs
#    File = /dev
# для прочих
    File = /dev/pts
    File = /dev/shm
    File = /tmp
    File = /var/cache/yum
    File = /.journal
    File = /.fsck
    File = /var/lib/nfs/rpc_pipefs
    File = /.autofsck
    File = /selinux
    File = /var/named/chroot/proc
  }
}
Pool {
  Name = НаборФайлов1
  Maximum Volumes = 16
  Pool Type = Backup
  Storage = File-НаборФайлов1
  Maximum Volume Jobs = 1
  Volume Retention = 13 days 10 min
  Recycle = yes
  Recycle Oldest Volume = yes
  Label Format = "НаборФайлов1-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
}
Storage {
  Name = File-НаборФайлов1
# DNS-разрешение происходит на клиенте, не надо вписывать сюда 127.0.0.1!
  Address = доменное-имя-сервера-хранения-1
  SDPort = 9103
  Password = "пароль директора 1 к серверу хранения 1"
  Device = FileStorage-НаборФайлов1
  Media Type = File-НаборФайлов1
  Autochanger = yes
  Maximum Concurrent Jobs = 5
  TLS Enable = yes
# нужно, если сервер хранения на другом сервере
  TLS Require = no
  TLS CA Certificate File = "/usr/local/bacula921/etc/ca.crt" # сертификат нашего центра сертификации
  TLS Certificate = "/usr/local/bacula921/etc/доменное-имя-сервера.crt" # сертификат сервера
  TLS Key = "/usr/local/bacula921/etc/доменное-имя-сервера.open.key" # открытый ключ сервера
}
Storage {
  Name = Restore-НаборФайлов1
# DNS-разрешение происходит на клиенте, не надо вписывать сюда 127.0.0.1!
  Address = доменное-имя-сервера-хранения-1
  SDPort = 9103
  Password = "пароль директора 1 к серверу хранения 1"
  Device = FileStorage-НаборФайлов1-Restore
  Media Type = File-НаборФайлов1
  Autochanger = yes
  Maximum Concurrent Jobs = 5
  TLS Enable = yes
# нужно, если сервер хранения на другом сервере
  TLS Require = no
  TLS CA Certificate File = "/usr/local/bacula921/etc/ca.crt" # сертификат нашего центра сертификации
  TLS Certificate = "/usr/local/bacula921/etc/доменное-имя-сервера.crt" # сертификат сервера
  TLS Key = "/usr/local/bacula921/etc/доменное-имя-сервера.open.key" # открытый ключ сервера
}
Job {
  Name = НаборФайлов1-archive
#   Enabled = No # для временного отключения планирования
  Type = Copy
  Accurate = Yes
  Selection Type = SQLQuery
  Selection Pattern = "SELECT DISTINCT Job.JobId FROM Client,Job,JobMedia,Media,Pool WHERE Client.Name='НаборФайлов1-fd' AND Client.ClientId=Job.ClientId AND Level='F' AND JobStatus IN ('T', 'W') AND JobMedia.JobId=Job.JobId AND JobMedia.MediaId=Media.MediaId AND Pool.PoolId=Job.PoolId AND Pool.Name= 'НаборФайлов1' ORDER BY Job.StartTime ASC LIMIT 1;"
  Write Bootstrap = "/usr/local/bacula921/var/НаборФайлов1-archive.bsr"
  Client = НаборФайлов1-fd
  FileSet = НаборФайлов1
  Messages = Standard
  Pool = НаборФайлов1
  Schedule = НаборФайлов1-archive
  Next Pool = НаборФайлов1-archive
  Allow Mixed Priority = yes
}
Schedule {
  Name = НаборФайлов1-archive
# на следующий день после виртуальной полной копии
  Run = Wed at 00:20
}
Pool {
  Name = НаборФайлов1-archive
  Maximum Volumes = 1
  Pool Type = Backup
  Storage = File-НаборФайлов1
  Maximum Volume Jobs = 1
  Volume Retention = 10 year
  Recycle = yes
  Purge Oldest Volume = yes
  Label Format = "НаборФайлов1-archive-${Year}${Month:p/2/0/r}${Day:p/2/0/r}-${Hour:p/2/0/r}${Minute:p/2/0/r}${Second:p/2/0/r}"
}

Требуется проработка аварийных ситуаций:

Настройки директоров для каждого набора файлов с месячным циклом, оформляются в отдельный файл имя-набора.dir.include для каждого набора файлов аналогично недельному циклу. Отличия состоят в планировщике (день месяца вместо дня недели), количестве томов в пуле (65 вместо 16), времени хранения тома (61+ день вместо 13+)

Катастрофоустойчивый вариант - иметь 2 SD в разных местах и использовать их попеременно.

Не рекомендуется доверять защиту от записи неизменяемых томов настройкам типа "Enabled = no" и пр., а закрыть их от записи командой "chmod a-w ...".

Ключи ./configure при сборке из исходных текстов

Некоторые ключи (обрабатываются также стандартные ключи configure):

Установка 15.0.2 на Rocky Linux 8.9 x86-64 (директор, хранитель, текстовая консоль и клиент)

Предварительно необходимо установить и настроить MariaDB (поток mariadb:10.3/server, включая mariadb-server, mariadb, mariadb-common, mariadb-connector-c, mariadb-connector-c-config, mariadb-errmsg, perl-DBD-MySQL, perl-DBI, perl-Math-BigInt, perl-Math-Complex, mariadb-backup, mariadb-server-utils), readline-devel, zlib-devel, lzo-devel, libzstd-devel, openssl-devel, krb5-devel, libacl, libacl-devel, libattr, libattr-devel, libcurl-devel, libcap-devel, kernel-devel, git; поток python36:3.6/build.

Процесс установки

  1. [добавление bacula в /etc/group], пользователей в группу bacula, baculad и baculas в /etc/passwd и /etc/shadow
  2. развернуть bacula-15.0.2.tar.gz
  3. [make distclean] (удаление кеша ./configure)
  4. ./configure --prefix=/usr/local/bacula1502 --mandir=/usr/local/bacula1502/man --with-pid-dir=/usr/local/bacula1502/var --with-openssl --enable-smartalloc --with-job-email=адрес --with-smtp-host=адрес --with-dir-user=baculad --with-dir-group=bacula --enable-batch-insert --with-sd-user=baculas --with-sd-group=bacula --with-mysql --with-subsys-dir=/var/lock/subsys --with-working-dir=/usr/local/bacula1502/var --enable-lockmgr --disable-conio --enable-readline --disable-ipv6 --with-lzo --with-systemd --with-logdir=/var/log/bacula --enable-build-dird --enable-build-stored --disable-bee --disable-s3 --disable-afs --disable-acsls --disable-gpfs --disable-antivirus-plugin --disable-docker-plugin --disable-kubernetes-plugin --disable-totp-bpam --disable-ldap-bpam --with-zstd=yes
  5. просмотреть результат (config.out и config.log)
  6. make [-j8] # неиспользуемые sendit (bcollector.c), fstypeid (fstype.c), reconnect (mysql.c)
  7. [остановить и удалить предыдущую версию] (оставлял версию bacula-fd 9 для работы с директором 9 на другом сервере)
  8. make install # в /usr/local/bacula1502/
  9. [mkdir /var/log/bacula]
  10. [chown baculad:bacula /var/log/bacula]
  11. [chmod 770 /var/log/bacula]
  12. отредактированный (добавить "su baculad bacula") scripts/logrotate в /etc/logrotate.d/bacula
  13. обеспечить доступ с компьютеров, на которых установлены консоли и мониторы к порту 9101
  14. обеспечить доступ директора на порт 9102 к компьютерам, на которых установлены клиенты
  15. обеспечить доступ директора на порт 9103 к компьютерам, на которых установлены серверы хранения
  16. обеспечить файловую систему для хранения файлов и права доступа (2.5TB (1%) сразу куда-то делись - раньше такого не было!)
    pvcreate /dev/sda /dev/sdb
    vgcreate grid0154big /dev/sda /dev/sdb
    lvcreate --stripes 2 --stripesize 64K --name bacula -l +100%FREE grid0154big /dev/sda /dev/sdb # -stripesize 1m
    mkfs.xfs -L bacula -d su=64k,sw=2 -i attr=2 -l su=64k,lazy-count=1 -m crc=1 -m reflink=0 [-m finobt=0] /dev/grid0154big/bacula # su=1m
    mkdir /backup
    vim /etc/fstab # LABEL=bacula /backup xfs nodiratime,relatime,attr2,logbufs=8,logbsize=256k,inode64,filestreams 1 2
    systemctl daemon-reload
    mount /backup
    mkdir /backup/bacula
    chown baculas:bacula /backup/bacula
    chmod 750 /backup/bacula
    
  17. [chmod go+rx /usr/local/bacula1502/etc/grant_mysql_privileges]
  18. запустить "/usr/local/bacula1502/etc/grant_mysql_privileges -p" под обычным пользователем (запрашивает mariadb пароль root) (даёт права к bacula.* пользователю bacula без пароля, так что пароль надо устанавливать самому:
    mysql -u root -p
    SELECT Host, User FROM mysql.user;
    SET PASSWORD FOR 'bacula'@'localhost' = PASSWORD('пароль');
    SET PASSWORD FOR 'bacula'@'%' = PASSWORD('пароль');
    SELECT * FROM mysql.user;
    удалить ~/.mysql_history
    
  19. установить пароль в /usr/local/bacula1502/etc/bacula-dir.conf, секция каталог
  20. chmod go+rx /usr/local/bacula1502/etc/create_mysql_database
  21. запустить "/usr/local/bacula1502/etc/create_mysql_database -u bacula -p" под обычным пользователем (запрашивает пароль пользователя bacula)
  22. chmod go+rx /usr/local/bacula1502/etc/{make_mysql_tables,update_mysql_tables,drop_mysql_tables}
  23. запустить "/usr/local/bacula1502/etc/make_mysql_tables -u bacula -p" под обычным пользователем (запрашивает пароль пользователя bacula) (update_mysql_tables обновляет формат таблиц, drop_mysql_tables очищает таблицы; архив скриптов обновлений лежит в upgradedb)
  24. создать ключи и сертификаты TLS, в т.ч. открытый ключ /usr/local/bacula1502/etc/имя-хоста.open.key (baculad:bacula 440) и bacula-console@...
  25. cp platforms/systemd/bacula-dir.service /lib/systemd/system/bacula-dir1502.service
  26. cp platforms/systemd/bacula-fd.service /lib/systemd/system/bacula-fd1502.service
  27. cp platforms/systemd/bacula-sd.service /lib/systemd/system/bacula-sd1502.service
  28. systemctl daemon-reload
  29. отредактировать настройки /usr/local/bacula1502/etc/bacula-fd.conf
  30. [systemctl start bacula-fd1502 (нервно реагирует на тестовые запросы от zabbix; несовместимость с сервером 5.2.13)]
  31. [systemctl status bacula-fd1502]
  32. [systemctl enable bacula-fd1502]
  33. создать каталоги для пулов в /backup/bacula с правильными правами (baculas:bacula)
  34. отредактировать настройки /usr/local/bacula1502/etc/bacula-sd.conf
  35. chown baculas:bacula /usr/local/bacula1502/etc/bacula-sd.conf /usr/local/bacula1502/sbin/bacula-sd
  36. chmod 640 /usr/local/bacula1502/etc/bacula-sd.conf
  37. systemctl start bacula-sd1502
  38. лишняя строка "yes" в /usr/lib/systemd/system/bacula-sd1502.service (RequiresMountsFor) # --with-pid-dir?
  39. Pid Directory = "yes" - это ненормально # --with-pid-dir=/usr/local/bacula1502/var
  40. отсутствует дополнительная группа SupplementaryGroups=baculas
  41. добавил "-T -d 9"
  42. systemctl daemon-reload
  43. systemctl start bacula-sd1502
  44. systemctl status bacula-sd1502
  45. systemctl enable bacula-sd1502
  46. отредактировать настройки /usr/local/bacula1502/etc/bacula-dir.conf
  47. chown baculad:bacula /usr/local/bacula1502/etc/bacula-dir.conf /usr/local/bacula1502/sbin/bacula-dir
  48. chmod 640 /usr/local/bacula1502/etc/bacula-dir.conf
  49. chgrp bacula /usr/local/bacula1502/sbin/bsmtp
  50. systemctl start bacula-dir1502
  51. systemctl status bacula-dir1502
  52. systemctl enable bacula-dir1502
  53. chgrp bacula /usr/local/bacula1502/etc/bconsole.conf /usr/local/bacula1502/etc/bconsole # чтобы запускать консоль не с правами root
  54. настроить /usr/local/bacula1502/etc/bconsole.conf
  55. опробовать /usr/local/bacula1502/etc/bconsole
  56. вручную скопировать scripts/logwatch/logfile.bacula.conf в /usr/share/logwatch/default.conf/logfiles/bacula.conf, scripts/logwatch/services.bacula.conf в /usr/share/logwatch/default.conf/services/bacula.conf, scripts/logwatch/applybaculadate в /usr/share/logwatch/scripts/shared/applybaculadate, scripts/logwatch/bacula в /usr/share/logwatch/scripts/services/bacula
  57. скопировать examples/sample-query.sql в /usr/local/bacula1502/etc/query.sql, отредактировать
  58. [шифрование PKI]
  59. обеспечить вторым директором и сервером хранения создание текстовой версии БД и её резервирования
  60. проверить, что восстановленная БД работает
  61. мониторинг (шаблоны bacula-sd, bacula-dir в zabbix)
  62. через некоторое время (1.5 месяца) опять проявился глюк MariaDB с InnoDB - при старте очередного задания в момент интенсивной работы предыдущего mysqld уходит в "бесконечный" цикл (LOCK/UNLOCK/DELETE/INSERT)

Тестовые задачи

bacula-win64 содержит bacula-fd.ex (включая alldrives-fd.dll и cdp-fd.dll; отсутствует vss-fd.dll), bacula-sd.exe, bat.exe, bacula-tray-monitor.exe, bconsole.exe, а также утилиты bcopy, bextract, bls, bsleep, bsmtp, cdp-client, expr64.

Установка 9.2.1/9.2.2 на CentOS 7.5 x86-64 (директор, хранитель, текстовая консоль и клиент)

Предварительно необходимо установить и настроить MariaDB (5.5.60 из пакетов, включая пакеты mysql, mysql-server и mysql-devel), readline-devel, zlib-devel, lzo-devel, openssl-devel, krb5-devel, libacl, libacl-devel, libattr, libattr-devel, python-devel.

Процесс установки

  1. развернуть bacula-9.2.1.tar.gz
  2. [make distclean] (удаление кеша ./configure)
  3. QTDIR=/usr/lib64/qt4 PATH=/usr/lib64/qt4/bin:$PATH ./configure --prefix=/usr/local/bacula921 --mandir=/usr/local/bacula921/man --with-tcp-wrappers --with-openssl [--enable-smartalloc] --with-job-email=адрес --with-smtp-host=сервер --with-dir-user=baculad --with-dir-group=bacula --enable-batch-insert --with-sd-user=baculas --with-sd-group=bacula --with-mysql --with-subsys-dir=/var/lock/subsys --with-working-dir=/usr/local/bacula921/var --enable-lockmgr --disable-conio --enable-readline --enable-bat --disable-ipv6 --with-lzo --with-systemd --with-logdir=/var/log/bacula
  4. просмотреть результат (config.out)
  5. make [-j8]
  6. добавление bacula в /etc/group, baculad и baculas в /etc/passwd и /etc/shadow
  7. [остановить и удалить предыдущую версию] (оставлял версию bacula-fd 5.2.13 для работы с директором 5.2.13 на другом сервере)
  8. make install # в /usr/local/bacula921/
  9. mkdir /var/log/bacula
  10. chown baculad:bacula /var/log/bacula
  11. chmod 770 /var/log/bacula
  12. отредактированный ("su baculad bacula") scripts/logrotate в /etc/logrotate.d/bacula
  13. обеспечить доступ с компьютеров, на которых установлены консоли и мониторы к порту 9101
  14. обеспечить доступ директора на порт 9102 к компьютерам, на которых установлены клиенты
  15. обеспечить доступ директора на порт 9103 к компьютерам, на которых установлены серверы хранения
  16. обеспечить файловую систему для хранения файлов и права доступа
    pvcreate /dev/sda /dev/sdb
    vgcreate x130all36 /dev/sda /dev/sdb
    lvcreate --stripes 2 --stripesize 64K --name full -l +100%FREE x130all36 /dev/sda /dev/sdb
    mkfs.xfs -L bacula -d su=64k,sw=2 -i attr=2 -l su=64k,lazy-count=1 -m crc=1 /dev/x130all36/full
    mkdir /backup
    vim /etc/fstab # LABEL=bacula /backup xfs nodiratime,relatime,attr2,logbufs=8,logbsize=256k,inode64,filestreams,nobarrier 1 2
    mount /backup
    mkdir /backup/bacula
    chown baculas:bacula /backup/bacula
    chmod 750 /backup/bacula
    
  17. если имеется БД, то обновить её ("update_bacula_tables -u root -p"; update_mysql_tables позволяет обновить с версии БД 12 (bacula 5.0) до 16 (bacula 9.2)), каталог updatedb содержит скрипты для промежуточных обновлений), поменять права на скрипты и скопировать файлы конфигурации, пропустить пункты вплоть до запуска сервисов
  18. обеспечить файловую систему для MySQL на SSD
    pvcreate /dev/sdc
    vgcreate SSD /dev/sdc
    lvcreate --name mysql --size 200GB SSD
    mkfs.ext4 -j -L mysql -m 0 -O sparse_super -t largefile -v /dev/mapper/SSD-mysql
    vim /etc/fstab # LABEL=mysql /var/lib/mysql ext4 data=ordered,nodiratime,relatime,journal_checksum,delalloc,rw,nosuid,nodev,noexec,auto,nouser 1 2
    mount /var/lib/mysql
    
  19. установить MariaDB 5.5.60
  20. настроить /etc/my.cnf и /etc/my.cnf.d/mysql-clients.cnf и /etc/my.cnf.d/server.cnf по образцу (memlock?)
  21. chmod go+rx /usr/local/bacula921/etc/grant_mysql_privileges
  22. запустить "/usr/local/bacula921/etc/grant_mysql_privileges -p" под обычным пользователем (даёт права к bacula.* пользователю bacula без пароля, так что пароль надо устанавливать самому:
    mysql -u root -p
    SELECT Host, User FROM mysql.user;
    SET PASSWORD FOR 'bacula'@'localhost' = PASSWORD('пароль');
    SET PASSWORD FOR 'bacula'@'%' = PASSWORD('пароль');
    SELECT * FROM mysql.user;
    удалить ~/.mysql_history
    
  23. установить пароль в /usr/local/bacula921/etc/bacula-dir.conf, секция каталог
  24. chmod go+rx /usr/local/bacula921/etc/create_mysql_database
  25. запустить "/usr/local/bacula921/etc/create_mysql_database -u bacula -p" под обычным пользователем
  26. chmod go+rx /usr/local/bacula921/etc/{make_mysql_tables,update_mysql_tables,drop_mysql_tables}
  27. запустить "/usr/local/bacula921/etc/make_mysql_tables -u bacula -p" под обычным пользователем (update_mysql_tables обновляет формат таблиц, drop_mysql_tables очищает таблицы; архив скриптов обновлений лежит в upgradedb)
  28. cp platforms/systemd/{bacula-dir.service,bacula-fd.service,bacula-sd.service} /lib/systemd/system/ (или bacula-dir921.service и т.д.)
  29. systemctl daemon-reload
  30. отредактировать настройки /usr/local/bacula921/etc/bacula-fd.conf
  31. [systemctl start bacula-fd (нервно реагирует на тестовые запросы от zabbix; несовместимость с сервером 5.2.13)]
  32. [systemctl status bacula-fd]
  33. [systemctl enable bacula-fd]
  34. создать каталоги для пулов в /backup/bacula с правильными правами
  35. перенести и отредактировать настройки /usr/local/bacula921/etc/bacula-sd.conf
  36. chown baculas:bacula /usr/local/bacula921/etc/bacula-sd.conf /usr/local/bacula921/sbin/bacula-sd
  37. chmod 640 /usr/local/bacula921/etc/bacula-sd.conf
  38. systemctl start bacula-sd
  39. systemctl status bacula-sd
  40. systemctl enable bacula-sd
  41. перенести и отредактировать настройки /usr/local/bacula921/etc/bacula-dir.conf
  42. chown baculad:bacula /usr/local/bacula921/etc/bacula-dir.conf /usr/local/bacula921/sbin/bacula-dir
  43. chmod 640 /usr/local/bacula921/etc/bacula-dir.conf
  44. chgrp bacula /usr/local/bacula921/sbin/bsmtp
  45. systemctl start bacula-dir
  46. systemctl status bacula-dir
  47. systemctl enable bacula-dir
  48. chgrp bacula /usr/local/bacula921/etc/bconsole.conf /usr/local/bacula921/etc/bconsole # чтобы запускать консоль не с правами root
  49. настроить /usr/local/bacula921/etc/bconsole.conf
  50. опробовать /usr/local/bacula921/etc/bconsole
  51. аналогично для bat (/usr/local/bacula921/etc/bat.conf и /usr/local/bacula921/sbin/bat)
  52. вручную скопировать scripts/logwatch/logfile.bacula.conf в /usr/share/logwatch/default.conf/logfiles/bacula.conf, scripts/logwatch/services.bacula.conf в /usr/share/logwatch/default.conf/services/bacula.conf, scripts/logwatch/applybaculadate в /usr/share/logwatch/scripts/shared/applybaculadate, scripts/logwatch/bacula в /usr/share/logwatch/scripts/services/bacula
  53. chgrp bacula /usr/local/bacula921/etc/bat.conf /usr/local/bacula921/sbin/bat
  54. опробовать /usr/local/bacula921/sbin/bat
  55. накатил заплатку src/stored/askdir.c (Fix bugs #2335 and #2349 Volume messages printed many times)
  56. создать ключи и сертификаты TLS, в т.ч. открытый ключ /usr/local/bacula921/etc/имя-хоста.open.key
  57. chown baculad:bacula /usr/local/bacula921/etc/имя-хоста.open.key
  58. chmod 440 /usr/local/bacula921/etc/имя-хоста.open.key
  59. шифрование PKI
  60. обеспечить вторым директором и сервером хранения создание текстовой версии БД и её резервирования
  61. проверить, что восстановленная БД работает
  62. мониторинг (шаблоны bacula-sd, bacula-dir в zabbix)
  63. схема исключительно инкрементального копирования на дисковые массивы с архивацией и перекрёстным опылением
  64. одновременно закончились 2 задачи Copy, в результате: ERR=Lock wait timeout exceeded; похоже, что не хватило innodb_lock_wait_timeout (блокировка строк на запись в Innodb), уже увеличенного с 50 до 120 секунд; увеличил до 480 (/etc/my.cnf.d/server.cnf и "SET GLOBAL innodb_lock_wait_timeout = 480;")
  65. через некоторое время проявился глюк с InnoDB - при старте задания mysql уходит в бесконечный цикл (ждал 2 часа), шевеление БД помогает запуститься, но предсказать момент возникновения и автоматизировать шевеление не удалось; на одном из серверов (небольшое количество больших клиентов) вернулся к MyISAM, на другом (большое количество небольших клиентов) оставил InnoDB; размер БД для MyISAM меньше на треть, но блокировки не дают работать с БД параллельно

Установка 15.0.2 на CentOS 7 x86-64 (клиент)

Процесс установки (доставить пакеты gcc, gcc-c++, readline-devel, zlib-devel, lzo-devel, openssl-devel, krb5-devel, libacl, libacl-devel, libattr, libattr-devel, e2fsprogs-devel, libzstd, libzstd-devel):

  1. развернуть
  2. [make distclean]
  3. ./configure --enable-client-only --disable-build-dird --disable-build-stored --prefix=/usr/local/bacula1502 --mandir=/usr/local/bacula1502/man --with-openssl --enable-smartalloc --with-subsys-dir=/var/lock/subsys --with-working-dir=/usr/local/bacula1502/var --disable-conio --enable-readline --disable-ipv6 --with-lzo --with-systemd --with-logdir=/var/log/bacula --with-zstd=yes [--with-baseport=9104]
  4. просмотреть результат (config.out)
  5. make [-j8]
  6. [остановить старую версию, если не хотим оставить её для совместимости со старым директором]
  7. make install
  8. настроить клиента
    1. отредактировать /usr/local/bacula1502/etc/bacula-fd.conf (имя директора и пароль; имя монитора и пароль; имя директора в секции сообщений, другой порт, если ставили рядом со старой версие)
    2. дырка на входной порт 9102
    3. обеспечить доступ к серверу хранения (порт 9103)
    4. для systemd
      • cp platforms/systemd/bacula-fd.service /lib/systemd/system/ (или bacula-fd1502.service)
      • systemctl daemon-reload
      • systemctl start bacula-fd1502
      • systemctl status bacula-fd1502
      • systemctl enable bacula-fd1502
    5. для initd
      • make install-autostart-fd
      • [добавить "export LANG=" в /etc/rc.d/init.d/bacula-fd, если система русифицирована]
      • service bacula-fd start
      • service bacula-fd status
    6. добавить клиента в настройки директора и хранителя
    7. тестирование

Установка 9.2.2 на CentOS 6, CentOS 7 x86-64 (клиент[, консоль])

Процесс установки (доставить пакеты gcc, gcc-c++, readline-devel, zlib-devel, lzo-devel, openssl-devel, krb5-devel, libacl, libacl-devel, libattr, libattr-devel, tcp_wrappers-devel, e2fsprogs-devel):

  1. развернуть
  2. make distclean
  3. ./configure --enable-client-only --disable-build-dird --disable-build-stored --prefix=/usr/local/bacula1502 --mandir=/usr/local/bacula1502/man --with-openssl --enable-smartalloc --with-subsys-dir=/var/lock/subsys --with-working-dir=/usr/local/bacula1502/var --enable-lockmgr --disable-conio --enable-readline --disable-ipv6 --with-lzo --with-systemd --with-logdir=/var/log/bacula --with-zstd=yes
  4. просмотреть результат (config.out)
  5. make -j8
  6. [остановить старую версию, если не хотим оставить её для совместимости со старым директором]
  7. make install
  8. консоль, если она тут нужна (а зачем она тут?)
    1. дырка на порт 9101 директора
    2. настроить /usr/local/bacula922/etc/bconsole.conf
    3. права доступа к /usr/local/bacula922/etc/bconsole.conf, /usr/local/bacula922/sbin/bconsole и /usr/local/bacula922/etc/bconsole, чтобы запускать консоль не с правами root
    4. опробовать /usr/local/bacula922/etc/bconsole
  9. настроить клиента
    1. отредактировать /usr/local/bacula922/etc/bacula-fd.conf (имя директора и пароль; имя монитора и пароль; имя директора в секции сообщений, другой порт, если ставили рядом со старой версие)
    2. дырка на входной порт 9102
    3. обеспечить доступ к серверу хранения (порт 9103)
    4. дляsystemd
      • cp platforms/systemd/bacula-fd.service /lib/systemd/system/ (или bacula-fd922.service)
      • systemctl daemon-reload
      • systemctl start bacula-fd922
      • systemctl status bacula-fd922
      • systemctl enable bacula-fd922
    5. для initd
      • make install-autostart-fd
      • [добавить "export LANG=" в /etc/rc.d/init.d/bacula-fd, если система русифицирована]
      • service bacula-fd start
      • service bacula-fd status
    6. добавить клиента в настройки директора и хранителя
    7. тестирование

Установка 5.2.13 на CentOS 7.4 x86-64 (клиент) из пакетов

Процесс установки

  1. обеспечить доступ с компьютеров, на которых установлены консоли и мониторы к порту 9101
  2. обеспечить доступ директора на порт 9102 к компьютерам, на которых установлены клиенты
  3. обеспечить доступ к серверу хранения (порт 9103)
  4. установка пакетов bacula-client, bacula-common, bacula-libs
  5. добавить в tray-monitor.conf новую секцию Client и перезапустить монитор
  6. добавить в bacula-sd.conf новые секции и перезапустить сервер хранения
  7. добавить в bacula-dir.conf новые секции Job и Client (и всё что они тянут: FileSet, Schedule, Storage, Pool) и перезапустить директор (reload в консоли)
  8. отредактировать настройки /etc/bacula/bacula-fd.conf (имя директора и пароль; имя монитора и пароль; имя клиента)
  9. systemctl start bacula-fd
  10. попробовать запустить задание вручную из консоли (run)
  11. systemctl enable bacula-fd

Установка 5.2.13 на CentOS 7.1 x86-64 (директор, хранитель, текстовая консоль и клиент) из пакетов

Предварительно необходимо установить и настроить MySQL (5.5.41 из пакетов, включая пакеты mysql, mysql-server и mysql-devel)

Процесс установки (без графики):

  1. обеспечить доступ с компьютеров, на которых установлены консоли и мониторы к порту 9101
  2. обеспечить доступ директора на порт 9102 к компьютерам, на которых установлены клиенты
  3. обеспечить доступ директора на порт 9103 к компьютерам, на которых установлены серверы хранения
  4. установка пакетов bacula-client, bacula-common, bacula-libs, bacula-console, bacula-director, bacula-libs-sql, bacula-storage
  5. alternatives --config libbaccats.so # поменять на mysql
  6. cd /usr/libexec/bacula
  7. sed -i -e 's/default_db_type=postgresql/default_db_type=mysql/g' *
  8. пользователи baculas и baculad и группа bacula с нужными идентификаторами
  9. права доступа к файловому хранилищу (при необходимости создать или передать со старого сервера)
  10. перенос файлов с томами с предыдущего сервера (тоже версия 5.2)
  11. chown baculad:bacula {/var/spool/bacula,/var/log/bacula}
  12. chmod g+w {/var/spool/bacula,/var/log/bacula}
  13. chmod go+rx /usr/libexec/bacula/grant_mysql_privileges
  14. запустить "/usr/libexec/bacula/grant_mysql_privileges -p" под обычным пользователем (даёт права к bacula.* пользователю bacula без пароля, так что пароль надо устанавливать самому:
    mysql -u root -p
    SELECT Host, User FROM mysql.user;
    SET PASSWORD FOR 'bacula'@'localhost' = PASSWORD('пароль');
    SET PASSWORD FOR 'bacula'@'%' = PASSWORD('пароль');
    SELECT * FROM mysql.user;
    удалить ~/.mysql_history
    
  15. установить пароль в /etc/bacula/bacula-dir.conf
  16. журнал
  17. chmod go+rx /usr/libexec/bacula/create_mysql_database
  18. запустить "/usr/libexec/bacula/create_mysql_database -u bacula -p" под обычным пользователем
  19. chmod go+rx /usr/libexec/bacula//make_mysql_tables (update_mysql_tables, drop_mysql_tables)
  20. сделать копию БД bacula на старом сервере "mysqldump -f --opt bacula --add-drop-table --add-locks --disable-keys --user=bacula -p > имя.sql"
  21. удалить "ENGINE=MyISAM" ("sed -i 's/ENGINE=MyISAM/ENGINE=InnoDB/' имя.sql")
  22. загрузить её на новом сервере: "mysql --user=bacula bacula -p < имя.sql" (XtraDB Compact заняло в 1.47 раза больше места, чем Aria; время загрузки базы Aria вдвое меньше; время запуска большого задания одинаково; требования к памяти в несколько раз меньше для Aria)
  23. перенести и отредактировать настройки bacula-sd.conf, bacula-fd.conf, bacula-dir.conf
  24. создать ключи и сертификаты TLS
  25. chgrp bacula /etc/bacula/x134.cs.niisi.ras.ru.open.key
  26. chmod g+r /etc/bacula/x134.cs.niisi.ras.ru.open.key
  27. исправить пользователя и группу в /etc/sysconfig/bacula-sd, systemctl start bacula-sd, протестировать, systemctl enable bacula-sd
  28. исправить пользователя в /etc/sysconfig/bacula-dir, systemctl start bacula-dir, протестировать, systemctl enable bacula-dir
  29. systemctl start bacula-fd, протестировать, systemctl enable bacula-fd
  30. права доступа к /etc/bacula/bconsole.conf, чтобы запускать консоль не с правами root
  31. опробовать bconsole
  32. права чтения к bacula-dir.conf для baculad, иначе не будет работать команда reload
  33. задать пароль внутри /usr/libexec/bacula/make_catalog_backup (лучше через --defaults-file=); обеспечить правильные права доступа к этому файлу
  34. ?обеспечить внешними средствами (например, вторым директором и сервером хранения) создание текстовой версии БД и её резервирования
  35. ? проверить, что восстановленная БД работает

Установка 1.38.4 на Windows 2003 (только клиент и консоль из .exe)

Процесс установки клиента:

  1. установка должна производиться с правами администратора/администратора домена (устанавливается как сервис)
  2. выбрать компоненты (клиент, документация, консоль, wx-консоль)
  3. указать каталог для установки (c:\bacula)
  4. отредактировать bacula-fd.conf (имя и пароль директора и монитора; кстати, директива Monitor в версии 1.38.4 не распознаётся; имя директора в ресурсе Messages)
  5. установить как системный сервис, т.е. будет запускаться при старте ОС
  6. дырка на входной порт 9102 (netsh firewall ...)
  7. обеспечить доступ к серверу хранения (порт 9103)
  8. для первого раза запустить из панели управления (администрирование -> службы)
  9. netstat -an (должен прослушиваться порт 9102)
  10. должна появиться иконка в трее (у меня не появляется, т.к. захожу через rdesktop)
  11. bacula-fd.exe /status
  12. Диспетчер задач (Ctrl-Alt-Del) должен показывать bacula-fd в списке процессов под пользователем SYSTEM (при работе в домене возможно потребуется сменить SYSTEM на идентификатор администратора домена)

Если сервис не запускается, то можно проверить синтаксис:

cd c:\bacula\bin
bacula-fd -t >out
type out

Если сервис не запускается, то можно получить трассировку в файле bacula.trace:

bacula-fd -d100 -c c:\bacula\bin\bacula-fd.conf
выполнить команду "trace on" в консоли
запустить задание и завершить работу bacula-fd

Эксклюзивно открытые файлы не сохраняются (если не включить поддержку Volume Shadow Copy Service - VSS - в XP и 2003 и в настройках FileSet; при этом файлы сохраняются на момент начала выполнения задания - делается snapshot файловой системы; нельзя выполнять несколько заданий параллельно; команда status client позволяет узнать о наличии VSS, но она может быть не запущена; реальное использование VSS указывается в отчёте о завершении задания: "VSS Backup Job...", "Generate VSS snapshots"). Полезная утилита vssadmin позволяет узнать о проблемах.

О сохранении системного реестра необходимо позаботиться отдельно (regedit /e). При отсутствии VSS рекомендуется предварительно сохранять состояние системы (systemstate.bkf надо сохранить потом с помощью bacula):

ntbackup backup systemstate /F c:\systemstate.bkf

Информация о владельцах файлов и правах доступа сохраняются, если выключён режим совместимости (portable yes). Зато файлы невозможно восстановить с помощью ОС, отличной от MS Windows NT/2K/XP/2003, пока этот режим не включить. В том числе не работают утилиты bls и bextract (заработали в версии 3.0?).

Настройка консоли:

  1. В ресурсе Director должно быть указано описание директора с произвольным паролем
  2. В ресурсе Console определяется имя консоли и пароль соответствующие настройкам директора (ресурс Console директора определяет набор ACL)

При частичном восстановлении недостающие каталоги создаются, принадлежащими пользователю SYSTEM, что может вызвать проблемы доступа (cacls).

Опции запуска:

Новая версия устанавливается в "c:\Program Files\Bacula\bin", а настройки в "c:\Documents and Settings\All Users\Application Data\Bacula".

Шифрование трафика

Для шифрования потоков (шифровать трафик между директором и сервером хранения не обязательно, т.к. они находятся на одном хосте) с помощью TLS (описание директив) необходимо (используется собственный CA, предполагается полное соответствие между IP адресами и полными именами DNS во всех участвующих узлах сети):

Перенос сохранённых данных на новое место (миграция)

В bacula имеются средства переноса данных резервного копирования на новое место (в версии 3 добавлена возможность копирования, в версии 5 добавлена возможность работать внутри одного пула, в версии 7 добавлен перенос между серверами хранения). Для этого необходимо описать и запустить (возможно из планировщика) управляющее задание типа Migrate, которое:

Ограничения и неприятности:

Использование заданий миграции для переноса части заданий на новое устройство (массив, NFS, NAS):

В связи с ограничениями (версия 3) возможностей миграции (нельзя копировать, нельзя мигрировать данные между серверами хранения) создание "противопожарной" копии пришлось делать с помощью скриптов:

Сохранение и восстановление каталога (БД)

Резервирование каталога при использовании схемы перекрёстного опыления (2 директора):

Восстановление каталога при схеме перекрёстного опыления:

При наличии только одного директора восстановить каталог обычными средствами невозможно, но можно (после установки ОС и bacula с нуля) поменять bootstrap файл на созданный при сохранении текстовой копии каталога, остальные параметры также необходимо установить правильно) и выполнить (run) задачу RestoreFiles.

Если bootstrap файл пропал вместе с БД (или не был сделан), то придётся использовать утилиту bextract (bls) или узнать имя тома, идентификатор сессии и время сессии из почтовых сообщений и сделать из этой информации bootstrap файл.

Если копия БД не была сделана или её невозможно восстановить, то необходимо создать новый пустой каталог (make_bacula_tables), запустить и остановить директора (он создаёт таблицы с описанием клиентов и серверов хранения), утилитой bscan восстановить содержимое БД непосредственно из томов (работает не всегда).

Формат bootstrap файла

Файл bootstrap (.bsr, ASCII) позволяет bacula (или bextract) узнать откуда извлекать данные при восстановлении без доступа к БД. Создаётся (Full; Copy - это тоже как бы Full, в результате bsr портится данными от копии с неожиданной датой к которой потом дописываются последующие инкрементальные задания) или дополняется (Incremental, Differential, Virtual Full тоже дописывает в конец файла, для восстановления его начало надо обрезать вручную) автоматически при выполнении задания (имя файла задаётся директивой Write Bootstrap, для восстановления всех файлов) или командой restore (для восстановления указанных файлов, оптимизируется чтобы не восстанавливать далее удаляемое). Может быть создан в текстовом редакторе из текста письма. Может быть использован в задаче восстановления ("run job=RestoreFiles"). Представляет собой текстовый файл, разбитый на строки. Строки, начинающиеся с "#" - это комментарий. Имена заключаются в двойные кавычки. Каждая строка является фильтром для программы восстановления и представлена в виде "ключ=значение", ключ Volume разбивает файл на секции, различные ключи внутри секции сочетаются как AND, одинаковые как OR:

Автономные утилиты

Для каждой утилиты необходимо задать (с помощью ключа "-c") имя конфигурационного файла bacula-sd.conf и первым параметром имя устройства (при архивации на ленту реальное имя устройства типа /dev/nst0; при архивации на диск - полное имя файла, при этом имя файла рассматривается как имя тома, а имя каталога должно соответствовать описанию устройства в bacula-sd.conf). Длина командной строки ограничена (511 байт?).

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

Для реально автономной работы требуется статическая сборка.

bls - получение списка файлов (в размере обрезаются младшие цифры для больших файлов). Утилита ничего не знает о шифровании и дополнительных правах доступа. Проблемы при обработке заданий Virtual Full. Ключи:

Проверка "читаемости" архивов:

/usr/local/bacula/sbin/bls -c /usr/local/bacula/etc/bacula-sd.conf -p -j -E /backup/bacula/*/* > /tmp/bls.all.log
egrep -v 'bls JobId 0: End of Volume|End of all volumes|Using device:|Errors=0|acquire.c:200|Volume Record:|End Job Session Record:|Begin Job Session Record:' /tmp/bls.all.log|less

или с учётом возможности "падения" bls и необходимости параллелизма

cd /backup/bacula
echo */* | xargs --max-args=1 --max-procs=потоков bls.sh

где bls.sh:
d=`dirname $1`
f=`basename $1`
/usr/local/bacula/sbin/bls -c /usr/local/bacula/etc/bacula-sd.conf -p -j -E /backup/bacula/$d/$f > /tmp/bls/$d.$f.log

bextract - восстановление файлов на "голой" системе. Вторым параметром указывается имя каталога назначения (добавляется к именам востанавливаемых файлов; буква диска из исходных имён файлов удаляется). Утилита ничего не знает о шифровании. Не умеет восстанавливать ACL ("Error: Unknown stream=1998 ignored. This shouldn't happen!") и зашифрованные данные. Восстановление данных в непереносимом формате Win32 на UNIX/Linux платформе появилось в версии 3. Ключи:

bscan - восстановление информации о выполненных заданиях (тома, задания, файлы) в БД по содержимому тома с данными. Если восстанавливается информация об очень старом томе, то она может быть автоматически удалена при выполнении следующего задания, как устаревшая, так что необходимо сразу же её защитить (например, изменить состояние тома командой "update volume" на Read-Only). Не всё понимает: "SOS_LABEL: Job record not found for JobId: 0" (RunAfter). Номера заданий создаются новые. Утилита bscan 9.2.1 восстановила неправильно и в конце упала (и это не первый раз). Перед запуском bscan на чистой базе необходимо предварительно запустить директора с правильным bacula-dir.conf, чтобы он создал записи Client и Storage (они не сохраняются в тома). Ключи:

bcopy - копирование тома. Информация в БД не заносится. Вторым параметром указывается имя устройства для записи. Позволяеи копировать данные между лентами разных типов, лентой и файлом. Ключи:

btape ключи имя-устройства - ручное управление НМЛ, с диском не работает, команды: bsf, bsr, cap (выдача списка описанных и реальных возможностей устройства), clear, eod, eom, fill (тестирование ёмкости), unfill, fsf, help, label, load, quit, rawfill, readlabel, rectest, rewind, scan, scanblocks, speed (тестирование скорости), status, test (автоматическая проверка соответствия свойств устройства описанию), weof, wr, rr, rb, qfill. Ключи:

bsmtp - вспомогательная программа, использующаяся при посылке почты.

dbcheck - проверка и очистка БД. Перед запуском необходимо остановить директора. Некоторые проверки (orphaned {File,Path,Filename}) выполняются очень (часы и сутки!) медленно и хотят дополнительных индексов и соответствующего места под копии таблиц (добавление индекса, проверка, удаление индекса), ускорено в версии 3, достаточно быстро в 9.2.1 (БД на 100 млн строк в File в пределах часа - InnoDB, SSD). "Eliminate orphaned Path records" не работает, если хоть одно задание имеет HasCache=1. Необходимо запускать регулярно (раз в год) для удаления мусора, который bacula ленится чистить во время работы (dbcheck может очистить половину). После очистки желательно сделать "OPTIMIZE TABLE ...", т.к dbcheck не освобождает место на диске, а только помечает его свободным в БД. Для починки БД используейте средства самой СУБД. Ключи:

Удаление индекса после аварийно завершённого dbcheck:

show index from File;
drop index idxPIchk on File;

bregex - тестирование регулярных выражений на указываемом файле. Регулярные выражения вводятся интерактивно. Ключи:

bwild - тестирование шаблонов на указываемом файле. Шаблоны вводятся интерактивно. Ключи:

testfind позволяет тестировать настройки Include.

Изменения

Изменения 15.0.2 относительно 13.0.4

Изменения 13.0.4 относительно 11.0.6

Изменения 11.0.6 относительно 9.6.7

Изменения 9.6.7 относительно 9.4.4

Изменения 9.4.4 относительно 9.2.2

Изменения 9.2.2 относительно 9.0.8

Изменения 9.0.8 относительно 7.4.7

Изменения 7.4.7 относительно 7.0.5

Изменения 7.0.5 относительно 5.2.13

Изменения 5.2.13 (RHEL 7.1) относительно 5.2.6

Изменения 5.2.6 относительно 5.0.3

Изменения 5.0.3 относительно 5.0.2

Изменения 5.0.2 относительно 3.0.3 (номер версии 4 зарезервирован для Enterprise):

Изменения 3.0.3 относительно 3.0.1

Изменения 3.0.1 относительно 2.4.4

Изменения 2.4.4 относительно 2.4.1

Изменения 2.4.1 относительно 2.2.8

Изменения 2.2.8 относительно 2.2.6

Изменения 2.2.6 относительно 2.2.0

Изменения 2.2.0 относительно 2.0.3

Изменения 2.0.3 относительно 2.0.0

Изменения 2.0.0 относительно 1.38.11

Изменения 1.38.11 относительно 1.38.4

Ссылки

@ Карта сайта News Автора!

Bog BOS: Сетевая система резервного копирования и восстановления данных bacula

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru