Резервное копирование в Yandex Object Storage с помощью Bacula
Yandex Object Storage можно использовать для резервного копирования и восстановления данных виртуальной машины с помощью утилиты Bacula
Bacula состоит из нескольких компонентов:
- Bacula Director — контролирует резервное копирование и восстановление.
- File Daemon — обеспечивает доступ к файлам для резервного копирования.
- Storage Daemon — осуществляет чтение и запись файлов на жесткий диск.
- Catalog — поддерживает каталог файлов для резервного копирования. Каталог хранится в базе данных MariaDB
. - Bacula Console — консоль управления для взаимодействия с Bacula Director.
Чтобы настроить резервное копирование и восстановление с помощью Bacula:
- Подготовьте облако к работе.
- Создайте виртуальную машину.
- Настройте AWS CLI.
- Установите Bacula и дополнительные компоненты.
- Настройте базу данных MariaDB.
- Сконфигурируйте хранилище.
- Настройте компоненты Bacula.
- Запустите резервное копирование.
- Восстановите файлы.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки резервного копирования и восстановления входит:
- плата за вычислительные ресурсы и диски ВМ (см. тарифы Yandex Compute Cloud);
- плата за хранение данных в бакете и операции с ними (см. тарифы Yandex Object Storage);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud).
Создайте бакет
Чтобы создать бакет для резервного копирования в Object Storage:
- Перейдите в консоль управления
Yandex Cloud и выберите каталог, в котором будете выполнять операции. - На странице каталога нажмите кнопку Создать ресурс и выберите Бакет.
- В поле Имя введите имя бакета.
- Задайте параметры публичного доступа на чтение объектов в бакете, получение списка объектов и чтение настроек бакета —
Ограниченный
. - В поле Класс хранилища выберите Холодное.
- Нажмите кнопку Создать бакет.
Создайте сервисный аккаунт
Создайте сервисный аккаунт и назначьте ему роль editor
.
Создайте статические ключи доступа
Создайте статические ключи доступа.
Сразу сохраните идентификатор key_id
и секретный ключ secret
. Получить значение ключа снова будет невозможно.
Создайте виртуальную машину
Чтобы создать ВМ:
-
В консоли управления
выберите каталог, в котором будет создана ВМ. -
В списке сервисов выберите Compute Cloud.
-
На панели слева выберите
Виртуальные машины. -
Нажмите кнопку Создать виртуальную машину.
-
В блоке Образ загрузочного диска выберите публичный образ CentOS 7.
-
В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
-
В блоке Вычислительные ресурсы перейдите на вкладку Своя конфигурация и укажите параметры:
- Платформа —
Intel Ice Lake
. - vCPU —
2
. - Гарантированная доля vCPU —
20%
. - RAM —
2 ГБ
.
- Платформа —
-
В блоке Сетевые настройки:
-
В поле Подсеть укажите идентификатор подсети в зоне доступности создаваемой ВМ или выберите облачную сеть из списка.
-
У каждой сети должна быть как минимум одна подсеть. Если подсети нет, создайте ее, выбрав Создать подсеть.
-
Если сети нет, нажмите Создать сеть и создайте ее:
- В открывшемся окне укажите имя сети и выберите каталог, в котором она будет создана.
- (Опционально) Выберите опцию Создать подсети, чтобы автоматически создать подсети во всех зонах доступности.
- Нажмите Создать сеть.
-
-
В поле Публичный адрес выберите
Автоматически
, чтобы назначить виртуальной машине случайный внешний IP-адрес из пула Yandex Cloud, или выберите статический адрес из списка, если вы зарезервировали его заранее.
-
-
В блоке Доступ выберите SSH-ключ и укажите данные для доступа к ВМ:
-
В поле Логин введите имя пользователя, который будет создан на виртуальной машине, например
yc-user
.Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к ВМ по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемой виртуальной машины.
-
-
В блоке Общая информация задайте имя ВМ:
bacula-vm
. -
Нажмите Создать ВМ.
-
Дождитесь перехода ВМ в статус
RUNNING
.
Настройте AWS CLI
Чтобы настроить утилиту AWS CLI на ВМ bacula-vm
:
-
В консоли управления
перейдите на страницу ВМ и узнайте ее публичный IP-адрес. -
Подключитесь к ВМ по протоколу SSH.
Рекомендуемый способ аутентификации при подключении по SSH — с помощью пары ключей. Настройте использование созданной пары ключей: закрытый ключ должен соответствовать открытому ключу, переданному на ВМ.
-
Обновите установленные в системе пакеты, для этого в терминале выполните команду:
yum update -y
-
Установите AWS CLI:
yum install awscli -y
-
Настройте 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
.
-
Проверьте, что файл
/root/.aws/credentials
содержит правильные значения параметровkey_id
иsecret
:sudo cat /root/.aws/credentials
-
Проверьте, что файл
/root/.aws/config
содержит правильные значения параметровDefault region name
иDefault output format
:sudo cat /root/.aws/config
Установите Bacula и дополнительные компоненты
-
Установите компоненты Bacula:
sudo yum install -y bacula-director bacula-storage bacula-console bacula-client
-
Установите базу данных MariaDB
:sudo yum install -y mariadb-server
-
Установите утилиту
s3fs
для монтирования бакета Object Storage в файловую систему:sudo yum install -y epel-release sudo yum install -y s3fs-fuse
-
Установите текстовый редактор
nano
:sudo yum install -y nano
Настройте базу данных MariaDB
-
Запустите MariaDB:
sudo systemctl start mariadb
-
Проверьте, что MariaDB запущена:
sudo systemctl status mariadb | grep Active
-
Включите запуск MariaDB при старте системы:
sudo systemctl enable mariadb
-
Создайте таблицы БД и настройте права доступа:
/usr/libexec/bacula/grant_mysql_privileges /usr/libexec/bacula/create_mysql_database -u root /usr/libexec/bacula/make_mysql_tables -u bacula
-
Настройте безопасность БД:
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.
-
Войдите в командную строку БД и введите пароль суперпользователя
root
, созданный на предыдущем шаге:mysql -u root -p
-
Создайте пароль
bacula_db_password
для пользователяbacula
:UPDATE mysql.user SET Password=PASSWORD('bacula_db_password') WHERE User='bacula'; FLUSH PRIVILEGES; exit
-
Настройте использование MySQL-библиотеки для Bacula:
sudo alternatives --config libbaccats.so
Введите
1
, чтобы выбрать MySQL: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
Сконфигурируйте хранилище
Подготовьте папку для резервного копирования
-
Создайте папку для резервного копирования
/tmp/bacula
:sudo mkdir /tmp/bacula
-
Настройте права доступа к папке
/tmp/bacula
:sudo chown -R bacula:bacula /tmp/bacula sudo chmod -R 700 /tmp/bacula sudo semanage permissive -a bacula_t
Смонтируйте бакет в файловую систему
-
Смонтируйте бакет с помощью утилиты
s3fs
, чтобы загружать резервные копии в Object Storage, для этого выполните команду, указав имя бакета:sudo s3fs <имя_бакета> /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
Где:
uid=133
— идентификатор пользователяbacula
из файла/etc/passwd
.gid=133
— идентификатор группыbacula
из файла/etc/passwd
.
-
Проверьте права доступа к папке
/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 ..
-
Проверьте, что пользователь
bacula
может создавать файлы в папке/tmp/bacula
:-
Временно включите оболочку
bash
для пользователяbacula
:sudo sed -i "/^bacula/ s@/sbin/nologin@/bin/bash@" /etc/passwd
-
Создайте произвольный файл в папке
/tmp/bacula
:sudo runuser -l bacula -c 'touch /tmp/bacula/test.test'
-
Убедитесь, что файл
test.test
создан в папке/tmp/bacula
:sudo ls -la /tmp/bacula | grep test.test
-
В консоли управления
на странице каталога выберите сервис Object Storage и убедитесь, что файлtest.test
появился в бакете. -
Удалите тестовый файл:
sudo runuser -l bacula -c 'rm -f /tmp/bacula/test.test'
-
Отключите оболочку
bash
для пользователяbacula
:sudo sed -i "/^bacula/ s@/bin/bash@/sbin/nologin@" /etc/passwd
-
Настройте компоненты Bacula
Настройте Bacula Director
-
Откройте конфигурационный файл Bacula Director:
sudo nano /etc/bacula/bacula-dir.conf
-
Чтобы настроить соединение с Bacula Director, в блоке конфигурации
Director
добавьте строкуDirAddress = 127.0.0.1
:... Director { # define myself Name = bacula-dir DIRport = 9101 # Specify the port (a positive integer) on which the Director daemon will listen for Bacula Console connections. # This same port number must be specified in the Director resource of the Console configuration file. # The default is 9101, so normally this directive need not be specified. # This directive should not be used if you specify the DirAddresses (plural) directive. 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 } ...
-
Для удобства переименуйте задачу
BackupClient1
наBackupFiles
:... Job { Name = "BackupFiles" JobDefs = "DefaultJob" } ...
-
Чтобы назначить
/tmp/bacula-restores
папкой для восстановленных файлов, в конфигурации задачиRestoreFiles
добавьте строкуWhere = /tmp/bacula-restores
:... Job { Name = "RestoreFiles" Type = Restore Client=bacula-fd FileSet="Full Set" Storage = File Pool = Default Messages = Standard Where = /tmp/bacula-restores } ...
-
В блоке конфигурации
FileSet
с именемFull Set
, в разделеInclude
:- Добавьте строку
compression = GZIP
в разделOptions
для сжатия при резервировании. - Укажите
File = /
для резервирования всей файловой системы.
... FileSet { Name = "Full Set" Include { Options { signature = MD5 compression = GZIP } File = / } Exclude { File = /var/spool/bacula File = /tmp File = /proc File = /tmp File = /.journal File = /.fsck } } ...
- Добавьте строку
-
В консоли управления
перейдите на страницу ВМ и узнайте ее внутренний IP-адрес. -
Чтобы настроить исходящее подключение к Storage Daemon, в блоке конфигурации
Storage
в полеAddress
укажите внутренний 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 } ...
-
Для подключения к БД в блоке конфигурации
Catalog
укажите пароль для БДdbpassword = "bacula_db_password"
, созданный при настройке MariaDB:... # 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" } ...
-
Сохраните файл.
-
Проверьте, что в файле
bacula-dir.conf
нет синтаксических ошибок:sudo bacula-dir -tc /etc/bacula/bacula-dir.conf
Если сообщений об ошибках нет, конфигурация корректна.
Настройте Storage Daemon
-
Откройте конфигурационный файл Storage Daemon:
sudo nano /etc/bacula/bacula-sd.conf
-
Чтобы настроить входящее соединение со Storage Daemon, в блоке конфигурации
Storage
, в полеSDAddress
укажите внутренний IP-адрес ВМ:... Storage { # definition of myself Name = BackupServer-sd SDPort = 9103 # Specifies port number on which the Storage daemon listens for Director connections. The default is 9103. WorkingDirectory = "/var/spool/bacula" Pid Directory = "/var/run/bacula" Maximum Concurrent Jobs = 20 SDAddress = <внутренний_IP-адрес_ВМ> # This directive is optional, and if it is specified, # it will cause the Storage daemon server (for Director and File daemon connections) to bind to the specified IP-Address, # which is either a domain name or an IP address specified as a dotted quadruple. # If this directive is not specified, the Storage daemon will bind to any available address (the default). } ...
-
В блоке конфигурации
Device
укажите папку для резервного копирования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; } ...
-
Сохраните файл.
-
Проверьте, что в файле
bacula-sd.conf
нет синтаксических ошибок:sudo bacula-sd -tc /etc/bacula/bacula-sd.conf
Если сообщений об ошибках нет, конфигурация корректна.
Создайте пароли для компонентов Bacula
Bacula Director, Storage Daemon и File Daemon используют пароли для межкомпонентной аутентификации.
Чтобы установить пароли для компонентов Bacula:
-
Сгенерируйте пароли для 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`
-
Поместите пароли в конфигурационные файлы:
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
-
Запустите компоненты Bacula:
sudo systemctl start bacula-dir sudo systemctl start bacula-sd sudo systemctl start bacula-fd
-
Проверьте, что компоненты Bacula запущены:
sudo systemctl status bacula-dir sudo systemctl status bacula-sd sudo systemctl status bacula-fd
-
Настройте запуск компонентов Bacula при старте системы:
sudo systemctl enable bacula-dir sudo systemctl enable bacula-sd sudo systemctl enable bacula-fd
Запустите резервное копирование
-
Откройте Bacula Console:
sudo bconsole
-
Чтобы настроить профиль резервного копирования, создайте метку:
label
-
Присвойте название
MyVolume
новому тому:Enter new Volume name: MyVolume
-
Чтобы выбрать пул
File
, введите2
:Defined Pools: 1: Default 2: File 3: Scratch Select the Pool (1-3): 2
-
Запустите резервное копирование:
run
Чтобы запустить задачу
BackupFiles
, выберите1
:A job name must be specified. The defined Job resources are: 1: BackupFiles 2: BackupCatalog 3: RestoreFiles Select Job resource (1-3): 1
Чтобы подтвердить запуск, введите
yes
:OK to run? (yes/mod/no): yes
-
Проверьте статус резервного копирования:
status director
Результат, если резервное копирование выполняется:
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
Результат, если резервное копирование завершено:
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
-
Дождитесь завершения резервного копирования и выйдите из Bacula Console:
exit
Проверьте резервную копию
Чтобы убедиться, что резервное копирование выполнено:
- В консоли управления
на странице каталога выберите сервис Object Storage. - Откройте бакет.
- Убедитесь, что внутри находится объект
MyVolume
.
Восстановите файлы
-
Чтобы проверить восстановление, предварительно удалите произвольный файл, например утилиту
ping
:sudo rm -f /bin/ping
-
Убедитесь, что утилита
ping
удалена:ping
Результат:
bash: ping: command not found
-
Войдите в Bacula Console:
sudo bconsole
-
Запустите полное восстановление:
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
-
Проверьте статус восстановления:
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
Результат, если восстановление завершено:
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
-
Дождитесь завершения восстановления и выйдите из Bacula Console:
exit
Проверьте восстановленные файлы
-
Убедитесь, что в папке
/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
-
Убедитесь, что утилита
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
-
Скопируйте утилиту
ping
в основную файловую систему:sudo cp /tmp/bacula-restores/bin/ping /bin/ping
-
Убедитесь, что
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
-
Чтобы освободить место на диске, удалите копию восстановленных файлов:
sudo rm -rfd /tmp/bacula-restores/*
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: