[Bareos] Bareos — бесплатное резервное копирование формата Enterprise

Alexander BazhenovJan 12

Bareos (Backup Archiving Recovery Open Sourced) — высоконадежное сетевое кроссплатформенное программное обеспечение для резервного копирования, архивирования и восстановления данных. Bareos основан в 2010 году, как OpenSource ответвление от проекта Bacula и в настоящее время активно развивается и пополняется многими новыми функциями. На первый взгляд Bareos может казаться довольно сложным для внедрения, но по мере его изучения приходит понимание того, что Bareos обладает довольно мощным функционалом, который так же дополнительно расширяется за-счет плагинов. Bareos поддерживает множество различных типов носителей информации (от ленточных и дисковых до распределенных файловых систем), а так же обладает различными полезными опциями: архивирование, шифрование данных, возможность применения шаблонов задач (Job Definitions) и многое другое.

  • Bareos Director — компонент который управляет заданиями (jobs) и операциями резервного копирования, или восстановления, а так же управляет File и Storage Daemon’ами.
  • Baroes Console — текстовая консоль для управления Bareos Director’ом через специальный командный синтаксис. По умолчанию устанавлиявется вместе с Bareos Director, но может устанавливаться и отдельно для удаленного подключения к Bareos Director.
  • Bareos Web UI — веб-интерфейс Bareos (отсутствует на рис. 2). По умолчанию устанавливается вместе с Bareos Director. Данный компонент пока что на стадии развития и используется больше для удобного мониторинга, но можно вручную запускать задачи на резервное копировение, или восстановление. Тогда как расписание и задания создаются в основном через текстовые конфиги, или через консоль bareos, а не через веб-интерфейс.
  • Bareos Catalog — база данных, которая содержит информацию по расписаниям, заданиям, сохраненным файлам, клиентам, статусам.
  • Storage Daemon — компонент, который выполняет операции чтения и записи на устройствах хранения, используемых для резервного копирования.
  • File Daemon — агент, который используется для сбора с “клиентских” систем и их размещения при операциях восстановления.

Установка Bareos Director.

В настоящий момент Bareos Director с его полным функционалом возможен только на Linux и FreeBSD (см. раздел “Windows Limitations”). Можно устанавливать как вместе, так и отдельно от Storage Daemon. Ниже будет рассмотрана установка на Centos 7. За подробными инструкциями по установке на другие дистрибутивы Linux обращайтесь к официальной документации.

Устанавливаем epel, добавляем репозиторий Bareos (latest для различных дистрибутивов можно найти здесь), устанавливаем непосредственно сам bareos и его веб-интерфейс, а так же настраиваем firewalld:

# yum install epel-release wget -y
# wget -O /etc/yum.repos.d/bareos.repo http://download.bareos.org/bareos/release/latest/CentOS_7/bareos.repo
# yum install bareos bareos-webui -y
# setsebool -P httpd_can_network_connect on
# firewall-cmd --permanent --add-port=80/tcp
# firewall-cmd --permanent --add-port=443/tcp
# firewall-cmd --permanent --add-port=9101/tcp
# firewall-cmd --permanent --add-port=9102/tcp
# firewall-cmd --permanent --add-port=9103/tcp
# firewall-cmd --reload

Далее необходимо установить пакеты для работы Bareos с базой данных и выполнить некоторе её первоначальные настройки. Список поддерживаемых БД можно узнать командой:

# yum search bareos-database-

PostgreSQL:

# yum install bareos-database-postgresql postgresql-server postgresql-contrib -y
# postgresql-setup initdb
# systemctl start postgresql
# systemctl enable postgresql
# su postgres -c /usr/lib/bareos/scripts/create_bareos_database
# su postgres -c /usr/lib/bareos/scripts/make_bareos_tables
# su postgres -c /usr/lib/bareos/scripts/grant_bareos_privileges
# sed -i 's/.*mysql/#&/' /etc/bareos/bareos-dir.d/catalog/MyCatalog.conf
# sed -i '/^#.*postgresql/s/^#//' /etc/bareos/bareos-dir.d/catalog/MyCatalog.conf

MariaDB:

# yum install bareos-database-mysql mariadb-server -y
# systemctl enable mariadb
# systemctl start mariadb
# mysql_secure_installation

Устанавливаем пароль root, удаляем неавторизированных пользователей, удаленный логин — по желанию, тестовую базу данных можно удалить, перезагружаем таблицу привелегий и создаем конфиг:

# cat ~/.my.cnf
[client]
host=localhost
user=root
password=password

Запускаем скрипты инициализации базы данных и закоментируем/раскоментируем нужны строчки в конфиге bareos и добавим в него пользователя (root) и пароль (password) для доступа к БД:

