Начитавшись Харба, решил перейти от самописных скриптов для создания бэкапов к боле профессиональному решению на основе bacula.
Здесь я попытаюсь рассказать как можно организовать бэкап своей домашней машины с помощью bacula.
Статья в основном предназначена для начинающих пользователей, которые только начинаю задумываться о бэкапах, но, возможно, будет полезна и для администраторов со стажем, как введение в возможности системы bacula.
Для начала кратко рассмотрим основные особенности bacula, иначе будет тяжело понять что именно мы настраиваем.
Что такое bacula?
Сетевая система резервного копирования и восстановления данных bacula позволяет сохранять данные с многочисленных компьютеров в сети на ленточные стримеры, DVD или жёсткие диски, а также в последствии восстанавливать эти данные. Распространяется практически под лицензией GPLv2, остальное LGPL. При этом компания Bacula Systems предлагает платную тех-поддержку и обучение работы с системой Bacula Enterprise Edition (как я понял, просто стабильная и отлаженная версия bacula).
Серверная часть может работать под управлением Linux, FreeBSD, Solaris, MS Windows. Клиенты под Linux, FreeBSD, Solaris, Win32 (W98, Me, NT, 2000, XP, 2003), Win64 (Vista), MacOS X/Darwin, OpenBSD, Irix, Tru64.
Система состоит из набора сервисов (процессов) пяти типов:
- Директор (director) — основной процесс, который формирует задания (бэкап, восстановление, и т.д) согласно расписанию и управляет серверами хранения и клиентами; обеспечивает взаимодействие с базой данных (MySQL, PostgreSQL, SQLLite) для хранения информации о заданиях, томах (в случае лент том ~ стример, для DVD и HDD том ~ файл); необходимая информация для восстановления задания из тома, в случае утери БД может быть сохранена в текстовый файл (bootstrap); информацию о файлах получает с сервера хранения в процессе резервного копирования; информация о файлах различных клиентов может храниться в различных БД; управляется с консоли; показывает статус монитору; обычно устанавливается один сервер на сеть
- Сервер хранения (storage server) -управляется директором; записывает или читает данные на ленты, DVD или жесткие диски; обменивается данными с файловым сервером; показывает статус монитору; должен быть установлен на каждом компьютере на которых будут хранится бэкапы.
- Файловый сервер (file server, client) — управляется директором; читает или записывает данные из локальной файловой системы; обменивается данными с сервером хранения; показывает статус монитору; должен быть установлен на каждый компьютер, данные с которого необходимо резервировать.
- Консоль управления (bconsole)- текстовая консоль, позволяет управлять директором; так же есть графические клиенты — bgnome-console, bwx-console, bat (полноценный графический клиент) и веб интерфейс — Webacula(сайт проекта sourceforge.net/projects/webacula, не тестировал); устанавливается на компьютере администратора и оператора или рядом с директором
- Монитор (bacula-tray-monitor) — позволяет отслеживать статус директоров, файловых серверов и серверов хранения, обычно устанавливается на компьютере администратора или оператора. Можно обойтись и без него.

Схема взаимодействия сервисов bacula
Можно выделить следующие особенности bacula:
- Сервисов каждого типа может быть произвольное количество (минимум по одному), расположение различных сервисов в сети определяется администратором.
- Есть возможно восстановления с нуля, т.е. восстановление клиента на чистый винчестер.
- Информация хранится в БД ограниченное время. После удаления информации о файлах из базы можно восстановить только всё задание целиком.
- Естественно поддерживает полный, дифференциальный и инкрементальный типы резервирования.
- Сжатие данных производится пофайлово на стороне клиента (gzip), что позволяет минимизировать вред от ошибок чтения.
- Для записи на DVD (-R, +R, -RW, +RW) используется growisofs. Предварительно поток кешируется в файл, а при достижении оговоренного размера содержимое кеша записывается как сессия на DVD. bacula не может записывать на болванку, на которой сформирована файловая система.
- Данные с клиентов сохраняются в томах (магнитная лента, DVD или файл). На один том можно записывать произвольное количество заданий. Одно задание может быть разбито на несколько томов.Тома, в свою очередь, группируются в пулы томов.
Есть у этой системы резервного копирования и своя ложка дегтя, процитирую оригинал:
Для индивидуального применения лучше подыскать другую программу (эта слишком тяжела в развёртывании), зато после настройки работает в полностью автоматическом режиме. Плохо переносит резкие смены конфигурации. Плохая обработка ошибок при работе с диском (заполненный диск, глюки с созданием нового тома при наличии файла) и сетью, перезагрузке серверов и клиентов, завершившиеся с ошибкой задания остаются в БД навсегда (и, вообще, БД не чистится от мусора). Хорошо хоть оператора извещает. Много ручной работы (беготня по меню), нет создания нескольких копий одновременно, нет консолидации частично заполненных носителей, нет автоматического обнаружения новых серверов, файловых систем, СУБД. Ручная установка как серверов, так и клиентов. Средства перехода на новую версию — вручную.
Довольно неплохо и более подробно рассказано что такое bacula здесь: http://www.bog.pp.ru/work/bacula.html.
Постановка задачи.
Задача стояла следующая — делать полный бэкап системы на домашнем компьютере, чтоб даже в случае выхода из строя винчестера можно было бы все восстановить, а не устанавливать и настраивать с нуля.
Для этого у меня есть 3 винчестера. Два из них, суммарным объемом 240 Гб, объединены с помощью LVM и поделены на следующие разделы /boot/, swop, /, /home/, /media/data/. А на третьем создано два раздела /media/video (~ 650 Гб) и /backup/(~30 Гб). Исходя из такой структуры будет делаться бэкап следующих разделов /, /boot/, /home/. В этом случае даже при утере одного из винчестеров, я всегда смогу восстановить жизнеспособность системы, не гарантируя восстановления разделов на которых хранится мультимедиа video и data.
Кроме того, я считаю, что раздел с бэкапом должен быть примонтирован только на время создания бэкапа, дабы после «случайного» rm -rf / бэкап уцелел.
Установка bacula
В репозиториях ubuntu 9.04 нашлась версия 2.4.4, и хотя на данный момент уже вышла версия 5.0.1 (список изменений http://www.bacula.org/en/?page=news), вторая ветка остается актуальной и поддерживается сообществом. Так как мне возможностей второй ветки хватало, то решил остановится на ней.
Установка никаких сюрпризов не преподнесла. Из баз данных близко знаком только с MySQL, поэтому вопрос в выборе БД не стоял.
$ sudo aptitude install bacula
[sudo] password for vanuch:
Reading package lists... Done
Building dependency tree
Reading state information... Done
Reading extended state information
Initializing package states... Done
The following NEW packages will be installed:
bacula bacula-client{a} bacula-common{a} bacula-console{a} bacula-director-common{a} bacula-director-mysql{a} bacula-fd{a} bacula-sd{a} bacula-sd-mysql{a} bacula-server{a} dbconfig-common{a} gawk{a} mtx{a}
0 packages upgraded, 13 newly installed, 0 to remove and 0 not upgraded.
Need to get 4099kB of archives. After unpacking 11.5MB will be used.
Do you want to continue? [Y/n/?]
Собственно и вся установка для ubuntu:)
Настройка
Каждый сервис имеет собственный файл настройки, имя которого можно задать при запуске (ключ "-c"). Файлы называются bacula-sd.conf, bacula-fd.conf, bacula-dir.conf, bconsole.conf (bat.conf) и tray-monitor.conf соответственно. В случае Ubuntu файлы конфигурации лежат в папке /etc/bacula/, для другого дистрибутива это может быть не так. Из-за того, что в файлах настройки содержатся в открытом виде пароли для доступа ко всем процессам bacula, то доступ на чтение есть только у пользователя bacula.
Каждый конфигурационный файл состоит из «ресурсов». Ресурс, в свою очередь, состоит из имени и перечня директив в фигурных скобках. Каждая директива располагается на отдельной строке и состоит из имени и значения, разделённых знаком равенства. Пробелы в имени являются незначащими, прописные и строчные буквы не различаются. Значение, содержащее пробелы и прочие символы, необходимо заключать в кавычки. Обратная косая черта маскирует специальное значение следующего символа. Пустые строчки и символы от знака '#' до конца строки игнорируются. Символ ';' означает конец директивы, далее может идти следующая директива. Конструкция '@имя-файла' на месте любой лексемы включает содержимое указанного файла. Каждый ресурс должен иметь директиву Name (с уникальным значением) и может иметь директиву Description.
Например:
Storage {
Name = FileStorage; Description = "huge hard disk storage"
Address ...
}
Во всех файлах настройки задаётся ресурс Messages, который управляет рассылкой сообщений, в зависимости от типа сообщения и имени задания. Можно задавать несколько ресурсов Messages для заданий различного типа (имя ресурса Messages указывается при описании задания). Сообщение может быть отправлено в несколько мест назначения (в syslog и по e-mail) или не отправлено никуда. Рекомендуется настраивать файловые сервера и сервера хранения так, чтобы все сообщения пересылать директору — это позволяет централизовать обработку сообщений.
При установке создаются практически работоспособные файлы конфигураций. Если быть точным, то в конфигах приведены шаблоны для основных типов устройств хранения. Достаточно только прописать пути для устройств хранения и список файлов которые будут бэкапиться. и, в принципе, уже можно будет сделать резервную копию системы.
Что изначально не захотело работать — бэкапы базы данных bacula, и уведомления на почту.
Начну с самых простых файлов конфигурации. Более подробно о различных параметрах и ресурсах можно прочесть на английском здесь: http://www.bacula.org/5.0.x-manuals/en/main/main/Bacula_Main_Reference.html или на русском здесь: http://www.bog.pp.ru/work/bacula.html.
Файл настройки консоли bconsole, содержит только ресурс с описанием директора, лучше здесь ничего не трогать:
Director {
Name = localhost-dir #имя директора
DIRport = 9101 #порт по которому bconsole подключается к директору
address = localhost #адрес директора
Password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/" #на самом деле пароль посложнее:)
}
В файле bacula-fd.conf, отвечающем за настройки файлового сервера (File Server) должно содержатся минимум три ресурса — Director, FileDeamon, Messages. У меня изначально присутствовал еще ресурс Director для tray-monitor (гномовская утилита для мониторинга состояния сервисов bacula), но я его не использую, поэтому это ресурс был удален из конфига.
Director { #настройки соединения с управляющим директором
Name = host_name-dir
Password = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
FileDaemon { настройки клиента
Name = host_name-fd
FDport = 9102 # порт по которому директор подключается к файл серверу
WorkingDirectory = /var/lib/bacula
Pid Directory = /var/run/bacula
Maximum Concurrent Jobs = 20 # количество одновременных заданий, опрос состояния так-же считается заданием, поэтому устанавливать 1 не рекомендуется
}
# отправлять всю информацию, кроме пропущены и восстановленных файлов директору
Messages {
Name = Standard
director = host_name-dir = all, !skipped, !restored
}
Этот конфиг так же рекомендую оставить без изменений, все работоспособно с дефолтными настройками.
Два последних файл настройки уже нуждаются в редактировании.
За настройку Сервера хранения (storage server) отвечает файл bacula-sd.conf.
В файле уже прописаны шаблоны настроек для различных устройств хранения: жесткий диск, два и больше жестких дисков с поочередным использование организованные в автоматическую библиотеку, ленточные стримеры и DVD диски. Минимум, что нужно сделать, чтобы получить работоспособный файл конфигурации — просто расскоментировать ту часть конфига, которая соответсвует вашему устройству хранения, и указать реальный путь к этому устройству.
Должны присутсвовать следующие ресурсы — Storage, Director, Device, Messages. Так же возможно присутствие ресурса Autochanger, который позволяет сгруппировать устройства, входящие в одну автоматизированную библиотеку. По умолчанию, как и для bacula-fd.conf, присутствовало два ресурса Director — один для для управления сервером хранения, второй для tray-monitor.
Ресурсы Director и Messages ничем не отличаются от рассмотреных ранее. Отмечу только что пароль для директора может быть отличен от паролей для других сервисов. Ресурс Storage это настройки и описание самого сервера хранения, должен быть один для каждого storage server.
Выглядит он так:
Storage { # идентификация и общие настройки
Name = host_name-sd
SDPort = 9103 # порт по которому директор подключается к серверу хранения
WorkingDirectory = "/var/lib/bacula"
Pid Directory = "/var/run/bacula"
Maximum Concurrent Jobs = 20
}
Ресурсы Storage, Director и Messages можно оставить как есть.
Самое же интересное для нас это Device. Здесь мы описываем куда будут сохранятся наши бэкапы. За исключением некоторых ограничений так же только один ресурс для каждого сервера хранения (исключение автоматизированные библиотеки), т.е. если мы захотим сохранять бэкапы на разные устройства, нам для каждого из них нужно иметь свой сервер хранения. В случае с хранением бэкапа на жестком диске ресурс Device будет выглядеть так:
Device {
Name = FileStorage #имя, на него будет ссылаться директор
Media Type = File #логический тип устройства хранения, по сути может быть что угодно, для каждого типа устройства записи должно быть уникально. т.е. для HDD одно(но для разных HDD можно одинаковый тип), для DVD второе, для различных тип ленточных стримеров так же должны быть различные имена.
Device Type = File #File, DVD, Tape, FIFO
Archive Device = /backup #путь к устройству хранения
LabelMedia = Yes; # bacula будет сама присваивать метки томам
Removable media = No; # Yes для DVD и внешних HDD
Random Access = Yes; # Yes для DVD и HDD (поддерживают lseek(2))
AutomaticMount = Yes;
}
Так же нужно не забыть создать каталог указанный в конфиге и дать права на запись пользователю bacula:
# mkdir /backup
# chown bacula:bacula /backup/
В случае DVD дисков предоставляется возможность их автоматически монтировать, но с разделами HDD этот функционал почему-то не работает.
Перейдем к файлу настройки директора (Director Server). Здесь ресурсов значительно больше, условно из можно поделить на несколько групп:
- Общие настройки директора, подключений к остальным сервисам и уведомлений.
- Настройки заданий и расписаний ихнего выполнения.
- Списки файлов для хранения и правила их хранения.
К первой категории я отнес ресурсы Director, Client, Storage, Catalog, Messages, Console. Из названий, я думаю понятно за что они отвечают.
Ко второй можно отнести ресурсы:
- JobDefs — позволяет описать стандартные настройки для ряда заданий (job), используется для упрощения внесения изменений в задания.
- Job — сами задания, есть несколько типов заданий это Backup, Restore, в последней версии также Verify(проверка бэкапов) и Admin (например, очистка каталога), Migrate (перенос бэкапов на новое место). Директивы (параметры) имеют преимущество над директивами заданными в JobDefs, т.е. для каждого задания мы можем переопределить настройки заданные по умолчанию.
- Schedule — расписание выполнения заданий, можно определить несколько различных расписаний для различных типов заданий или одно для всех заданий. Тип резервирования (полный, инкрементный) указанный в schedule имеет преимущество на типом указанным в задании.
И к третей группе ресурсов я отнес следующие:
- FileSet — описание списка файлов которые будут бэкапится
- Pool — настройки и описания томов. Дело в том что bacula работает не напрямую с томами, а с ихней совокупностью, которая и описывается в ресурсе Pool. Например, можно настроить количество томов, их размер, время через которое будет удален и метки которые будут присвоены новым томам.
Пример реального конфига:
Director { # настройка самого директора
Name = host_name-dir
DIRport = 9101 # порт для подключения к директору
QueryFile = "/etc/bacula/scripts/query.sql" #набор скриптов с помощь которых bacula обращается к базе данных
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Maximum Concurrent Jobs = 1 # максимальное количество конкурирующих заданий, если вы точно не уверены, что делаете, то оставьте равным 1
Password = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/" # Пароль для подключения консоли к директору, должен совпадать с паролем в bconsole.cong
Messages = Daemon
DirAddress = 127.0.0.1 # разрешать подключения только на указанный адрес, если нужно разнести консоль и директор, по умолчанию разрешены все доступные адреса
}
JobDefs { #набор стандартных настроек для заданий
Name = "DefaultJob"
Type = Backup #тип задания
Level = Incremental #тип бэкапа
Client = host_name-fd
FileSet = "Full Set" #что бэкапить(список файлов)
Schedule = "WeeklyCycle" #расписание бэкапов
Storage = File #на какой сервер хранения сохранять
Messages = Standard #имя сервера сообщений
Pool = Default #какой набор томов использовать
Priority = 10 #приоритет, максимальный 1.
}
# задание по бэкапу нашего домашнего сервера
Job {
Name = "Client1"
JobDefs = "DefaultJob"
RunBeforeJob = "sudo mount /backup" #Запустить перед созданием бэкапа
RunAfterJob = "sudo umount /backup"#Запустить после создания бэкапа
Write Bootstrap = "/var/lib/bacula/Client1.bsr" #текстовый файл в котором указано сколько файлов, когда и куда были сохранены во время выполнения задания
}
# Так же неплохо было бы хранить резервную копию базы данных bacula
Job {
Name = "BackupCatalog"
JobDefs = "DefaultJob"
Level = Full #изменяем уровень бэкапа по умолчанию,
FileSet="Catalog" # список файлов для бэкапа, и т.д.
Schedule = "WeeklyCycleAfterBackup"
# перед бэкапом запускаем скрипт который сформирует файл bacula.sql с содержимым БД
RunBeforeJob = "/etc/bacula/scripts/RunBeforeCatalog"
# А после бэкапа удаляем его (файл весит ~200Mb) чтоб не занимать место
RunAfterJob = "/etc/bacula/scripts/RunAfterCatalog"
Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr"
Priority = 11 # ждать пока завершится бэкап клиента
}
#Стандартное задание для восстановление файлов, нужно всего одно для всех #Jobs/Clients/Storage, нужные значения можно подставить во время запуска
#задания из консоли, так как Restore не работает в автоматическом режиме.
Job {
Name = "RestoreFiles"
Type = Restore
Client=host_name-fd
FileSet="Full Set"
Storage = File
Pool = Default
Messages = Standard
Where = /
}
# Список файлов которые будут резервироваться
FileSet {
Name = "Full Set" #имя на которое потом ссылаются в Job
Include { #Включать следующие файлы:
Options { #параметры
compression=GZIP #сжимать gzip-ом на уровне клиента пофайлово 1 - мин, 9 - макс сжатие, по умолчанию 6
signature = MD5 #проверяет изменился ли файл
onefs=yes #только в пределах одной файловой системы
verify=pinugs5 #что проверять в заданиях Verify, подробности в документации
hardlinks=yes #учитывать жесткие ссылки при сохранении
# шаблоны, в стиле shell; для каталога необходимо указывать завершающий '/'
wild = "*/MyDownload/*"
wild = "/home/*/Ubuntu One"
wild = "/home/*/*ubuntuone*"
wild = "/home/vanuch/.gvfs/"
wild = "/home/vanuch/.wine/drive_c/"
exclude=yes # исключить файлы попадающее под шаблон
}
#Сам список файлов которые нужно бэкапить и на которые распространяются настройки указанные выше
#нельзя использовать шаблоны
File = /
File = /home
File = /boot
}
# Исключить следующие файлы, так же можно использовать секцию Options
Exclude {
File = /proc
File = /tmp
File = /.journal
File = /.fsck
File = /sys
File = /var/cache
File = /var/log
File = /dev
File = /lost+found
File = /home/lost+found
}
}
#Расписание по которому будут создаваться бэкапы
#Полный бэкап - каждый второй месяц в первое воскресенье
#Дифференциальный - каждое воскресенье,кроме того дня когда делается полный
#Инкрементный - каждый вторник и пятницу
Schedule {
Name = "WeeklyCycle"
Run = Full jan,mar,may,jul,sep,nov 1st sun at 23:05
Run = Differential jan,mar,may,jul,sep,nov 2nd-5th sun at 23:05
Run = Differential feb,apr,jun,aug,oct,dec sun at 23:05
Run = Incremental tue,fri at 23:05
}
# БД копируем после каждого бэкапа данных
Schedule {
Name = "WeeklyCycleAfterBackup"
Run = Full sun,tue,fri at 23:55
}
# список файлов для с данными из БД
FileSet {
Name = "Catalog"
Include {
Options {
compression=GZIP
signature = MD5
}
File = /var/lib/bacula/bacula.sql
}
}
# Настройки подключения к клиенту
Client {
Name = host_name-fd
Address = host_name
FDPort = 9102
Catalog = MyCatalog
Password = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy" # пароль для подключения к FD
File Retention = 2 months #период хранения информации о файлах клиента в каталоге
Job Retention = 3 months #период хранения информации о заданиях клиента в каталоге
#данные на ленте (диске) не удаляются
AutoPrune = yes #удалять в конце каждого задания из каталога записи о файлах и заданиях, срок хранения которых истёк
}
# Настройки подключения к серверу хранения
Storage {
Name = File
Address = host_name # доменное имя
SDPort = 9103
Password = "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"
Device = FileStorage #Должно соответствовать Name ресурса Device ( Autochanger) из bacula-sd.conf
Media Type = File #должен соответствовать указанному в bacula-sd.conf
}
# Настройки подключения к БД
Catalog {
Name = MyCatalog
dbname = "bacula"; dbuser = "bacula"; dbpassword = "my_passord"
}
# Настройка доставки уведомлений
Messages {
Name = Standard
# bacula для отправки использует утилиту bsmtp, значения автоподстановок(%e,%t, и т.д.) можно найти в документации
# %r - получатели сообщения
#mail и operator, отличаются только типом получаемых сообщений, можно настроить что и кому слать
mailcommand = "/usr/lib/bacula/bsmtp -h smtp_server -f \"\(Bacula\) no-reply@mail.domain\" -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/usr/lib/bacula/bsmtp -h smtp_server -f \"\(Bacula\) no-reply@mail.domain\" -s \"Bacula: Intervention needed for %j\" %r"
mail = user1@mail.domain = all, !skipped
operator = user2@mail.domain = mount
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}
# Сообщения самого директора, не связанные с заданиями
Messages {
Name = Daemon
mailcommand = "/usr/lib/bacula/bsmtp -h smtp_server -f \"\(Bacula\) no-reply@mail.domain\" -s \"Bacula daemon message\" %r"
mail = user@mail.domain = all, !skipped
console = all, !skipped, !saved
append = "/var/lib/bacula/log" = all, !skipped
}
# Описания набора томов
Pool {
Name = Default
Pool Type = Backup
Recycle = yes # если нужен том для записи, но нет ни одного дополняемого тома в пуле (состояние Appendable), то bacule ищет том, все задания и файлы которого удалены из каталога и использует его, переведя в состояние Recycled
AutoPrune = yes # удалять из каталога записи о файлах и заданиях, срок хранения которых истёк
Volume Retention = 92 days # удалять через 3 месяца
Maximum Volumes = 5 # максимальное количество томов
Maximum Volume Bytes = 5 Gb # максимальный размер тома
Label Format = Volumes # Метка тома
}
Все изменения которые пришлось внести в файл выделены жирным шрифтом
Так же был удален еще один pool, который предназначен для хранения томов информация на которых уже устарела, и консоль для tray-monitor. Изменений минимум.
Дополнительно создадим два файла /etc/bacula/scripts/RunBeforeCatalog и /etc/bacula/scripts/RunAfterCatalog:
# cat RunBeforeCatalog
#!/bin/sh
sudo mount /backup
/usr/bin/awk -f /etc/bacula/scripts/make_catalog_backup_awk -v cat1=MyCatalog /etc/bacula/bacula-dir.conf
# cat RunAfterCatalog
#!/bin/sh
sudo umount /backup
/etc/bacula/scripts/delete_catalog_backup
Первый монтирует раздел куда будет копироваться база и создает файл с бэкапом базы, второй отмонтирует раздел и удаляет бэкап базы данных. Чтоб эти скрипты работали нужно, во-первых, прописать в /etc/fstab/ правило для /backup. А, во-вторых, отредактировать файл /etc/sudoers, и добавить туда строку:
bacula ALL = NOPASSWD: /bin/mount,/bin/umount
После такой модификации bacula будет сама подключать и отключать раздел для бэкапов.
К сожалению еще не успел проверить что bacula будет делать в случае окончания места на разделе с бэкапами. В теории, должна повторно использовать старые тома. размер раздела и расписание заданий подбирал так чтоб всегда был хоть один полный бэкап. Но, на всякий случай, помня о законах Мерфи, поставил себе напоминание проверить состояние резервной копии через месяц и через два.
Recovery
Восстановление отдельных файлов.
В случае если из бэкапа нужно восстановить лишь некоторые файлы. Или даже и полностью откатить систему, если клиентская и серверная часть bacula находятся на разных машинах. И при этом база, файлы конфигурации и bootstrap файлы bacula не повреждены, то можно воспользоваться стандартной командой bconsole — recovery. Подробную информацию о том как это делается можно подчерпнуть здесь. Но, как по мне, гораздо проще и наглядней воспользоваться графической утилитой для управления bacula, которая называется bat. Там можно легко отметить из каких именно заданий и какие именно файлы и папки нужно восстанавливать.
Восстановление при потере всех данных
Более важный вопрос как же восстановить систему если будут утеряны все файлы, а с ними конфиги и база данных bacula?
В этом случае можно воспользоваться командами bls для сканирования содержимого томов и командой bextract для последующего извлечения данных. Но в любом случае нам нужно файл либо bacula-sd.conf либо bootstrap, который создается перед запуском каждого job. Для себя я решил, что проще держать копию bacula-sd.conf на разделе с бэкапами.
Делаем:
$ sudo bls -j -c /etc/bacula/bacula-sd.conf /backup/Volumes0006
bls: match.c:249-0 add_fname_to_include prefix=0 gzip=0 fname=/
bls: butil.c:282 Using device: "/backup" for reading.
03-Апр 15:11 bls JobId 0: Ready to read from volume "Volumes0006" on device "FileStorage" (/backup).
Том Record: File:blk=0:64511 SessId=2 SessTime=1268383043 JobId=1 DataLen=162
End Job Session Record: File:blk=0:2315916124 SessId=2 SessTime=1268383043 JobId=72
Date=12-Мар-2010 23:36:57 Level=F Type=B Files=284,979 Bytes=4,442,929,744 Errors=0 Status=T
Begin Job Session Record: File:blk=0:2315940012 SessId=3 SessTime=1268383043 JobId=73
Job=BackupCatalog.2010-03-12_23.10.00.05 Date=12-Мар-2010 23:37:58 Level=F Type=B
End Job Session Record: File:blk=0:2315940012 SessId=3 SessTime=1268383043 JobId=73
Date=12-Мар-2010 23:37:58 Level=F Type=B Files=0 Bytes=0 Errors=0 Status=T
Begin Job Session Record: File:blk=0:2315940416 SessId=1 SessTime=1268475649 JobId=74
Job=Client1.2010-03-13_23.05.00.02 Date=13-Мар-2010 23:05:03 Level=F Type=B
03-Апр 15:13 bls JobId 0: End of Volume at file 1 on device "FileStorage" (/backup), Volume "Volumes0006"
03-Апр 15:13 bls JobId 0: End of all volumes.
bls: acquire.c:436-0 dir_update_vol_info. label=64 Vol=Volumes0006
мы видим что в этом томе есть только конец данных задания №72, начало было в предыдущем томе.
Есть все данные с задания №73, при этом level = F означает что тип бэкапа full, а Job=BackupCatalog можно определить что это был бэкап базы данных bacula. и самое интересное для нас job 74 — это начало полного бэкапа Client1, что и есть бэкапом моей системы.
После этого аналогичным образом сканируем следующий том. На котором, как и ожидалось, будет продолжение полного бэкапа и последующее инкрементальные и дифференциальные бэкапы.
Проанализировав содержимое томов, можно приступать к восстановлению.
$ sudo bextract -V Volumes0006\|Volumes0007 -c /etc/bacula/bacula-sd.conf FileStorage /
после чего можно откинутся на спинку стула, сходить сделать кофе или прогуляться парком в зависимости от того как размер бэкапа для восстановления. Мне для того чтоб распаковать 11 Гиговый бэкап всей системы и хомяка понадобилось примерно 2 часа:)
Более подробная информация по утилитам bls и bextract http://www.lllf.uam.es/~antonio/documentos/bacula/dev-manual/Volume_Utility_Tools.html.