Borg Backup - простой и современный инструмент резервного копирования

  • Автор:

borg-backup-installation-and-usage-000.pngРезервное копирование сегодня - это не просто создать архив с данными и разместить его в удаленном хранилище, современные объемы данных делают такое занятие крайне проблемным и дорогостоящим, а максимально эффективно использовать как ресурсы системы хранения, так и пропускную способность каналов передачи данных. Первая задача решается при помощи дедупликации, а разгрузить каналы связи позволяет инкрементное копирование вместе с эффективным сжатием. Всеми этими достоинствами обладает система резервного копирования Borg Backup, а еще она очень проста и универсальна в использовании.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Почему именно Borg Backup? Во многом выбор системы резервного копирования определяется личными предпочтениями, благо выбирать есть из чего, но каждый из нас имеет собственные критерии, которым такая система должна удовлетворять. Поэтому коротко изложим наши предпочтения, которые привели к такому выбору.

Начнем с того, что Borg прост, несмотря на то что это клиент-серверная система, всего лишь один пакет или один бинарные. Тем не менее он может быть как клиентом, так и сервером, при этом превратить клиент в сервер абсолютно не сложно, а на сервере и вовсе ничего делать не нужно. Такая универсальность - очень большой плюс.

Дедупликация - это одна из основных возможностей, ради которых устанавливают системы резервного копирования. Borg осуществляет дедупликацию на лету, никаких отложенных заданий, причем делает это быстро и эффективно. Это позволяет иметь практически неограниченную глубину резервного копирования для большинства типовых сценариев, место на диске будут занимать только изменившиеся данные.

Клиент-серверная архитектура позволяет реализовать инкрементное копирование, т.е. реально по каналам связи будут передаваться только изменения, что позволяет существенно сократить время резервного копирования и объем передаваемых данных, вторым фактором здесь выступает эффективное сжатие, начиная с версии 1.1.4 Borg поддерживает алгоритм Zstandard.

Borg Backup также быстр и при восстановлении данных, кроме того он позволяет смонтировать копию в любое место файловой системы через FUSE, что дает возможность произвести выборочное восстановление путем сравнения содержимого файлов, это может оказаться полезно, например, если вы вносили изменения в конфигурационные файлы, но забыли сделать их копии.

И последний плюс - Borg присутствует в репозиториях большинства актуальных Linux дистрибутивов.

Установка сервера Borg Backup

Мы будем выполнять установку в среде Debian / Ubuntu, если вы используете другие дистрибутивы - обратитесь к справке по своему пакетному менеджеру. Все указанные ниже команды, если не оговорено отдельно следует выполнять с правами суперпользователя.

Прежде всего обновим список пакетов и выполним установку:

apt update
apt install borgbackup

Следующим шагом нам потребуется создать пользователя borg от имени которого будет работать сервер, еще одной особенностью Borg Backup является то, что он создает репозитории для хранения резервных копий в собственной домашней директории, поэтому позаботьтесь чтобы там было достаточно место или перенесите ее на отдельный накопитель.

Самый простой способ создать пользователя со стандартным размещением домашнего каталога в /home выполните:

useradd -m borg

Если вы хотите создать домашний каталог в другом расположении, скажем на дополнительном массиве, который смонтирован в /storage1, то команда должна выглядеть так:

useradd -m -b /storage1 borg

В этом случае будет создана домашняя директория /storage1/borg.

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

usermod -dm /storage2/borg borg

В нашем примере новой домашней директорией станет /storage2/borg, куда будет скопировано все ее содержимое, обратите внимание, что на момент выполнения команды директория уже должна существовать.

Для аутентификации удаленных клиентов мы будем использовать SSH-ключи, поэтому сразу создадим нужную структуру папок и файлов и назначим им владельца:

mkdir ~borg/.ssh
touch ~borg/.ssh/authorized_keys
chown -R borg:borg ~borg/.ssh

На этом настройка сервера закончена, он готов к работе.

Установка и использование клиента Borg Backup

Установка клиента ничем не отличается от сервера, и одна и та же инсталляция может быть и сервером, и клиентом одновременно:

apt update
apt install borgbackup

Для доступа к серверу необходимо сгенерировать SSH-ключ, так как регламентные задания выполняются от имени суперпользователя, то ключи должны быть созданы именно для него. Поэтому повысим себе права до root, в Debain, если вы не включали sudo, выполните:

su -

В Ubuntu:

sudo -s

В первом случае вам потребуется ввести пароль суперпользователя, во втором - текущего пользователя.