# /usr/lib/bareos/scripts/create_bareos_database
# /usr/lib/bareos/scripts/make_bareos_tables
# /usr/lib/bareos/scripts/grant_bareos_privileges
# sed -i 's/.*postgresql/#&/' /etc/bareos/bareos-dir.d/catalog/MyCatalog.conf
# sed -i '/^#.*mysql/s/^#//' /etc/bareos/bareos-dir.d/catalog/MyCatalog.conf
# sed -i '/dbpassword/ c\  dbpassword = "password"' /etc/bareos/bareos-dir.d/catalog/MyCatalog.conf
# sed -i '/dbuser/ c\  dbuser = "root"' /etc/bareos/bareos-dir.d/catalog/MyCatalog.conf

Дополнительную информацию о настройке Bareos для работы с различными БД можно узанть здесь. Запускаем и добавляем в автостарт службы:

# systemctl enable httpd
# systemctl restart httpd
# systemctl enable bareos-dir
# systemctl restart bareos-dir

и далее запускаем консоль bareos и создаем пользователя admin для доступа к веб-интерфейсу:

# bconsole
* configure add console name=admin password=<your_password> profile=webui-admin
* exit

Команда создаст профиль пользователя следующего вида:

cat /etc/bareos/bareos-dir.d/console/admin.conf
Console {
 Name = admin
 Password = <your_password>
 Profile = webui-admin
}

Под этим пользователем логинимся в WEB-интерфейс:

http://<FQDN_or_IP>/bareos-webui/

Установка Bareos File Daemon.

“Клиенты”, в отличии от серверных компонентов Bareos, без каких-либо ограничений устанавливаются так же на MacOS и Windows, однако ниже будет расмотрена только установка на Centos, Ubuntu и Debian.

# yum install epel-release wget -y
# wget -O /etc/yum.repos.d/bareos.repo http://download.bareos.org/bareos/release/latest/CentOS_7/bareos.repo
# yum install bareos-fd -y
# firewall-cmd --permanent --add-port=9102/tcp
# firewall-cmd --reload
# systemctl enable bareos-fd

Дальнейший процесс добавления клиента аналогичен для всех перечисленных выше дистрибутивов. Логинимся к консоли на стороне Bareos Director и добавляем только что установленный “клиент”:

# bconsole
* configure add client name=clientname address=10.10.1.2 password=password

и получаем примерно следующий вывод:

Exported resource file "/etc/bareos/bareos-dir-export/client/clientname/bareos-fd.d/director/bareos-dir.conf":
Director {
  Name = bareos-dir
  Password = "[md5]5f4dcc3b5aa765d61d8327deb882cf99"
}
Created resource config file "/etc/bareos/bareos-dir.d/client/clientname.conf":
Client {
  Name = clientname
  Address = 10.10.1.2
  Password = password
}

Это конфигурация клиента, которую необходимо скопировать на сторону “клиента”. Перезагружаем конфигурацию Bareos Director, выходим из консоли, копируем конфиг:

* reload
* exit
# scp /etc/bareos/bareos-dir-export/client/clientname/bareos-fd.d/director/bareos-dir.conf root@10.10.1.2:/etc/bareos/bareos-fd.d/director/

перезагружаем File Daemon на стороне клиентской системы:

# systemctl restart bareos-fd

Из консоли выполним:

# bconsole
* list clients

для вывода списка клиентов, или:

* status client

для выбора клиента и просмотра его статуса. Аналогично можно просмотреть информацию через веб-интерфейс (рис. 3), где можно так же посмотреть и его статус:

Connecting to Client client at 10.10.1.2:9102

bareos-client-fd Version: 17.2.4 (21 Sep 2017)  x86_64-redhat-linux-gnu redhat CentOS Linux release 7.4.1708 (Core)
Daemon started 02-ав-2018 15:09. Jobs: run=0 running=0.
 Heap: heap=143,360 smbytes=28,523 max_bytes=28,912 bufs=64 max_bufs=67
 Sizeof: boffset_t=8 size_t=8 debug=0 trace=0 bwlimit=0kB/s

Running Jobs:
bareos-dir (director) connected at: 03-ав-2018 00:12
No Jobs running.
====

Terminated Jobs:
====

Включить, или отключить клиент из консоли можно командами:

# bconsole
* enable client clientname
* disable client clientname

Удалить клиент с Bareos Director можно путем удаления конфига из папки /etc/bareos/bareos-dir.d/client и перезагрузки конфигурации Bareos Director:

# rm -f /etc/bareos/bareos-dir.d/client/clientname.conf
# bconsole
* reload
* exit

Установка Bareos Storage Daemon.

По умочанию Storage Deamon устанавливается вместе с серверной частью Bareos и система, где установлен Bareos Director, уже является хранилищем. Если по каким-то причинам пакеты установились, но в веб-интерфейсе при попытке отобразить “Статус накопителя” пишет:

Connecting to Storage daemon File at bareos-server:9103

Failed to connect to Storage daemon File.
====

то сверями и исправляем следующие конфиги:

# cat /etc/bareos/bareos-sd.d/device/FileStorage.conf
Device {
  Name = FileStorage
  Media Type = File
  Archive Device = /var/lib/bareos/storage
  LabelMedia = yes;          # lets Bareos label unlabeled media
  Random Access = yes;
  AutomaticMount = yes;      # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Description = "File device. A connecting Director must have the same Name and MediaType."
}
# cat /etc/bareos/bareos-sd.d/director/bareos-dir.conf
Director {
  Name = bareos-dir
  Password = "<some_password_hash_here>"
  Description = "Director, who is permitted to contact this storage daemon."
}
# cat /etc/bareos/bareos-dir.d/storage/File.conf
Storage {
  Name = File
  Address = bareos   # N.B. Use a fully qualified name here (do
                     # not use "localhost" here).                 
  Password = "<some_password_hash_here>"
  Device = FileStorage
  Media Type = File
  Removable Media = no
}

и запущен ли File Daemon:

# systemctl status bareos-sd

По дефолту пулы данных располагаются в /var/lib/bareos/storage, тогда как конфигурация самих пулов распологается в конфигах Bareos Director:

# ls /etc/bareos/bareos-dir.d/pool
Differential.conf
Full.conf
Incremental.conf
Scratch.conf

Иногда возникает необходимость вынести Storage Daemon на отдельный сервер, или добавить дополнительный Storage Pool расположенный на другом сервере. Рассмотрим установку Bareos Storage Daemon и подключение дополнительного storage, а так же создание пула для хранения данных. Для работы с обычными дисковыми накопителями нужно установить соответствующий бэкенд: пакет bareos-sd — для Centos, bareos-storage — для Debian, или Ubuntu. Для tape, ceph, или GlusterFS потребуются другие пакеты, просмотреть список которых можно командой:

# apt-cache search bareos | grep bareos-storage

Ниже будет рассмотрен пример с несменным HDD/SSD файловым storage backend’ом. За конфигурацией более специфичных устройств, примерами и дополнительными опциями можно обратиться к официальной документации.

# yum install epel-release wget -y
# wget -O /etc/yum.repos.d/bareos.repo http://download.bareos.org/bareos/release/latest/CentOS_7/bareos.repo
# firewall-cmd --permanent --add-port=9102/tcp
# firewall-cmd --permanent --add-port=9103/tcp
# firewall-cmd --reload
# yum install bareos-sd -y
# systemctl enable bareos-sd

Конфигурируем Device на стороне Storage Daemon:

# cat /etc/bareos/bareos-sd.d/device/NewStorage.conf
Device {
  Name = NewStorage
  Media Type = File
  Archive Device = /path/to/your/storage/mount/directory
  LabelMedia = yes;      # lets Bareos label unlabeled media
  Random Access = yes;
  AutomaticMount = yes;  # when device opened, read it
  RemovableMedia = no;
  AlwaysOpen = no;
  Description = "Your device description here."
}

Теперь, исходя из того, что Device имеет имя NewStorage, а Bareos Director — дефолтное bareos-dir, следующий конфиг:

# cat /etc/bareos/bareos-sd.d/director/bareos-dir.conf
Director {
  Name = bareos-dir
  Password = "<some_password_hash>"
  Description = "Director, who is permitted to contact this storage daemon."
}

расположенный на стороне Storage Daemon, нужно разместить на стороне Bareos Director и привести к следующему виду:

# cat /etc/bareos/bareos-dir.d/storage/NewStorage.conf
Storage {
  Name = NewStorage
  Address = 10.10.1.1         # N.B. Use a FQDN or IP here
  Password = "<some_password_hash>"
  Device = NewStorage
  Media Type = File
}

Обновить конфигурацию Bareos Director:

# bconsole
* reload
* exit

и перезапустить Storage Daemon для обновления конфигурации:

# systemctl restart bareos-sd

Просмотреть статус добавленного устройства можно в веб-интерфейсе, или через консоль:

# bconsole
* status storage

Создание Storage Pool.

Bareos хранит данные в различных томах (Volumes), каждый из которых располагается Pool’ах. Для каждого пула можно настроить свои параметры: автоуадаление и срок хранения тома, максимальное количество томов в пуле, максимальное количество заданий на каждый том, максимальные размер тома и другие опции. По умолчанию создаются три основных пула: Full, Incremental и Differential. Можно так же настроить Recycling с использованием Scratch Pool’а, но эта в опция полезна лишь для ленточных накопителей. За дополнительной информацией об устрйостве Pool’ов и Volume’ов можно обратиться к официальной документации. Создадим дополнительный Pool, который будет размещен на выше созданном NewStorage девайсе:

# cat /etc/bareos/bareos-dir.d/pool/NewPool.conf
Pool {
  Name = NewPool
  Pool Type = Backup
  Recycle = yes                # Bareos умеет автоматически
                               # удалять тома
  AutoPrune = yes              # Prune expired volumes
  Recycle Oldest Volume = yes
  Recycle Current Volume = yes
  Volume Retention = 60 days   # Как долго хранить
  Maximum Volume Bytes = 1024G # Лимит объема для Volume'а
  Maximum Volumes = 120        # Лимит количества Volumes в Pool'е
  Label Format = "Full-"       # Volume будем именован как
                               # "Full-<volume-id>"
  Maximum Volume Jobs = 1      # Максимальное количество jobs
                               # на один Volume
  RecyclePool = Scratch        # Recycle пул = Scratch
}

Тогда как Scratch Pool выглядит:

# cat Scratch.conf
Pool {
  Name = Scratch
  Pool Type = Backup
}

Выставляем на всякий случай owner’а, обновляем конфиг Bareos Director и проверяем список Pool’ов:

# chown bareos:bareos NewPool.conf
# bconsole
* reload
* list pools
* exit

Расписание и задания.

Перед тем, как приступить к настройке расписания (Schedule), задач (Jobs) и их шаблонов (Job Definitions) на резервное копирование (Backup) и восстановление (Restore), рассмотрим структуру в папке конфигов Bareos Director.

# ls -R /etc/bareos/bareos-dir.d | grep ":" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'
 |---bareos-dir.d
 |-----catalog   # конфигурация Bareos Catalog
 |-----client    # конфиги клиентов (Bareos File Daemons)
 |-----console   # учетные записи для доступа к Bareos Director
 |-----counter
 |-----director  # здесь расположен конфиг самого Bareos Director
 |-----fileset   # fileset'ы (или описания наборов файлов)
 |-----job       # задания
 |-----jobdefs   # щаблоны заданий (Job Definitions)
 |-----messages  # какие сообщения с File Daemon'ов сохранять
 |-----pool      # конфиги пулов
 |-----profile   # шаблоны доступов (профилей) для учеток в client
 |-----schedule  # расписание
 |-----storage   # конфиги storage

Каждое из заданий может быть прикреплено к расписанию (Shedule) и частично предопределено в шаблоне (Job Definitions). Задания так же могут ссылаться на Fileset’ы, где, например, для группы различных заданий предопределены какие-либо параметры. Задания могут быть ни прикреплены к расписанию (запускаются только вручную через веб-интерфейс, или консоль), ни ссылаться на Fileset’ы. Некоторые Fileset’ы создаются автоматически при установке Bareos Director:

# ls -1 /etc/bareos/bareos-dir.d/fileset/
Catalog.conf
LinuxAll.conf
SelfTest.conf
Windows All Drives.conf

так же как и дефолтные задания на резервное копирования Bareos и восстановление каталога (RestoreFiles.conf):

# ls -1 /etc/bareos/bareos-dir.d/job/
backup-bareos-fd.conf
BackupCatalog.conf
RestoreFiles.conf

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

# cat /etc/bareos/bareos-dir.d/schedule/WeeklyCycle.conf
Schedule {
  Name = "WeeklyCycle"
  Run = Full 1st sat at 21:00                   # (#04)
  Run = Differential 2nd-5th sat at 21:00       # (#07)
  Run = Incremental mon-fri at 21:00            # (#10)
}
# cat /etc/bareos/bareos-dir.d/schedule/WeeklyCycleAfterBackup.conf
Schedule {
  Name = "WeeklyCycleAfterBackup"
  Description = "This schedule does the catalog. It starts after the WeeklyCycle."
  Run = Full mon-fri at 21:10
}

WeeklyCycle задает расписание для каждого пула, после которого стартует WeeklyCycleAfterBackup и бэкапит настройки Bareos Director. Дефолтное расписание в последствии можно изменить, или удалить, предварительно исправив все ссылающиеся на него задания, которые можно просмотреть которые можно в веб-интферфейсе:

Расписание -> Показать -> Jobs Triggered

Создадим ежедневное:

# cat /etc/bareos/bareos-dir.d/schedule/Daily.conf
Daily.conf
Schedule {
  # name (обязательно)
  Name = "Daily"

  # run time
  # допустимы множество опций,
  # можно создавать несколько в виде "Run =" times
  # но для простоты будем запускать
  # каждый день один раз в день в 21:10
  Run = daily at 21:00
}

и еженедельное расписание:

# cat /etc/bareos/bareos-dir.d/schedule/Weekly.conf
Schedule {
  Name = "Weekly"
  Description = "This schedule creates weekly backup."
  # создаем Full бэкап в пул "Full" каждую субботу в 21:00
  Run = Level=Full Pool=Full sun at 21:00
}

Создадим Fileset:

# cat /etc/bareos/bareos-dir.d/fileset/MyFileset.conf
FileSet {
  # name (required)
  Name = "MyFileset"
# include directory
  Include {
    Options {
      # считаем контрольную сумму для всех файлов из fileset
      # можно использовать MD5/SHA1. Это полезно для длительного
      # хранения, однако создает дополнительную нагрузку на CPU:
      # SHA1 надежней, но в большинстве случаев достаточно менее
      # требовательного к ресурсам процессора MD5
      Signature = MD5

      # запаковывать каждый файл из fileset
      # наиболее используемые: LZ4/GZIP (см. мануал для остальных
      # возможных опций). LZ4 - наиболее быстрый для запаковывания
      # и распаковывания.
      Compression = LZ4

      # noatime - yes: Если ваша система поддерживает O_NOATIME
      # Bareos откроет все файлы, скопированные с этой опцией.
      # Это позволяет читать файл без обновления inode atime
      # (а также без обновления inode ctime). Если опция не
      # поддерживается, то будет автоматически игнорирована.
      noatime = yes
# Указанные буквы опций используются при запуске
      # Verify Level = Catalog, а также задания уровня
      # DiskToCatalog. Буквы параметров могут быть любыми
      # комбинациями из следующих:
      #
      # i - compare the inodes
      # p - compare the permission bits
      # n - compare the number of links
      # u - compare the user id
      # g - compare the group id
      # s - compare the size
      # a - compare the access time
      # m - compare the modification time (st_mtime)
      # c - compare the change time (st_ctime)
      # d - report file size decreases
      # 5 - compare the MD5 signature
      # 1 - compare the SHA1 signature
      # A - Only for Accurate option, allows to backup the file
      Verify = pin5

    }
    # бэкапим определенные директории
    # (указывать без обратных slash'ей)
    # File = "/path/to/your/folder/"
    #
    # или:
    #
    # File = "/path/to/your/folder/"%n
    # с опцией, задавая таким образом конечную папку с помощью
    # имени задачи (Job Name).
    #
    # Возможно использовать:
    # %c = Client’s name
    # %d = Director’s name
    # %e = Job Exit code (OK, Error, ...)
    # %h = Client address
    # %i = Job Id
    # %j = Unique Job name
    # %l = Job level
    # %n = Job name
    # %r = Recipients
    # %s = Since time
    # %t = Job type (e.g. Backup, ...)
    # %v = Read Volume name (Only on director side)
    # %V = Write Volume name (Only on director side)
    File = "/path/to/your/folder/"
  }
}

Задания бывают следующих типов: Backup, Restore, Verify, Admin, Migrate, Copy, Consolidate. Но для примера рассмотрим только Backup и Restore (информацию об остальных можно найти в официальной документации). Для начала создадим шаблон задачи (Job Definition):

# cat /etc/bareos/bareos-dir.d/jobdefs/MyJobdef.conf

JobDefs {
  Name = "MyJobdef"
  # Тип определяемого Job Definition (Backup, Restore, Verify...)
  Type = Backup

  # Собирать данные со следующего клиента:
  Client = clientname
  # Раскоментируйте, если нужно предопределить Fileset, но можно
  # на него и не ссылаться. Например:
  # FileSet = "MyFileset"
  # Закрепить Job Definition за следедующим расписанием:
  Schedule = "Weekly"
  # Перед и после выполнения задания возможен запуск скриптов:
  # ClientRunBeforeJob - запустит скрипт перед выполнением Job на
  # стороне клиента,
  # RunBeforeJob - запустит скрипт перед выполнением Job на
  # стороне Bareos Director.
  # ClientRunAfterJob - запустит скрипт после выполнения Job на
  # стороне клиента,
  # RunAfterJob - аналогично после Job на стороне Bareos Director.
  # Таким образом, сначала запустится RunBeforeJob (например, это
  # какой-либо скрипт для подготовки данных к бэкапу), непосред-
  # ственно само резервное копирование (или восстановление, если
  # Type = Restore) и по завершению - RunAfterJob (например,
  # скрипт, который удалит подготовленные для бэкапа данные)
  #
  # Например:
  #
  # ClientRunBeforeJob = "/path/to/your/script/script.sh"
  #
  # Как и в Fileset, возможно так же передавать различные
  # параметры:
  # ClientRunBeforeJob = "/path/to/script.sh %n"

  # С каким storage работать:
  Storage = File
  # Preset, определяющий как и какие сообщения собирать с
  # клиентов. В большинстве случаев - стандартного достаточно.
  Messages = Standard
  # С каким пулом работать: например, для Full backups - Full.
  Pool = Full
  # Приоритет задачи: чем ниже, тем раньше других будет выполнена,
  # если за один интвервал времени запланировано несколько
  Priority = 10
  # Вряд ли придется менять это значение, обычно оставляется
  # по дефолту. Это файл начальной загрузки. Он содержит
  # информацию ASCII, которая позволяет точно определить, какие
  # файлы должны быть восстановлены, какой объем они находятся и
  # где они находятся на томе. Это относительно компактная форма
  # указания информации, является удобочитаемой и может быть
  # отредактирована любым текстовым редактором.
  Write Bootstrap = "/var/lib/bareos/%c.bsr"
  # Указывает на то, что Full Backups записываются в пул "Full";
  # Differential - в Differential и тд. Для примера так же можно
  # настроить запись Full Backups в созданный выше NewPool:
  # Full Backup Pool = NewPool
  Full Backup Pool = Full
  Differential Backup Pool = Differential
  Incremental Backup Pool = Incremental
}

И далее создадим непосредственно саму задачу, ссылающийся на созданный Job Definition:

# cat /etc/bareos/bareos-dir.d/job/MyJob.conf
Job {
  Name = "MyJob"
  Description = "Backup files from clientname"
  JobDefs = "MyJobdef"
  Type = Backup
  Level = Full
  # При Accurate режиме демон файлов точно знает, какие файлы
  # присутствовали после последней резервной копии. Таким
  # образом, он способен обрабатывать удаленные или
  # переименованные файлы.
  # При восстановлении FileSet для заданной даты (включая «самые
  # последние») Bareos может восстановить именно файлы и каталоги,
  # существовавшие во время последней резервной копии до этой
  # даты: удаленные файлы будут действительно удалены, а
  # переименованные будут переименованы должным образом.
  # При создании резервных копий VirtualFull рекомендуется
  # использовать точный режим (Accurate Mode), иначе VirtualFull
  # может содержать уже удаленные файлы.
  # Однако использование точного режима также имеет недостатки:
  # FileDaemon должен хранить данные о всех файлах в памяти.
  # Итак, если у вас нет достаточной памяти, резервная копия может
  # быть очень медленной или неудачной. Для 500 000 файлов
  # (типичная desktop Linux-система) потребуется около 64 мегабайт
  # ОЗУ на вашем File Daemon для хранения необходимой информации.
  Accurate = yes
  # Ссылаемся на созданное выше описание файлов (Fileset).
  FileSet = "MyFileset"
  # Привязываем задачу к еженедельному раписанию "Weekly"
  Schedule = "Weekly"
  # Собираем данные с клиента "clientname"
  Client = "clientname"
  # Если требуется, то можно переопределить:
  # ClientRunBeforeJob = "/path/to/script.sh"
  # ClientRunAfterJob = "/path/to/script.sh"
  # Отправляет bootstrap для аварийного восстанолвления.
  # Укажите здесь необходимого адресата, если требуется
  Write Bootstrap = "|/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" root@localhost"
  # Приоритет. Дефолтные задания имеют приоритет 11.
  Priority = 9
}

Если какие-то из параметров определены дважды (например: в Fileset и Job, или в Job Definition и Job), то параметры в Job переопределит (override) ранее заданные. Выставляем права на все созданные конфигурации:

# chown bareos.bareos /etc/bareos/bareos-dir.d/schedule/Daily.conf
# chown bareos.bareos /etc/bareos/bareos-dir.d/schedule/Weekly.conf
# chown bareos.bareos /etc/bareos/bareos-dir.d/fileset/MyFileset.conf
# chown bareos.bareos /etc/bareos/bareos-dir.d/jobdefs/MyJobdef.conf
# chown bareos.bareos /etc/bareos/bareos-dir.d/job/MyJob.conf

перезагружаем конфигурацию и проверяем созданные задания через веб-интефрейс (Задания -> Запуск), или консоль:

# bconsole
* reload
* run job=MyJob

Incrimential Backups.

Использование некоторых флагов позволит копировать только те файлы, которые были изменены. Создим fileset для Incrimential Backup’ов:

# cat /etc/bareos/bareos-dir.d/fileset/IncrimentialFileset.conf
FileSet {
  Name = "IncrimentialFileset"
  Description = "Incrimential Data fileset"
  Include {
    Options {

       # Accurate options, использование которых позволяет
       # определить Bareos, какие файлы копировать:
       # i - compare the inodes
       # p - compare the permission bits
       # n - compare the number of links
       # u - compare the user id
       # g - compare the group id
       # s - compare the size
       # a - compare the access time
       # m - compare the modification time (st_mtime)
       # c - compare the change time (st_ctime)
       # d - report file size decreases
       # 5 - compare the MD5 signature
       # 1 - compare the SHA1 signature
       # В большинстве случаев оцпии "ms" вполне досаточно для
       # копирования новых/измененных, но если требуется учитывать
       # дату изменения файла, то "mcs".
       Accurate = ms
       Signature = MD5
       Compression = LZ4
    }
    File = "/path/to/directory"
  }
}

Теперь создадим Base Job, которую можно выполнять по расписанию для копирования всех файлов один раз в месяц, или год, а можно и вовсе запускать разово вручную, если копировать в отдельный пул, автоочистка на котором отключена:

# cat /etc/bareos/bareos-dir.d/job/BaseJob.conf
Job {
  Name = "BaseJob"
  Description = "Base backup"
  # Задаем базовый (Base) level:
  Level = Base
  Pool = Incremental
  Storage = File
  Type = Backup
  FileSet = "IncrimentialFileset"
  Client = "clientname"
  Messages = Standard
  # Раскоментируйте, если требуется выполнять Base Job по
  # расписанию
  # Schedule = "Monthly"
  Write Bootstrap = "|/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" root@localhost"
  Priority = 11
}

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

# cat /etc/bareos/bareos-dir.d/job/IncrimentialJob.conf
Job {
  Name = "IncrimentialJob"
  Description = "Incrimential data backup"

  # Задает Base Job:
  Base = "BaseJob"
  Pool = Incremental
  Storage = File
  Type = Backup
  Level = Incremental
  FileSet = "IncrimentialFileset"
  Schedule = "Daily"
  Client = "clientname"
  Messages = Standard
  Write Bootstrap = "|/usr/bin/bsmtp -h localhost -f \"\(Bareos\) \" -s \"Bootstrap for Job %j\" root@localhost"
  Priority = 11
}

Выставляем права, перезагружаем конфиг Bareos Director и запускаем Base Job:

# chown bareos.bareos /etc/bareos/bareos-dir.d/fileset/IncrimentialFileset.conf
# chown bareos.bareos /etc/bareos/bareos-dir.d/job/BaseJob.conf
# chown bareos.bareos /etc/bareos/bareos-dir.d/job/IncrimentialJob.conf
# bconsole
* reload
* run job=BaseJob

И далее можно запустить задачу на создание инкриментального бэкапа и сравнить количество скопированных данных (в веб-интерфейсе: Задания -> Показать):

* run job=IncrimentialJob

В принципе, достаточно выполнять по расписанию только IncrimentialJob: если не будет найден полный бэкап, то он автоматически создастся. Добавлять BaseJob в расписание не обязательно — это лишь для наглядности данного примера.

Автоочистка Volumes и Admin Jobs.

Логично, что устаревшие данные периодически нужно чистить. И, казалось бы, если поделить емкость storage pool на количество необходимых volumes (c учетом максимального количества заданий, скажем, за 3 0 дней) мы получим максимальный размер каждого Volume, которые теоретически можно перезаписывать. То есть:

7 Tb / 716 = 716.8

и со следующими настройками для пула:

Pool {
  Name = Full
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 30 days
  File Retention = 30 days
  Recycle Oldest Volume = yes
  Recycle Current Volume = yes
  Maximum Volume Bytes = 10G
  Maximum Volumes = 716
  Label Format = "Full-"
  Maximum Volume Jobs = 1
  RecyclePool = Scratch
}

после 30 дней тома в “Full” storage pool будут переходить в состояние Prune, и при выаолнении задания такие тома будут перезаписаны. Но, увы, даже если максимальное количество выполняемых для данного Pool’а заданий равно еденице, могут возникнуть такие ситуации, когда для перезаписи может не хватить места. Лучше всего, данные периодически очищать, используя Admin Jobs — служебные задания, предназначенные для запуска каких-либо скриптов.

Для очистки Pool’а можно использовать мой скрипт. Клонируем его в папку Bareos Director:

# cd /etc/bareos/bareos-dir.d
# git clone https://github.com/alexanderbazhenoff/scripts-various.git
# chmod +x /etc/bareos/bareos-dir.d/scripts-various/bareos-scripts/clean_expired_baros_volumes.sh

и создаем Admin Job для запуска этого скрипта. Допустим, очищать будем каждый день:

# cat /etc/bareos/bareos-dir.d/schedule/Daily.conf
Schedule {
  Name = "Daily"
  Run = daily at 21:00
}

перед остальными заданиями (наивысший приоритет — 1) все тома в пуле “Full”, старше 31 дня:

# cat /etc/bareos/bareos-dir.d/job/autoclean.conf
Job {
    Name = "Autoclean"
    JobDefs = "DefaultJob"
    Schedule = "Daily"
    Type = "Admin"
    Priority = 1
RunScript {
        Runs When = Before
        Runs On Client = no
        Fail Job On Error = yes
        Command = "/etc/bareos/bareos-dir.d/scripts-various/bareos-scripts/clean_expired_baros_volumes.sh --action delete --expire 31 --name Full-"
    }
}

и соответственно дефолтный JobDef (если вы не используете Differential и Incrimential Pool можно закоментировать, как в примере ниже):

# cat /etc/bareos/bareos-dir.d/jobdefs/DefaultJob.conf
JobDefs {
  Name = "DefaultJob"
  Type = Backup
  Level = Incremental
  Client = bareos-fd
  FileSet = "Catalog"
  Schedule = "Daily"
  Storage = File
  Messages = Standard
  Pool = Full
  Priority = 10
  Write Bootstrap = "/var/lib/bareos/%c.bsr"
  Full Backup Pool = Full        
#  Differential Backup Pool = Differential  
#  Incremental Backup Pool = Incremental    
}

Вместо того, чтобы удалять все тома старше N дней можно так же фильтровать по их статусу: например, “Pruned”. Для этого нужно добавить параметр:

--filter Pruned

Полное описание параметров можно получить:

# ./clean_expired_baros_volumes.sh --help

За подробной информацией можно обратиться сюда.

Допонительные операции над томами.

Иногда в отдельных случаях приходится выполнять отдельные операцин над томами. Все нижеперечисленные операции производятся от root’а. Получить список всех присутствующих в базе данных bareos пулов можно командами:

# bconsole
* list pool

а томов:

* list volume

Или одной строкой без последующего “quit”:

# echo "list pool" | bconsole
# echo "list volume" | bconsole

Соответственно, можно сравнить с помощью скрипта и удалить тома с диска, которые отсутствуют в базе данных:

#!/bin/bash
# Set Pool mount folder
poolmount=/mnt/folder
cd $poolmount
for i in `find . -maxdepth 1 -type f -printf "%f\n"`; do
     echo "list volume=$i" | bconsole | \
     if grep --quiet "No results to list"; then
           echo "$i is ready to be deleted"
           rm -f $poolmount/$i
     fi
done
exit 0

Перевод отдельного тома <volume_name> в состгяние “prune”:

# bconsole
* prune volume=<volume_name> yes

Замените “prune” на “purge”, или “delete” в зависимости от требуемого состояния тома. При переводе в состояние “delete” файл удаляется лишь из списка томов bareos, физически он по прежнему остается на диске:

# rm -f <volume_name>

Не сложно догадаться, что можно указать в цикле диапазон номеров томов (например: 0006–1020) и перевести их в необходимый статус. Следующий пример переводит тома в статус “delete”:

#!/bin/bash
echo "WARNING!"
echo "This will remove selected range of volumes in pool."
echo "Sleep 30 for sure..."
sleep 30
volumename="Incremental-"
for i in {0006..1020}
     do
            echo "Delete volume: ${volumename}${i}"
            echo "delete volume=${volumename}${i} yes" | bconsole
     done

Следующий скрипт переведет все сущуествующие в базе данных bareos тома в пуле “Incremental” статус “purged”:

#!/bin/sh

poolname="Incremental"
volumes=`mysql -u root -B \
  -e'select VolumeName from Media order by VolumeName;' bareos | \
  tail -n+2 | grep $poolname`

echo "This will purge all volumes in ${volumename}.
echo "Sleep 30 for sure..."
sleep 30

for vol in `echo $volumes`
do
   echo "purge volume=${vol} yes" | bconsole
done

и далее уже с помощью другого скрипта физически удалить все тома, которые находятся в состоянии “purged”:

#!/bin/bash
for f in `echo "list volume" | bconsole | grep Purged | \
      cut -d ' ' -f6`; do
           echo "delete volume=$f yes" | bconsole;
           rm -rf /mnt/nas/$f;
done
exit 0

Создавать тома можно командой label:

# bconsole
label
Full-9998

и выбираем Pool:

Defined Pools:
     1: Scratch
     2: Full
Select the Pool (1-2): 2

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

#!/bin/bash
volumename="Incremental"
for i in {9990..9999}
        do
                echo "Creating volume: ${volumename}-0${i}"
                echo -e "label\n${volumename}-0${i}\n2" | bconsole
        done

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