Бэкап с помощью системы резервного копирования Bacula на Centos 7

С помощью этой инструкции вы выполните:

  • установку системы Bacula в инфраструктуре Яндекс.Облака;
  • настройку компонентов Bacula;
  • бэкап системы на Yandex Object Storage;
  • восстановление системных файлов из бэкапа.
  1. Обзор компонентов Bacula.
  2. Подготовьте облако к работе.
  3. Создайте и настройте виртуальную машину.
  4. Установите необходимые компоненты.
  5. Настройте базу данных MariaDB.
  6. Настройте хранилище для бэкапа.
  7. Настройте компоненты Bacula.
  8. Запустите резервное копирование.
  9. Проверьте корректность резервного копирования.
  10. Запустите восстановление.
  11. Проверьте корректность восстановления.
  12. Удалите созданные облачные ресурсы.

Обзор компонентов Bacula

Система резервного копирования Bacula имеет модульную структуру, состоящую из следующих компонентов:

  • Bacula Director - программа, которая контролирует бэкап и восстановление, выполняемые компонентами File Daemon и Storage Daemon.
  • File Daemon - программа, которая обеспечивает доступ к файлам для резервирования.
  • Storage Daemon - программа, которая осуществляет чтение и запись на жесткий диск.
  • Catalog - это сервисы, поддерживающие каталог файлов предназначенных для бэкапа. Каталог хранится в SQL базе данных.
  • Bacula Console - интерфейс командной строки для взаимодействия с Bacula Director.

Подготовьте облако к работе

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

  1. Перейдите в консоль управления, затем войдите в Облако или зарегистрируйтесь, если вы еще не зарегистрированы.
  2. На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его.

Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша виртуальная машина. Перейдите на страницу облака и выберите или создайте каталог, в котором вы хотите создать виртуальную машину для вашего сервера. Подробнее об иерархии ресурсов Облака.

Необходимые платные ресурсы

В стоимость инфраструктуры для примера входит:

Создайте и настройте виртуальную машину

Создайте виртуальную машину:

Чтобы создать виртуальную машину:

  1. На странице каталога в консоли управления нажмите кнопку Создать ресурс и выберите пункт Виртуальная машина.

  2. В поле Имя введите имя виртуальной машины, например bacula-vm.

    • Длина — от 3 до 63 символов.
    • Может содержать строчные буквы латинского алфавита, цифры и дефисы.
    • Первый символ — буква. Последний символ — не дефис.
  3. Выберите зону доступности, в которой должна находиться виртуальная машина.

  4. В блоке Публичные образы выберите образ Centos 7.

  5. В блоке Вычислительные ресурсы выберите следующую конфигурацию:

    • Платформа — Intel Cascade Lake.
    • Гарантированная доля vCPU — 20%.
    • vCPU — 2.
    • RAM — 2 ГБ.
  6. В блоке Сетевые настройки нужно выбрать сеть и подсеть, к которым нужно подключить виртуальную машину. Если нужной сети или подсети еще нет, вы можете создать их прямо на странице создания виртуальной машины.

  7. В поле Публичный адрес оставьте значение Автоматически, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Яндекс.Облака. Чтобы внешний IP-адрес не изменялся после остановки виртуальной машины, сделайте его статическим.

  8. Укажите данные для доступа на виртуальную машину:

    Предупреждение

    IP-адрес и имя хоста (FQDN) для подключения к машине будут назначены ей при создании. Если вы выбрали вариант Без адреса в поле Публичный адрес, вы не сможете обращаться к виртуальной машине из интернета.

  9. Нажмите кнопку Создать ВМ.

Создание виртуальной машины может занять несколько минут.

Настройте Yandex.Cloud CLI

  1. Зайдите на виртуальную машину по SSH.
  2. Установите Yandex.Cloud CLI по инструкции:
    1. Выполните установку.
      curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
      
    2. Перезапустите shell.
      exec -l $SHELL
      
    3. Выполните инициализацию.
      yc init
      
  3. Убедитесь, что Yandex.Cloud CLI функционирует корректно:
    yc config list
    
    Результатом должен быть вывод настроек произведенных на этапе конфигурации.

Настройте сервисный аккаунт

  1. Создайте сервисный аккаунт, назовите его, например bacula:
    yc iam service-account create --name bacula --description "this is bacula service account"
    
  2. Узнайте идентификатор каталога по инструкции:
  3. Узнайте идентификатор вашего сервисного аккаунта, подставив соответствующий идентификатор каталога:
    yc iam service-account --folder-id <FOLDER-ID>  get bacula
    
    На выводе вы получите одну из строк вида:
    id: <SERVICE-ACCOUNT-ID>
    
  4. Назначьте роль editor для вашего сервисного аккаунта, подставив соответствующее значение:
    yc resource-manager folder add-access-binding default --role editor --subject serviceAccount:<SERVICE-ACCOUNT-ID>
    
  5. Создайте статический ключ доступа для вашего сервисного аккаунта:
    yc iam access-key create --service-account-name bacula --description "this key is for bacula"
    
    Сохраните следующие значения, они понадобятся для конфигурации AWS CLI:
    • key_id
    • secret

Настройте AWS CLI

  1. Установите yum репозиторий:
    sudo yum install epel-release -y
    
  2. Установите pip:
    sudo yum install python-pip -y
    
  3. Установите AWS CLI:
    sudo pip install awscli --upgrade
    
  4. Настройте AWS CLI:
    sudo aws configure
    
    • AWS Access Key ID - это значение key_id из раздела Настройте сервисный аккаунт.
    • AWS Secret Access Key - это значение secret там же.
    • Default region name - введите ru-central1
    • Default output format - введите json
  5. Проверьте, что файл /root/.aws/credentials содержит правильные значения:
    sudo cat /root/.aws/credentials
    
  6. Проверьте, что файл /root/.aws/config содержит правильные значения:
    sudo cat /root/.aws/config
    

Установите необходимые компоненты

  1. Установите компоненты Baucla:
    sudo yum install -y bacula-director bacula-storage bacula-console bacula-client
    
  2. Установите базу данных MariaDB:
    sudo yum install -y mariadb-server
    
  3. Установите s3fs для монтирования Object Storage бакета на сервер:
    sudo yum install -y s3fs-fuse
    
  4. Установите текстовый редактор nano:
    sudo yum install -y nano
    

Настройте базу данных MariaDB

  1. Запустите MariaDB:

    sudo systemctl start mariadb
    
  2. Убедитесь, что сервис базы данных в статусе running:

    sudo systemctl status mariadb | grep Active
    
  3. Включите запуск сервера базы данных при старте системы:

    sudo systemctl enable mariadb
    
  4. Выполните следующие скрипты для создания необходимых таблиц в базе данных и настройки разрешений:

    /usr/libexec/bacula/grant_mysql_privileges
    /usr/libexec/bacula/create_mysql_database -u root
    /usr/libexec/bacula/make_mysql_tables -u bacula    
    
  5. Выполните скрипт для настройки безопасности базы данных:

    sudo mysql_secure_installation
    

    В соответствующие запросы введите значения, показанные ниже:

    Enter current password for root (enter for none): <ENTER>
    Set root password? [Y/n] y
    Remove anonymous users? [Y/n] <ENTER>
    Disallow root login remotely? [Y/n] <ENTER>
    Remove test database and access to it? [Y/n] <ENTER>
    Reload privilege tables now? [Y/n] <ENTER>
    
  6. Войдите в командную строку базы данных и введите пароль пользователя root, который был создан на передыдущем шаге:

    mysql -u root -p
    
  7. Создайте пароль для вашей базы данных:

    UPDATE mysql.user SET Password=PASSWORD('bacula_db_password') WHERE User='bacula';
    FLUSH PRIVILEGES;
    exit
    
  8. Настройте использование mysql-библиотеки для Bacula:

    sudo alternatives --config libbaccats.so
    

    Выберите 1:

      Selection    Command
    -----------------------------------------------
       1           /usr/lib64/libbaccats-mysql.so
       2           /usr/lib64/libbaccats-sqlite3.so
    *+ 3           /usr/lib64/libbaccats-postgresql.so
    
    Enter to keep the current selection[+], or type selection number: 1
    

Настройте хранилище для бэкапа

Подготовьте необходимые директории на сервере

  1. Создайте директорию для бэкапа:

    sudo mkdir /tmp/bacula    
    
  2. Настройте разрешения:

    sudo chown -R bacula:bacula /tmp/bacula
    sudo chmod -R 700 /tmp/bacula  
    sudo semanage permissive -a bacula_t 
    

Создайте бакет в Object Storage

  1. Создайте Object Storage бакет по инструкции:

    • Назовите бакет, например bacula-bucket.
    • Максимальный размер оставьте по умолчанию.
    • Доступ к бакету - Ограниченный.
    • Класс хранилища - Холодное.
  2. Зайдите в консоль Яндекс.Облака в раздел Object Storage и убедитесь, что бакет успешно создался.

Смонтируйте бакет в файловую систему на сервере

Чтобы загружать бэкап файловой системы на Object Storage в облаке нужно смонтировать бакет в файловую систему с помощью утилиты s3fs.

  1. Запустите команду:

    sudo s3fs bacula-bucket /tmp/bacula -o url=https://storage.yandexcloud.net -o use_path_request_style -o allow_other -o nonempty -o uid=133,gid=133,mp_umask=077
    
    • bacula-bucket - название Object Storage бакета
    • uid=133,gid=133 - идентификаторы пользователя bacula и группы bacula из файла /etc/passwd
  2. Проверьте корректность выставленных разрешений в папке /tmp/bacula:

    sudo ls -la /tmp/bacula/
    
    drwx------.  2 bacula bacula        31 Sep 18 09:16 .
    drwxrwxrwt. 10 root   root         265 Sep 18 08:59 ..
    
  3. Проверьте что пользователь bacula может создавать файлы в папке /tmp/bacula.

    1. Временно включите оболочку bash для пользователя bacula:
      sudo sed -i "/^bacula/ s@/sbin/nologin@/bin/bash@" /etc/passwd 
      
    2. Создайте произвольный файл в папке /tmp/bacula:
      sudo runuser -l  bacula -c 'touch /tmp/bacula/test.test' 
      
    3. Убедитесь, что файл test.test успешно создался в папке /tmp/bacula:
      sudo ls -la /tmp/bacula | grep test.test 
      
    4. Убедитесь, что файл test.test успешно появился в Object Storage бакете.
    5. Удалите тестовый файл:
      sudo runuser -l  bacula -c 'rm -f /tmp/bacula/test.test' 
      
    6. Отключите оболочку bash для пользователя bacula:
      sudo sed -i "/^bacula/ s@/bin/bash@/sbin/nologin@" /etc/passwd 
      

Настройте компоненты Bacula