Теперь создадим SSH-ключ, от установки парольной фразы для закрытого ключа следует отказаться:

ssh-keygen

После чего у вас в директории /root/.ssh появятся файлы открытого и закрытого ключей: id_rsa.pub и id_rsa. Файл закрытого ключа id_rsa является секретным и в случае его компрометации или утери ключевую пару потребуется незамедлительно пересоздать.

Внимание! Перед выполнением этой команды убедитесь, что ключевая пара не была создана ранее! Если в директории /root/.ssh уже присутствуют файлы id_rsa и id_rsa.pub, то следует использовать их и новую ключевую пару создавать не нужно!

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

borg-backup-installation-and-usage-001.pngТеперь вернемся на сервер и добавим открытый ключ клиента, чтобы он мог безопасно подключаться и работать с сервером резервного копирования. Для этого выполним команду:

echo 'command="/usr/bin/borg serve" ssh-rsa public_key' >> ~borg/.ssh/authorized_keys

Где public_key - содержимое вашего открытого ключа (то, что выделено желтым на скриншоте выше). Данная запись указывает, что при логине владельца открытого ключа запускать для него серверный процесс Borg, интерактивный вход в консоль для него невозможен.

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

echo 'command="/usr/bin/borg serve --restrict-to-path ~borg/my_repo",restrict ssh-rsa public_key' >> ~borg/.ssh/authorized_keys

Обратите внимание - имя директории my_repo должно посимвольно совпадать с именем вашего планируемого репозитория, создавать заранее директорию не нужно.

Вернемся на клиент и создадим новый репозиторий, для примера в качестве публичного IP-адреса сервера резервного копирования будем использовать 203.0.113.112:

borg init -e none borg@203.0.113.112:my_repo

В данном случае мы не используем шифрование, поэтому указываем опцию -e как none. Если вы все сделали правильно, то команда выполнится без ошибок, а на сервере в домашней директории Borg будет создан каталог с именем репозитория.

Теперь попробуем выполнить резервное копирование, например, мы хотим сделать копию сайта example.com:

borg create -C zstd borg@203.0.113.112:my_repo::example-`date +%Y%m%d_%H%M%S` /var/www/example.com

Ключ указывает на используемый алгоритм сжатия, наш выбор - быстрый и эффективный Zstandard. После указания сервера через двоеточие указывается имя репозитория - my_repo, а через два двоеточия от него - имя бекапа, запомните этот синтаксис. Конструкция example-`date +%Y%m%d_%H%M%S` позволяет добавить к имени архива текущие дату-время в указанном формате. Т.е. полное имя архива будет example-20220128-171235. Если вы хотите видеть ход и результат выполнения команды - добавьте к ней ключ --list.

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

borg list borg@203.0.113.112:my_repo

borg-backup-installation-and-usage-002.pngДля получения информации о репозитории выполните:

borg info borg@203.0.113.112:my_repo

borg-backup-installation-and-usage-003.pngИнформации немного, но вполне достаточно, чтобы оценить эффективность хранения копий.

Аналогичную информацию можно получить и по отдельному архиву, например, команда:

 borg list borg@203.0.113.112:my_repo::example-20220128-171235

покажет все содержимое архива, если количество хранимых файлов велико, то сразу советуем использовать эту команду в связке с less или more.

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

 borg info borg@203.0.113.112:my_repo::example-20220128-171235

borg-backup-installation-and-usage-004.pngЗдесь цифры уже интереснее. Во-первых, обратите внимание на время работы задания. Всего за 7 с небольшим секунд Borg проанализировал почти 52 тысячи файлов, общим размеров в 1,25 ГБ, нашел 64 кБ разницы с предыдущим бекапом и отправил ее на сервер. При этом мы всегда можем получить полный бекап на эту дату, Borg достанет дедуплицированные данные, добавит измененные и выдаст нам полный набор информации. Это гораздо удобнее, чем самостоятельно восстанавливать данные из инкрементальных или дифференциальных архивов.

Borg прост, поэтому он сам не выполняет никаких действий, кроме тех, о которых его попросит пользователь. Но созданные архивы нужно время от времени проверять. Мы можем проверить как отдельный архив, так и весь репозиторий целиком:

borg check -v borg@203.0.113.112:my_repo::example-20220128-171235

или

borg check -v borg@203.0.113.112:my_repo

borg-backup-installation-and-usage-005.pngЕще одной важной задачей резервного копирования является очистка хранилища от старых копий. И хотя дедупликация позволяет нам иметь хорошую глубину резервного копирования, злоупотреблять этим тоже не стоит, да и ценность резервных копии с прошествуем времени только падает. Borg Backup позволяет гибко задавать условия очистки, например, мы можем использовать следующие ключи:

  • --keep-within INTERVAL - хранить все архивы за указанный промежуток времени, для его указания используйте "H", "d", "w", "m", "y" для указания часов, дней, недель, месяцев и лет.
  • --keep-last, --keep-secondly - хранить указанное количество последних копий.
  • --keep-minutely - количество копий в течении последнего часа.
  • -H, --keep-hourly - количество последних часовых копий.
  • -d, --keep-daily - количество последних дневных копий.
  • -w, --keep-weekly - количество последних недельных копий.
  • -m, --keep-monthly - количество последних месячных копий.
  • -y, --keep-yearly - количество последних годовых копий.

Если в указанный период присутствует несколько копий, то сохраняется только самая последняя.

Для выполнения очистки используйте следующую команду, вы также можете дополнить ее ключами --list для вывода информации на экран и --dry-run, для оценки результата без реального выполнения команды:

borg prune --list --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --dry-run borg@203.0.113.112:my_repo

Указанная команда выполнит тестирование и покажет предполагаемый результат для следующих условий: храним копии за последний 14 дней, 8 недель и 12 месяцев. При этом каждый последующий период начинает отсчитываться от последнего архива, попадающего под предыдущее условие. Т.е. 8 недель начнут отсчитываться через 14 дней, а 12 месяцев только после 8 недель. Условия применяются в том порядке, в котором они перечислены выше.

borg-backup-installation-and-usage-006.png

Готовых рекомендаций по схеме хранения мы давать не будем, все это очень индивидуально и зависит от многих факторов. В общем - исходите из собственных потребностей и доступных объемов хранилища, но не забывайте про здравый смысл. Копии многолетней давности вряд-ли пригодятся вам в каком-либо ином качестве, нежели архив, информация из которого может быть использована как срез на определенный момент времени, для оперативного восстановления она вряд-ли пригодится.

Но, будьте внимательны, Borg не анализирует архивы и если вы делаете в один репозиторий разные копии, то храниться будет только самая последняя, чтобы этого избежать используйте префикс имени архива. Допустим вы создаете архивы с именами example- и wordpress-, в этом случае для очистки от старых копий вам потребуется запускать две команды:

borg prune --prefix example --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --dry-run borg@203.0.113.112:my_repo
borg prune --prefix wordpress --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --dry-run borg@203.0.113.112:my_repo

Потому наш совет: всегда используйте сначала тестовый запуск с --dry-run, в этом случае вы сразу увидите если что пошло не так и сможете принять меры, не рискуя уже существующими архивами.

Автоматизируем создание резервных копий при помощи cron

Основные команды мы освоили, самое время автоматизировать процесс. Начнем с классики - скриптов, для этого создадим пустой файл:

touch /etc/borg-backup.sh

Откроем его и внесем следующее содержимое:

#!/bin/sh

borg create -C zstd borg@203.0.113.112:my_repo::example-`date +%Y%m%d_%H%M%S` /var/www/example.com
borg prune --keep-daily 14 --keep-weekly 8 --keep-monthly 12 borg@203.0.113.112:my_repo

Это самый простой вариант, все тоже самое, что мы делали интерактивно, в реальных сценариях скрипты могут быть сложнее. Например, создание резервной копии SQL-базы сайта:

#!/bin/sh

mysqldump --add-drop-table --allow-keywords -q -c -u mysqluser -pmysqlpassword example > /backup/example.sql

borg create -C zstd borg@203.0.113.112:my_repo::example-sql-'date +%Y%m%d_%H%M%SI example.sql
borg prune --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prefix example-sql --list borg@203.0.113.112:my_repo

rm -rf /backup/example.sql

Первой командой мы выгружаем дамп SQL-базы, для этого указываем имя базы - example, пользователя MySQL и его пароль - mysqluser и mysqlpassword, обратите внимание, что пароль пишется после ключа без пробела. После чего бекапим дамп, выполняем очистку. Последней командой удаляем созданный дамп на локальной машине.

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

chmod +x /etc/borg-backup.sh

Теперь можно проверить его работу, запустив интерактивно, если все отработало как надо - то добавим его в планировщик.

Традиционно для этого используют cron, для этого откройте файл /etc/crontab и добавьте туда запись:

45 0 * * * root /etc/borg-backup.sh

Указанная запись будет запускать наш скрипт каждый день в 00:45 от учетной записи root. Более подробно об использовании cron вы можете прочитать в нашей статье: Cron - точно по расписанию.

Автоматизируем создание резервных копий при помощи таймеров systemd

Современные системы построены с использованием systemd, который предлагает использовать вместо cron гораздо более удобный и функциональный инструмент - таймеры.

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

touch /etc/systemd/system/borg-backup.service
touch /etc/systemd/system/borg-backup.timer

Самый простой способ - использовать скрипт, созданный нами на предыдущем этапе. Для этого откроем /etc/systemd/system/borg-backup.service и внесем в него следующее содержимое:

[Unit]
Description=Automated Borg Backup
After=network.target

[Service]
Type=oneshot
ExecStart=/etc/borg-backup.sh

[Install]
WantedBy=multi-user.target

Но если ваш скрипт прост, то можно все команды перенести в юнит службы, чтобы не плодить лишние сущности:

[Unit]
Description=Automated Borg Backup
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c "borg create -C zstd borg@203.0.113.112:my_repo::example-$(date +%%Y%%m%%d_%%H%%M%%S) /var/www/example.com"
ExecStart=borg prune --keep-daily 14 --keep-weekly 8 --keep-monthly 12 borg@203.0.113.112:my_repo

[Install]
WantedBy=multi-user.target

Для служб с типом запуска oneshot мы можем указать несколько действий ExecStart и они будут исполнены последовательно. Также обратите внимание, что первое действие мы выполняем как команду bash, почему? Потому что функция date - это функция командного интерпретатора bash и в ином случае она не отработает.

В файл таймера /etc/systemd/system/borg-backup.timer добавим:

[Unit]
Description=Automated Borg Backup Timer

[Timer]
OnCalendar=*-*-* 00:35

[Install]
WantedBy=timers.target

Данный таймер настроен на срабатывание в 00:35 каждого дня, подробнее об использовании таймеров читайте в нашей статье: Настраиваем таймеры systemd вместо заданий cron.

После того, как вы внесли изменения в файлы юнитов выполните:

systemctl daemon-reload

Теперь можно попробовать запустить юнит службы:

systemctl start borg-backup

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

systemctl status borg-backup

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

systemctl start borg-backup.timer
systemctl enable borg-backup.timer

Настройка таймеров systemd может показаться несколько более сложной, но это современный метод и в современных системах следует выбирать именно его.

Warning: Attempting to access a previously unknown unencrypted repository!

Данную ошибку вы можете получить при отладке скриптов или юнитов systemd, она связана с разным контекстом выполнения команд и при ее появлении прежде всего следует проверить что вы присоединяетесь именно к тому репозиторию, который активировали с данной машины. Собственно, это даже не ошибка, а предупреждение том, что репозиторий к которому производится подключение неизвестен. Действие по умолчанию - отказ от подключения. Если все верно, и вы действительно хотите работать с данным репозиторием, то добавим в скрипт, в самое его начало следующую строку:

export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes

Для юнита службы systemd добавим в секцию [Service]:

Environment="BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes"

После чего запустим скрипт или юнит еще раз, ошибка должна уйти.

Восстановление данных при помощи Borg Backup

Конечно, хорошо, если этот пункт вам никогда не пригодится, но восстанавливать данные все такие бывает нужно. Borg Backup предлагает нам несколько вариантов восстановления. Начнем с простого. Можно просто получить содержимое копии в текущую папку, теоретически можно даже сразу извлечь данные в место назначения, но мы не советуем так делать. Лучше всего восстановить копию в отдельную директорию, а потом уже скопировать данные. Создадим новую папку в домашней директории и перейдем в нее:

mkdir ~/restore
cd ~/restore

Теперь извлечем в нее содержимое нужного архива:

borg extract borg@203.0.113.112:my_repo::example-20220128-171235

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

borg extract borg@203.0.113.112:my_repo::example-20220128-171235 var/www/example.com/upload

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

borg list borg@203.0.113.112:my_repo::example-20220128-171235

Альтернативной извлечению содержимого архива может быть его монтирование, Borg позволяет смонтировать архив в любое место файловой системы и работать с ним как с обычной папкой:

borg mount borg@203.0.113.112:my_repo::example-20220128-171235 ~/restore

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

Закончив работу не забудьте отмонтировать указанную резервную копию.

borg umount ~/restore

Как видим, Borg Backup действительно простой, но в тоже время достаточно мощный и удобный инструмент для резервного копирования, позволяющий вывести этот процесс на современный уровень и значительно повысить защищенность ваших данных.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments