Bacula - резервное копирование (Debian, FreeBSD)

Данная статья не претендует на руководство, и рассматривается исключительно как шпаргалка. Что же такое Bacula? Для этого обратимся к первоисточнику - www.bacula.org. - Bacula - это программный комплекс позволяющий системному администратору управлять резервным копированием и восстановлением данных используя различные типы носителей, включая ленты и диски. С технической точки зрения, это сетевой клиент/сервер резервного копирования. Бакула состоит из следующих компонентов: Bacula Director - основная часть контролирующая всё резервное копирование, восстановление, проверку и операции с архивами, а также планирование создания архивов. Bacula Console - служба позволяющая администратору или пользователю работать с Bacula Director. В настоящее время консоль доступна в четырёх версиях: текстовой, GNOME-интерфейс, QT-интерфейс и WxWidgets графическим интерфейсом Bacula File - клиентская часть, управляемая Bacula Director. Bacula Storage - сервис отвечающий за физические накопители хранения/восстановления резервных копий. (Сервер хранения) Catalog - отвечает за хранение файла индексов и объемов баз данных для всех файлов резервных копий. В данный момент Bacula поддерживает три базы данных для хранения - MySQL, PostgreSQL и SQLite Bacula Monitor - это программа, которая позволяет администратору или пользователю наблюдать за текущим статусом Bacula. Установка Bacula Установка Bacula на Debian максимальна проста:

~#aptitude install bacula-director-mysql bacula

Подразумевается, что mysql-server уже установлен. 1. 2. 3. Если вам понадобиться еще раз пройти этап конфигурации наберите в командной строке dpkg-reconfigure bacula-director-mysql Перейдем к основному этапу - Настройка Сперва настраиваем bacula-fd (файловый сервер)

~#cd /etc/bacula/ /etc/bacula#vi ./bacula-fd.conf
#
# Список директоров которые имею доступ к этому демону
Director {
  Name = host-dir
  Password = "secret" 
}

#
# "Global" File daemon configuration specifications
#
FileDaemon {
  Name = host-fd  #Уникальное имя используемое директором
  FDport = 9102    # порт на котором "слушает" наш файловый сервер
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /var/run/bacula
  Maximum Concurrent Jobs = 20 #Количество одновременно выполняемых заданий директора
  FDAddress = 10.10.0.1 #адрес на котором "слушает" файловый сервер, если не указывать этот
                                       #параметр - демон будет слушать на всех доступных адресах
}
#отправляем все сообщения на диретор, исключая список файлов, которые были пропущены при
#копировании согласно настройке и список восстановленных файлов.
Messages {
  Name = Standard
  director = host-dir = all, !skipped, !restored
}

Вместо FDAddress можно использовать директиву FDAddress, которая позволяет определять группы адресов, портов. Например:
FDAddresses  = { 
    ip = { addr = 1.2.3.4; port = 1205; }
    ipv4 = {
        addr = 1.2.3.4; port = http; }
    ipv6 = {
        addr = 1.2.3.4;
        port = 1205;
    }
    ip = {
        addr = 1.2.3.4
        port = 1205
    }
    ip = { addr = 1.2.3.4 }
    ip = {
        addr = 201:220:222::2
    }
    ip = {
        addr = bluedot.thun.net
    }
 }

Настраиваем наш сервер хранения

/etc/bacula#vi ./bacula-sd.conf
Storage {                            
  Name = host-sd                                            #Имя сервера хранения
  SDPort = 9103                                              #Порт на котором будем ждать подключения
  WorkingDirectory = "/var/lib/bacula"                      
  Pid Directory = "/var/run/bacula"                         
  Maximum Concurrent Jobs = 20                              
  SDAddress = 10.10.0.1                                 #Аналогичен FDAddress
}                                                           

#
#Список директоров имеющих доступ к серверу хранения
#                                                           
Director {                                                  
  Name = host-dir                                           #Имя директора
  Password = "secret"                                       
}                                                           

#
# Devices supported by this Storage daemon
# To connect, the Director's bacula-dir.conf must have the
#  same Name and MediaType.                               
#                                                         

Device {
  Name = FileStorage                              #Имя используемое директором
  Media Type = File                                  #Тип носителя
  Archive Device = /mnt/backup/bacula   #имя устройства НМЛ, DVD или каталога
  LabelMedia = yes;                                #для записи на диск предпочтительно указать "yes", что
                                                               #позволяет автоматически размечать тома в соответствии с
                                                               #директивой LabelFormat ресурса Pool в настройках директора
  Random Access = Yes;                          #Включение поддержки lseek        
  AutomaticMount = yes;                         
  RemovableMedia = no;                         #при использовании съемных накопителей (CD, DVD, НМЛ и пр.) 
                                                               #указываем yes
  AlwaysOpen = no;                                #no - устройство открывается только по требованию, в случае
                                                               #хранения в файл - эта директива игнорируется
}                                                                        


#
# Пересылаем все сообщения
Messages {
  Name = Standard
  director = host-dir = all
}

Переходим к основному этапу настройки - настройке директора

/etc/bacula#vi ./bacula-dir.conf
Director {              
  Name = host-dir               #Имя директора                     
  DIRport = 9101                #определение порта
  QueryFile = "/etc/bacula/scripts/query.sql"      #шаблоны SQL-запросов
  WorkingDirectory = "/var/lib/bacula"                #Рабочая директория
  PidDirectory = "/var/run/bacula"                                  
  Maximum Concurrent Jobs = 1                          #количество одновременно выполняемых заданий             
  Password = "secret"                                         #Пароль консоли
  Messages = Daemon                                         #Имя ресурса Messages, который будет использоваться
                                                                            #для обработки сообщений
  DirAddress = 10.10.0.1                                      #Адрес который будет "слушать" директор, если
                                                                            #опустить этот параметр - директор будет "слушать"
                                                                            #все доступные адреса
}                                                                   

JobDefs {                               #имя шаблона задания; значения директив из JobDefs используются в
  Name = "DefaultJob"            #качестве умолчания
  Type = Backup                      #Тип задачи (Backup, Restore, Verify, Admin, Migrate)
  Level = Incremental              #Уровень для Backup:Full, Incremental, Differential, VirtualFull
                                               #для Verify: InitCatalog, Catalog, VolumeToCatalog, DiskToCatalog
  FileSet = "Full Set"                #Определение файлов и каталогов для резервного копирования
  Schedule = "WeeklyCycle"    #Расписание выполнения задачи
  Storage = File                       #устройство хранения
  Messages = Standard     
  Pool = Default                       #имя ресурса; для задания резервного копирования определяет пул для
                                               #записи, для задания миграции - исходный пул для поиска копируемых
                                               #заданий
  Priority = 10                          #Приоритет выполнения задач, чем меньше значение тем выше
                                               #приоритет
}                         

# Описание задания
Job {                                                 
  Name = "BackupCatalog"
  JobDefs = "DefaultJob"
  Level = Full
  FileSet="Full Set"                                  
  Schedule = "WeeklyCycleAfterBackup"                 
  #  make_catalog_backup    
  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup bacula bacula secretsql"
  # This deletes the copy of the catalog                                            
  RunAfterJob  = "/etc/bacula/scripts/delete_catalog_backup"                        
  Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr"                             
  Priority = 11
}                                                                                   

Job {
  Name = "Tux"
  JobDefs = "DefaultJob"
  Level = Full          
  FileSet="Full Tux"    
  Schedule = "Tux"      
  Client = debian-fd    
  #  make_catalog_backup    
  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup bacula bacula secretsql"
  # This deletes the copy of the catalog                                            
  RunAfterJob  = "/etc/bacula/scripts/delete_catalog_backup"                        
  Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr"                             
  Priority = 11 
}                                                                                   

Job {
  Name = "Host2"
  JobDefs = "DefaultJob"
  Level = Full          
  FileSet="Full Host2"
  Schedule = "WeeklyCycleAfterBackup"
  Client = host2-fd
  #  make_catalog_backup    
  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup bacula bacula secretsql"
  # This deletes the copy of the catalog                                            
  RunAfterJob  = "/etc/bacula/scripts/delete_catalog_backup"                        
  Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr"                             
  Priority = 11
}                                                                                   

Job {
  Name = "host3"
  JobDefs = "DefaultJob"
  Level = Full          
  FileSet="host3"        
  Schedule = "WeeklyCycleAfterBackup"
  Client = netup-fd                  
  #  make_catalog_backup    
  RunBeforeJob = "/etc/bacula/scripts/make_catalog_backup bacula bacula secretsql"
  # This deletes the copy of the catalog                                            
  RunAfterJob  = "/etc/bacula/scripts/delete_catalog_backup"                        
  Write Bootstrap = "/var/lib/bacula/BackupCatalog.bsr"                             
  Priority = 11                   # run after main backup                           
}                                                                                   

#
# Standard Restore template, to be changed by Console program
#  Only one such job is needed for all Jobs/Clients/Storage ...
#                                                              
Job {                                                          
  Name = "RestoreFiles"                                        
  Type = Restore                                               
  Client=host-fd                                               
  FileSet="Full Set"                                           
  Storage = File                                               
  Pool = Default                                               
  Messages = Standard                                          
  Where = /mnt/backup/bacula                                   
}                                                              


# List of files to be backed up
FileSet {                      
  Name = "Full Set"            
  Include {                    
    Options {                  
      signature = MD5          
    }                          
#                              
#  Put your list of files here, preceded by 'File =', one per line
#    or include an external list with:                            
#                                                                 
#    File = \" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = admin@domain = all, !skipped                                                                                      
  operator = admin@admin = mount                                                                                          
  console = all, !skipped, !saved                                                                                             
#                                                                                                                             
# WARNING! the following will create a file that you must cycle from                                                          
#          time to time as it will grow indefinitely. However, it will                                                        
#          also keep all your messages if they scroll off the console.                                                        
#                                                                                                                             
  append = "/var/lib/bacula/log" = all, !skipped                                                                              
}                                                                                                                             


#
# Message delivery for daemon messages (no job).
Messages {
  Name = Daemon
  mailcommand = "/usr/lib/bacula/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula daemon message\" %r"
  mail = root@localhost = all, !skipped
  console = all, !skipped, !saved
  append = "/var/lib/bacula/log" = all, !skipped
}

# Default pool definition
Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes                       # Bacula can automatically recycle Volumes
  AutoPrune = yes                     # Prune expired volumes
  Volume Retention = 365 days         # one year
}

# Scratch pool definition
Pool {
  Name = Scratch
  Pool Type = Backup
}

#
# Restricted console used by tray-monitor to get the status of the director
#
Console {
  Name = host-mon
  Password = "secret"
  CommandACL = status, .status
}