Настройте Bacula Director

  1. Откройте конфигурационный файл Bacula Director:

    sudo nano /etc/bacula/bacula-dir.conf
    
  2. Настройте Bacula Director на текущей виртуальной машине, добавив строку DirAddress = 127.0.0.1 в раздел Director {}:

    Director {                            # define myself
      Name = bacula-dir
      DIRport = 9101                # where we listen for UA connections
      QueryFile = "/etc/bacula/query.sql"
      WorkingDirectory = "/var/spool/bacula"
      PidDirectory = "/var/run"
      Maximum Concurrent Jobs = 1
      Password = "@@DIR_PASSWORD@@"         # Console password
      Messages = Daemon
      DirAddress = 127.0.0.1
    }    
    
  3. Для удобства переименуйте задачу по умолчанию с BackupClient1 на BackupFiles:

    Job {
      Name = "BackupFiles"
      JobDefs = "DefaultJob"
    }
    
  4. Назначьте папку /tmp/bacula-restores, в которую будут помещаться файлы из бэкапа при восстановлении:

    Job {
      Name = "RestoreFiles"
      Type = Restore
      Client=bacula-fd
      FileSet="Full Set"
      Storage = File
      Pool = Default
      Messages = Standard
      Where = /tmp/bacula-restores
    }
    
  5. Добавьте следующие строчки в раздел FileSet:

    • compression = GZIP - для сжатия при резервировании
    • File = / - для резервирования всей файловой системы
    FileSet {
      Name = "Full Set"
      Include {
        Options {
          signature = MD5
          compression = GZIP
        }    
    File = /
    }
      Exclude {
        File = /var/lib/bacula
        File = /proc
        File = /tmp
        File = /.journal
        File = /.fsck
      }
    }
    
  6. Настройте соединение с Storage Daemon, указав внутренний IP-адрес виртуальной машины:

    Storage {
      Name = File
    # Do not use "localhost" here
      Address = <внутренний IP-адрес виртуальной машины>  # N.B. Use a fully qualified name here
      SDPort = 9103
      Password = "@@SD_PASSWORD@@"
      Device = FileStorage
      Media Type = File
    }
    
  7. Настройте Catalog, указав созданный ранее пароль для базы данных dbpassword = "bacula_db_password":

    # Generic catalog service
    Catalog {
      Name = MyCatalog
    # Uncomment the following line if you want the dbi driver
    # dbdriver = "dbi:postgresql"; dbaddress = 127.0.0.1; dbport =
      dbname = "bacula"; dbuser = "bacula"; dbpassword = "bacula_db_password"
    }
    
  8. Сохраните файл.

  9. Проверьте, что файл не содержит синтаксические ошибки:

    sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
    

Настройте Storage Daemon

  1. Откройте конфигурационный файл:
    sudo nano /etc/bacula/bacula-sd.conf
    
  2. Настройте соединение с Storage Daemon, указав SDAddress = <внутренний IP-адрес виртуальной машины>:
    Storage {                             # definition of myself
      Name = BackupServer-sd
      SDPort = 9103                  # Director's port
      WorkingDirectory = "/var/lib/bacula"
      Pid Directory = "/var/run/bacula"
      Maximum Concurrent Jobs = 20
      SDAddress = <внутренний IP-адрес виртуальной машины> 
    }
    
  3. Укажите директрию для бэкапа Archive Device = /tmp/bacula:
    Device {
      Name = FileStorage
      Media Type = File
      Archive Device = /tmp/bacula 
      LabelMedia = yes;                   # lets Bacula label unlabeled media
      Random Access = Yes;
      AutomaticMount = yes;               # when device opened, read it
      RemovableMedia = no;
      AlwaysOpen = no;
    }
    
  4. Сохраните файл.
  5. Проверьте, что файл не содержит синтаксические ошибки:
    sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
    

Создайте пароли для компонентов Bacula:

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

  1. Сгенерируйте пароли для Bacula Director, Storage Daemon и File Daemon:
    DIR_PASSWORD=`date +%s | sha256sum | base64 | head -c 33`
    SD_PASSWORD=`date +%s | sha256sum | base64 | head -c 33`
    FD_PASSWORD=`date +%s | sha256sum | base64 | head -c 33`
    
  2. Поместите пароли в соответствующие конфигурационные файлы:
    sudo sed -i "s/@@DIR_PASSWORD@@/${DIR_PASSWORD}/" /etc/bacula/bacula-dir.conf
    sudo sed -i "s/@@DIR_PASSWORD@@/${DIR_PASSWORD}/" /etc/bacula/bconsole.conf
    sudo sed -i "s/@@SD_PASSWORD@@/${SD_PASSWORD}/" /etc/bacula/bacula-sd.conf
    sudo sed -i "s/@@SD_PASSWORD@@/${SD_PASSWORD}/" /etc/bacula/bacula-dir.conf
    sudo sed -i "s/@@FD_PASSWORD@@/${FD_PASSWORD}/" /etc/bacula/bacula-dir.conf
    sudo sed -i "s/@@FD_PASSWORD@@/${FD_PASSWORD}/" /etc/bacula/bacula-fd.conf
    

Запустите компоненты Bacula

  1. Запустите компоненты Bacula:
    sudo systemctl start bacula-dir
    sudo systemctl start bacula-sd
    sudo systemctl start bacula-fd
    
  2. Проверьте запущены ли компоненты Bacula:
    sudo systemctl status bacula-dir
    sudo systemctl status bacula-sd
    sudo systemctl status bacula-fd
    
  3. Настройте запуск компонентов Bacula при старте системы:
    sudo systemctl enable bacula-dir
    sudo systemctl enable bacula-sd
    sudo systemctl enable bacula-fd
    

Запустите резервное копирование

  1. Запустите Bacula Console:

    sudo bconsole
    
  2. Настройте профиль резервного копирования, создав label:

    label
    
  3. Присвойте название новому volume:

    Enter new Volume name: MyVolume
    
  4. Выберите 2:

    Defined Pools:
         1: Default
         2: File
         3: Scratch
    Select the Pool (1-3): 2
    
  5. Запустите резервное копирование:

    run    
    
  6. Выберите 1, чтобы запустить BackupFiles:

    A job name must be specified.
    The defined Job resources are:
         1: BackupFiles
         2: BackupCatalog
         3: RestoreFiles
    Select Job resource (1-3): 1    
    
  7. Подтвердите запуск:

    OK to run? (yes/mod/no): yes 
    
  8. Проверьте статус резервного копирования:

    status director
    
  9. Убедитесь, что резервное копирование выполняется:

    Running Jobs:
    Console connected at 12-Sep-19 07:22
     JobId Level   Name                       Status
    ======================================================================
         2 Full    BackupFiles.2019-09-12_07.22.56_03 is running
    

Проверьте корректность резервного копирования

  1. Убедитесь, что резервное копирование успешно завершено, запустив команду в Bacula Console:

    status director
    
    Running Jobs:
    Console connected at 12-Sep-19 07:25
    No Jobs running.
    ====
    
    Terminated Jobs:
     JobId  Level    Files      Bytes   Status   Finished        Name 
    ====================================================================
         2  Full     32,776    483.6 M  OK       12-Sep-19 07:24 BackupFiles    
    
  2. Убедитесь, что каталог с бэкапом успешно создался:

    1. Зайдите в консоль Яндекс.Облака в раздел Object Storage.
    2. Откройте ваш бакет bacula-bucket.
    3. Убедитесь что внутри находится файл MyVolume.

Запустите восстановление

  1. Чтобы убедиться, что бэкап и восстановление отрабатывают корректно, перед восстановлением удалите произвольный файл, например утилиту ping:

    sudo rm -f /bin/ping
    
    ping
    
    bash: ping: command not found
    
  2. Запустите восстановление внутри Bacula Console:

    restore all
    

    Выберите 5, чтобы запустить самый последний выполненный бэкап:

    To select the JobIds, you have the following choices:
         1: List last 20 Jobs run
         2: List Jobs where a given File is saved
         3: Enter list of comma separated JobIds to select
         4: Enter SQL list command
         5: Select the most recent backup for a client
         6: Select backup for a client before a specified time
         7: Enter a list of files to restore
         8: Enter a list of files to restore before a specified time
         9: Find the JobIds of the most recent backup for a client
        10: Find the JobIds for a backup for a client before a specified time
        11: Enter a list of directories to restore for found JobIds
        12: Select full restore to a specified Job date
        13: Cancel
    Select item:  (1-13): 5
    

    Введите done, чтобы подтвердить полное восстановление:

    You are now entering file selection mode where you add (mark) and
    remove (unmark) files to be restored. No files are initially added, unless
    you used the "all" keyword on the command line.
    Enter "done" to leave this mode.
    
    cwd is: /
    $ done
    

    Введите yes, чтобы подтвердить запуск:

    OK to run? (yes/mod/no): yes
    
  3. Убедитесь, что восстановление выполняется::

    status director
    
    Running Jobs:
    Console connected at 12-Sep-19 07:25
     JobId Level   Name                       Status
    ======================================================================
         3         RestoreFiles.2019-09-12_07.27.42_05 is running
    

Проверьте корректность восстановления

  1. Убедитесь, что восстановление завершено, запустив команду в Bacula Console:

    status director
    
    Terminated Jobs:
     JobId  Level    Files      Bytes   Status   Finished        Name 
    ====================================================================
         2  Full     32,776    483.6 M  OK       12-Sep-19 07:24 BackupFiles
         3           32,776    1.136 G  OK       12-Sep-19 07:27 RestoreFiles
    
  2. После восстановления файлы из бэкапа распаковываются в папку /tmp/bacula-restores. Убедитесь, что в этой папке появились файлы из бэкапа:

    sudo ls -la /tmp/bacula-restores
    
    total 16
    dr-xr-xr-x. 15 root   root    201 Sep 12 07:09 .
    drwx------.  4 bacula bacula   35 Sep 12 07:09 ..
    lrwxrwxrwx   1 root   root      7 Sep 12 07:27 bin -> usr/bin
    dr-xr-xr-x   5 root   root   4096 Sep 12 07:01 boot
    drwxr-xr-x   2 root   root      6 Sep 12 07:22 dev
    drwxr-xr-x  79 root   root   8192 Sep 12 07:07 etc
    drwxr-xr-x   3 root   root     18 Sep 12 07:01 home
    lrwxrwxrwx   1 root   root      7 Sep 12 07:27 lib -> usr/lib
    lrwxrwxrwx   1 root   root      9 Sep 12 07:27 lib64 -> usr/lib64
    drwxr-xr-x   2 root   root      6 Apr 11  2018 media
    drwxr-xr-x   2 root   root      6 Apr 11  2018 mnt
    drwxr-xr-x   2 root   root      6 Apr 11  2018 opt
    dr-xr-x---   3 root   root    217 Sep 12 07:21 root
    drwxr-xr-x   2 root   root      6 Sep 12 07:22 run
    lrwxrwxrwx   1 root   root      8 Sep 12 07:27 sbin -> usr/sbin
    drwxr-xr-x   2 root   root      6 Apr 11  2018 srv
    dr-xr-xr-x   2 root   root      6 Sep 12 07:22 sys
    drwxr-xr-x  13 root   root    155 Mar  4  2019 usr
    drwxr-xr-x  19 root   root    267 Sep 12 07:01 var
    
  3. Убедитесь, что утилита ping находится в папке /tmp/bacula-restores:

    sudo ls -la /tmp/bacula-restores/bin/ping
    
    -rwxr-xr-x 1 root root 66176 Aug  4  2017 /tmp/bacula-restores/bin/ping
    
  4. Скопируйте утилиту ping на основную файловую систему:

    sudo cp /tmp/bacula-restores/bin/ping /bin/ping
    
  5. Убедитесь, что ping работает корректно:

    sudo ping 127.0.0.1 -c 1
    
    PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
    64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms
    
    --- 127.0.0.1 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.016/0.016/0.016/0.000 ms
    
  6. После восстановления необходимых файлов, очистите место на диске удалив копию восстановленных файлов:

    sudo rm -rfd /tmp/bacula-restores/*
    

Удалите созданные облачные ресурсы

Если вам больше не нужны облачные ресурсы: