Резервное копирование Bacula в любое облачное хранилище с помощью rclone и rclone-changer

*Добавлен форк rclone-changer, совместимый с Python 3.5 и выше, для избежания ошибок при создании томов с использованием штрих-кодов этикеток.

Это руководство нацелено на размещение работающего Bacula Storage Device в облаке с использованием rclone (https://rclone.org/) и скрипта rclone-changer (https://github.com/wanderleihuttel/rclone-changer). Последний использует виртуальные магнитные ленты, хранящиеся в облаке, как своего рода библиотеку виртуальных лент (VTL) для Bacula. Для этого использовался Amazon S3, также у нас есть подтверждение работы на Oracle Cloud и Google Drive. Подразумевается что скрипт должен работать со всеми rclone-совместимыми облачными хранилищами: Amazon Drive, Amazon S3, Backblaze B2, Box, Ceph, Dreamhost, Dropbox, FTP Google Cloud Storage, Google Drive, HTTP, Hubic, Memset Memstore, Microsoft Azure Blob Storage, Microsoft OneDrive, Minio, OVH, Openstack Swift, Oracle Cloud Storage, QingStor, Rackspace Cloud Files, SFTP, Wasabi, Yandex Disk, а также локальная файловая система.

Функции rclone:

  • Целостность файлов постоянно под контролем через проверку хэшей MD5/SHA1
  • Пометки времени на файлах сохраняются
  • Частичная синхронизация поддерживается на базе полного файла
  • Режим копирования для копирования новых/измененных файлов
  • Односторонний режим синхронизации для создания идентичной директории
  • Режим проверки для проверки совпадения хэша файлов
  • Способность синхронизироваться в и из сети, т.е. использовать два разных аккаунта одновременно
  • Опциональное шифрование (Crypt)
  • Опциональный FUSE mount (rclone mount)

Установка и настройка rclone

Просто введите следующие команды под правами root:

yum -y install unzip wget
wget -qO- https://downloads.rclone.org/rclone-current-linux-amd64.zip -O /tmp/tmp.zip; unzip /tmp/tmp.zip -d /usr/src; rm -f /tmp/tmp.zip
cd /usr/src/rclone-v*
cp rclone /usr/bin/
chown root:root /usr/bin/rclone
chmod 755 /usr/bin/rclone
mkdir -p /usr/local/share/man/man1
cp rclone.1 /usr/local/share/man/man1/
mandb

Далее вам следует войти в ваше облачное хранилище и получить учетные данные для последующего доступа.

Так как мы используем Amazon S3, то сначала заходим в идентификационный сервис IAM, создаем пользователя, устанавливаем его права в отношении сервиса S3 и генерируем Access Key ID и Secret Key. Оба ключа копируются для последующей настройки rclone. Эти шаги показаны в следующих скриншотах:

интерфейс AWS, раздел Users

сгенерированный пользователь и его права доступа

Ключи Access Key ID и прочие данные

Для того чтобы сгенерировать конфигурацию rclone, под правами root введите следующее:

rclone config

Для настройки вашего любимого облачного сервиса следуйте детальной инструкции rclone по адресу: https://rclone.org/docs/

После предоставления имени и прочих данных rclone, rclone config сохранит файл конфигурации по адресу: /root/.config/rclone/rclone.conf

В нашем примере именем, указанным при настройке, стало aws, и вот что получилось в итоге:

[aws]
env_auth = true
access_key_id = AKIAIFTEYM3JK5VUXGBA
secret_access_key = hjqF6wG/tNBqgpBbwBmQ3EQpok5U33W2ewSXD
region = sa-east-1 
endpoint = 
location_constraint = 
acl = private
server_side_encryption = 
storage_class =

Очень важно протестировать доступ rclone к вашему облаку. Проведите несколько тестовых команд, например:

# Fetch bucket list:
rclone lsd aws:
root@hfaria-asus-i5:/# rclone lsd aws:
          -1 2014-10-01 20:27:41        -1 baculaheitor

# If doesn't exist, create a new bucket:
rclone mkdir aws:new_bucket_name

# List bucket contents:
rclone ls aws:baculaheitor

  6311 logs/2014-10-02-01-17-25-7F0DBBBFD43A20B7
     2721 logs/2014-10-02-01-17-31-BFC439050C2B0AA9
      666 logs/2014-10-02-02-17-36-D47447EC8F6759EE
     2079 logs/2014-10-02-02-17-47-24DD21E3B85C5CAF
    40108 logs/2014-10-02-03-17-10-4E9B7A829CEC7842

# Test diectory copy to the bucket:
rclone copy /etc aws:baculaheitor

# Test directory copy from the bucket:
rclone copy aws:baculaheitor /tmp

Наконец, скопируйте рабочую версию файла конфигурации по пути, который видит rclone-changer, как в примере:

cp ~/.config/rclone/rclone.conf /opt/bacula/etc/rclone.conf
chown bacula /opt/bacula/etc/rclone.conf

Пришло время устанавливать rclone-changer.

Установка и настройка rclone-changer

Установите зависимости python и python-yaml:

apt install -y python python-yaml
# or 
yum install -y python python-yaml

Загрузите rclone и создайте необходимые папки:

wget https://github.com/wanderleihuttel/rclone-changer/archive/master.zip -O /tmp/tmp.zip; unzip /tmp/tmp.zip -d /usr/src; rm -f /tmp/tmp.zip
cp /usr/src/rclone-changer-master/rclone-changer /usr/sbin/
chmod +rx /usr/sbin/rclone-changer
chown bacula /opt/bacula/working

Далее, создайте папку и файл, которые будут базой для виртуальной магнитной ленты. Также создайте директорию для сервиса Bacula local disk spooling, он рекомендуется для ускорения бэкапов и увеличения безопасности при копировании в облако:

mkdir /mnt/vtapes && touch /mnt/vtapes/tape && chown -R bacula /mnt/vtapes/
mkdir /mnt/bacula-spool && chown bacula /mnt/bacula-spool

Добавьте такое же устройство в bacula-sd.conf:

Autochanger {
  Name = "rclone_aws"
  Device = aws
  Changer Device = 'aws:baculaheitor' # remote rclone configuration name and bucket. You can also specify a cloud directory
  Changer Command = "/usr/sbin/rclone-changer %c %o %S %a" # don't change this
}

Device {
  Name = aws
  Media Type = aws
  Maximum Changer Wait = 18000 # this should be increase according to the size of the volumes 
  Archive Device = /mnt/vtapes/tape # must match the file created on the prior step
  Autochanger = yes
  LabelMedia = yes;                  
  Random Access = Yes
  AutomaticMount = no             
  RemovableMedia = no
  AlwaysOpen = no
  Spool Directory = /mnt/bacula-spool
  Maximum Spool Size = 524288000
}

Теперь привяжите созданное устройство к вашему Директору и создайте пул для него:

Autochanger {
  Name = Cloud_aws
  Address = sd_address                
  SDPort = 9103
  Password = "EKPNGPoIe7wXO/oe6xwm9cXzHDgmiuS0qF3hyAhpEg+i"
  Device = rclone_aws
  Media Type = aws
  Autochanger = Cloud_aws            
  Maximum Concurrent Jobs = 10       
}

Pool {
  Name = Offsite
  Pool Type = Backup
  Recycle = yes                       
  AutoPrune = yes                    
  Storage = Cloud_aws
  Maximum Volume Bytes = 1073741824 # recommended
  AutoPrune = yes
  Volume Retention = 4 weeks
}

Важно помнить про рекомендации разработчиков при изменении показателя Maximum Volume Bytes:

Рекомендуется использовать большее число томов малого размера. Старайтесь оставаться в пределах размера, в который поместится файл среднего размера (по вашему объему данных). Причиной этому является упрощение процедуры при восстановлении в случае потери оригинальных данных — суть в минимизации количества ненужных данных, получаемых при восстановлении бэкапов. Допустим, если у вас есть виртуальная лента величиной в 10G, но вам надо только 500M — вам все еще придется ждать загрузки всех 10G прежде чем вы сможете начать восстановление. Поэтому средний размер файла находится в районе 700M, и поэтому томы по 1G — хорошая идея.[https://github.com/travisgroth/rclone-changer]

Проверьте (и измените при необходимости) правильность директорий python и rclone-changer, а также права пользователя Bacula (должна быть возможность записи в эти разделы). Также можно изменить количество слотов в вашем роботе.

vi /usr/sbin/rclone-changer

#!/usr/bin/env python
...
    #=====================================================
    # Default params config
    #=====================================================
    rclone     = '/usr/bin/rclone'
    config     = '/opt/bacula/etc/rclone.conf'
    logFile    = '/opt/bacula/working/rclone.log'
    logChanger = '/opt/bacula/working/rclone-changer.log'
    lockFile   = '/opt/bacula/working/.rclonelock'
    stateFile  = '/opt/bacula/working/rclone-changer.state'
    slots      = 100
    #=====================================================

Теперь создайте лейблы для виртуальных лент Bacula. Для этого используйте bconsole:

label barcodes storage=Cloud_aws pool=Offsite

Если есть проблемы с созданием лейблов — проверьте предыдущие команды и права доступа. Для рестарта всего процесса потребуется удалить виртуальную библиотеку томов и файл rclone-changer state:

rm -f /mnt/vtapes/tape*
rm -f /opt/bacula/working/rclone-changer.state
touch /mnt/vtapes/tape && chown -R bacula /mnt/vtapes/

На этом всё. Запустите тестовый бэкап и создайте график бэкапов в облако, настроив его согласно своим нуждам. Виртуальные ленты будут изменены и загружены в облако автоматически, согласно следующим скриншотам:

Лог успешного бэкапа в виртуальную ленту

Список томов виртуальной магнитной ленты

Исправление проблем с rclone-changer

Rclone и rclone-changer хранят свои логи в следующих местах:

cat /opt/bacula/working/rclone.log
cat /opt/bacula/working/rclone-changer.log