Release 2.0.0b15, beta quality, for testing only
Release 1.4.1
Release 2.0.0b14 — beta quality, for testing only
Release 2.0.0b13 — beta quality, for testing only.
Release 2.0.0b12 — beta quality, for testing only.
Release 2.0.0b11 — beta quality, for testing only
Release 2.0.0b10 — very beta, for testing only
Release 2.0.0b9 — beta quality, for testing only
Release 1.4.0
borgbackup 1.4.0
First release for the new 1.4-maint branch.
borg 1.4 is kind of a refreshed 1.2 with mostly the same features and behavior, but a few bigger changes that could introduce issues and thus were not suitable for just releasing them as 1.2.x, but rather needed some testing first.
Long changelog:
https://borgbackup.readthedocs.io/en/1.4.0/changes.html#version-1-4-0-2024-07-03
Short borg 1.4 overview (from a borg 1.2 perspective):
https://www.borgbackup.org/releases/borg-1.4.html
Installation
If you use pip to install this, use: pip install «borgbackup==1.4.0»
For other installation methods and more details, please see: https://borgbackup.org/
See also the 00_README.txt file in the assets list below for a description of the available «fat binary» downloads.
Release 1.4.0rc1 — test it now please!
borgbackup 1.4.0rc1
First release candidate for the new 1.4-maint branch and potentially last chance for pre-release testing (you can help testing by using this additionally to your production backups).
borg 1.4 is kind of a refreshed 1.2 with mostly the same features and behavior, but a few bigger changes that could introduce issues and thus were not suitable for just releasing them as 1.2.x, but rather need some testing first.
Especially authors of scripts, wrappers, automations and GUI frontends may want to look at BORG_EXIT_CODES.
Also, users of filesystem ACLs on Linux, FreeBSD and macOS should thoroughly test this, there were major changes in the ACL code.
All stuff listed in the changelog should get practically tested, especially correct behavior with BORG_EXIT_CODES=modern set and in error/warning conditions and backup / restore of ACLs.
Long changelog:
https://borgbackup.readthedocs.io/en/1.4.0rc1/changes.html#version-1-4-0rc1-2024-05-26
Short borg 1.4 overview (from a borg 1.2 perspective):
https://www.borgbackup.org/releases/borg-1.4.html
Installation
If you use pip to install this, use: pip install «borgbackup==1.4.0rc1»
For other installation methods and more details, please see: https://borgbackup.org/
See also the 00_README.txt file in the assets list below for a description of the available «fat binary» downloads.
How to Install BorgBackup on Windows 11
BorgBackup is an open-source backup software that provides deduplication and compression capabilities to create efficient backups. In this tutorial, we will guide you on how to install BorgBackup on Windows 11 operating system.
Prerequisites
Before proceeding with the installation, you need to ensure that your system meets the following prerequisites:
- Windows 11 operating system
- Python 3.x or higher
- pip package installer
- Git
Step 1: Install Python
If you don’t have Python installed on your system, you can download it from the official website. Choose the latest version of Python 3.x and download the installer.
Once the download is complete, run the installer and follow the instructions to install Python on your system.
Step 2: Install pip
Pip is a package installer for Python that allows you to easily install and manage Python packages on your system. To install pip, follow the below steps:
-
Open the command prompt by pressing «Windows + R» keys and then typing «cmd» in the Run dialog box.
-
Type the following command in the command prompt to download the pip installer script:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
-
Once the download is complete, run the following command to install pip:
python get-pip.py
-
After pip is installed, you can verify the installation by running the following command:
pip --version
Step 3: Install Git
Git is a version control system that is used to manage and control software development projects. To install Git, follow the below steps:
-
Download Git for Windows from the official website.
-
Run the installer and follow the instructions to install Git on your system.
Step 4: Clone BorgBackup Repository
To install BorgBackup on your system, you need to clone the BorgBackup repository from GitHub. Follow the below steps to clone the repository:
-
Open the command prompt.
-
Navigate to the directory where you want to clone the repository.
-
Type the following command to clone the repository:
git clone https://github.com/borgbackup/borg.git
-
Once the repository is cloned, navigate to the «borg» directory by typing the following command:
cd borg
Step 5: Install BorgBackup
To install BorgBackup, follow the below steps:
-
Run the following command to install the BorgBackup package:
pip install .
-
Once the installation is complete, you can verify the installation by running the following command:
borg --version
Conclusion
In this tutorial, we have shown you how to install BorgBackup on Windows 11 operating system. Now, you can use BorgBackup to create efficient backups of your data.
If you want to self-host in an easy, hands free way, need an external IP address, or simply want your data in your own hands, give IPv6.rs a try!
Alternatively, for the best virtual desktop, try Shells!
К нашему огромному удивлению на хабре не оказалось ни одного материала про замечательный Open Source-инструмент для резервного копирования данных — Borg (не путать с одноимённым прародителем Kubernetes!). Поскольку уже более года мы с удовольствием используем его в production, в этой статье я поделюсь накопленными у нас «впечатлениями» о Borg.
Предыстория: опыт с Bacula и Bareos
В 2017 году мы устали от Bacula и Bareos, которые использовали с самого начала своей деятельности (т.е. около 9 лет в production на тот момент). Почему? За время эксплуатации у нас накопилось немало недовольства:
- Зависает SD (Storage Daemon). Если у вас настроена параллельность, то обслуживание SD усложняется, а его зависание блокирует дальнейшие бэкапы по расписанию и возможность восстановления.
- Нужно генерировать конфиги и клиенту, и директору. Даже если автоматизировать это (в нашем случае в разное время применялись и Chef, и Ansible, и своя разработка), нужно мониторить, что директор после своего reload’а на самом деле подхватил конфиг. Это отслеживается только в выводе команды reload и вызове messages после (чтобы получить сам текст ошибки).
- Расписание бэкапов. Разработчики Bacula решили пойти собственным путём и написали свой формат расписаний, который не получится просто распарсить или конвертировать в другой. Вот примеры стандартных расписаний бэкапов в наших старых инсталяциях:
- Ежедневный полный бэкап по средам и инкрементальные в остальные дни:
Run = Level=Full Pool="Foobar-low7" wed at 18:00
Run = Level=Incremental Pool="Foobar-low7" at 18:00 - Полный бэкап wal-файлов 2 раза в месяц и инкремент каждый час:
Run = Level=Full FullPool=CustomerWALPool 1st fri at 01:45
Run = Level=Full FullPool=CustomerWALPool 3rd fri at 01:45
Run = Level=Incremental FullPool=CustomerWALPool IncrementalPool=CustomerWALPool on hourly - Сгенерированных
schedule
на все случаи жизни (в разные дни недели каждые 2 часа) у нас получилось примерно 1665… из-за чего Bacula/Bareos периодически сходили с ума.
- Ежедневный полный бэкап по средам и инкрементальные в остальные дни:
- У bacula-fd (и bareos-fd) на каталогах с большим количеством данных (скажем, 40 ТБ, из которых на 35 ТБ приходятся крупные файлы [100+ Мб], а на оставшиеся 5 Тб — мелкие [от 1 Кб до 100 Мб]) начинается медленная утечка памяти, что на production ну совсем неприятная ситуация.
- На бэкапах с большим количеством файлов Bacula и Bareos очень сильно зависят от производительности используемой СУБД. На каких она дисках? Насколько мастерски вы умеете её тюнить под эти специфичные нужды? А в базе, между прочим, создаётся одна(!) непартицируемая таблица со списком всех файлов во всех бэкапах и вторая — со списком всех путей во всех бэкапах. Если вы не готовы выделить хотя бы 8 Гб RAM под базу + 40 Гб SSD для вашего бэкап-сервера — сразу готовьтесь к тормозам.
- Зависимость от БД достойна ещё одного пункта. Bacula/Bareos на каждый файл спрашивают директора, был ли уже такой файл. Директор, конечно, лезет в БД, в те самые огромные таблицы… Получается, что резервное копирование можно заблокировать просто тем фактом, что одновременно запустились несколько тяжёлых бэкапов — даже если diff’а там на несколько мегабайт.
Несправедливо будет сказать, что никакие проблемы не решались совсем, но мы дошли до того состояния, когда действительно устали от различных workaround’ов, и хотели надёжного решения «здесь и сейчас».
Bacula/Bareos прекрасно работают с небольшим количеством (10-30) однородных job’ов. Сломалось какая-то мелочь раз в неделю? Ничего страшного: отдали задачу дежурному (или другому инженеру) — починили. Однако у нас есть проекты, где количество job’ов исчисляется сотнями, а количество файлов в них — сотнями тысяч. В итоге, 5 минут в неделю на починку бэкапа (не считая нескольких часов настройки до этого) начали приумножаться. Всё это привело к тому, что 2 часа в день нужно было заниматься починкой бэкапов во всех проектах, потому что буквально везде что-то по мелочи или серьёзно ломалось.
Тут кто-то может подумать, что бэкапами должен заниматься выделенный для этого специальный инженер. Непременно, он будет максимально бородат и суров, а от его взгляда бэкапы чинятся моментально, пока он спокойно попивает кофе. И эта мысль в чем-то может быть верна… Но всегда есть но. Не все могут позволить себе круглосуточно чинить и следить за бэкапами, а уж тем более — выделенного под эти цели инженера. Мы же просто уверены, что эти 2 часа в день лучше тратить на что-то более продуктивное и полезное. Поэтому перешли к поискам альтернативных решений, которые «просто работают».
Borg как новый путь
Поиски других Open Source-вариантов были размазаны во времени, поэтому сложно оценить общие затраты, но в один прекрасный момент (в прошлом году) наше внимание устремилось к «виновнику торжества» — BorgBackup (или просто Borg). Отчасти тому способствовал реальный опыт его использования одним из наших инженеров (на предыдущем месте работы).
Borg написан на Python (необходима версия >= 3.4.0), а требовательный к производительности код (сжатие, шифрование и т.п.) реализован на C/Cython. Распространяется на условиях свободной лицензии BSD (3-clause). Поддерживает множество платформ включая Linux, *BSD, macOS, а также на экспериментальном уровне Cygwin и Linux Subsystem of Windows 10. Для инсталляции BorgBackup доступны пакеты для популярных Linux-дистрибутивов и других ОС, а также исходники, устанавливаемые в том числе и через pip, — более подробную информацию об этом можно найти в документации проекта.
Чем же Borg нас так сильно подкупил? Вот его основные достоинства:
- Дедупликация: настоящая и очень эффективная (примеры будут ниже). Файлы в рамках одного Borg repository (т.е. специальном каталоге в специфичном для Borg формате) делятся на блоки по n мегабайт, а повторяющиеся блоки Borg дедуплицирует. Дедупликация происходит именно до сжатия.
- Сжатие: после дедупликации данные ещё и сжимаются. Доступны разные алгоритмы сжатия: lz4, lzma, zlib, zstd. Стандартная фича любого бэкапа, но от этого не менее полезная.
- Работа по SSH: Borg бэкапит на удалённый сервер по SSH. На стороне сервера нужен просто установленный Borg и всё! Отсюда сразу вытекают такие плюсы, как безопасность и шифрование. Вы можете настроить доступ только по ключам и, более того, выполнение Borg’ом только одной своей команды при заходе на сервер. Например, так:
$ cat .ssh/authorized_keys command="/usr/bin/borg serve" ssh-rsa AAAAB3NzaC1yc…
- Поставляется как в PPA (мы преимущественно используем Ubuntu), так и статичным бинарником. Borg в виде статичного бинарника даёт возможность запускать его практически везде, где есть хоть минимально современный glibc. (Но не везде — например, не удалось запустить на CentOS 5.)
- Гибкая очистка от старых бэкапов. Можно задать как хранение n последних бэкапов, так и 2 бэкапа в час/день/неделю. В последнем случае будет оставлен последний на конец недели бэкап. Условия можно комбинировать, сделав хранение 7 ежедневных бэкапов за последние 7 дней и 4 недельных.
Переход на Borg начал осуществляться медленно, на небольших проектах. По началу это были простые скрипты в cron, которые каждый день делали своё дело. Всё так продолжалось около полугода. За это время нам приходилось много раз доставать бэкапы… и оказалось, что Borg не пришлось чинить буквально совсем! Почему? Потому что тут работает простой принцип: «Чем проще механизм, тем меньше мест, где он сломается».
Практика: как сделать бэкап с Borg?
Рассмотрим простой пример создания бэкапа:
- Скачиваем последний релизный бинарник на сервер бэкапа и машину, которую будем бэкапить, с официального репозитория:
sudo wget https://github.com/borgbackup/borg/releases/download/1.1.6/borg-linux64 -O /usr/local/bin/borg sudo chmod +x /usr/local/bin/borg
Примечание: Если для теста вы используете локальную машину и как источник и как приёмник, то вся разница будет только в URI, который мы передадим, но мы же помним, что бэкап нужно хранить отдельно, а не на той же машине.
- На сервере бэкапов создаём пользователя
borg
:sudo useradd -m borg
Просто: без групп и со стандартным shell’ом, но обязательно с домашним каталогом.
- На клиенте генерируется SSH-ключ:
ssh-keygen
- На сервере пользователю
borg
добавляем сгенерированный ключ:mkdir ~borg/.ssh echo 'command="/usr/local/bin/borg serve" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNdaDfqUUf/XmSVWfF7PfjGlbKW00MJ63zal/E/mxm+vJIJRBw7GZofe1PeTpKcEUTiBBEsW9XUmTctnWE6p21gU/JNU0jITLx+vg4IlVP62cac71tkx1VJFMYQN6EulT0alYxagNwEs7s5cBlykeKk/QmteOOclzx684t9d6BhMvFE9w9r+c76aVBIdbEyrkloiYd+vzt79nRkFE4CoxkpvptMgrAgbx563fRmNSPH8H5dEad44/Xb5uARiYhdlIl45QuNSpAdcOadp46ftDeQCGLc4CgjMxessam+9ujYcUCjhFDNOoEa4YxVhXF9Tcv8Ttxolece6y+IQM7fbDR' > ~borg/.ssh/authorized_keys chown -R borg:borg ~borg/.ssh
- Инициализируем borg repo на сервере с клиента:
ssh borg@172.17.0.3 hostname # просто для проверки соединения borg init -e none borg@172.17.0.3:MyBorgRepo
Ключ
-e
служит для выбора метода шифрования репозитория (да, вы можете дополнительно зашифровать каждый репозиторий своим паролем!). В данном случае, т.к. это пример, шифрованием мы не пользуемся.MyBorgRepo
— это имя каталога, в котором будет borg repo (создавать его заранее не нужно — Borg всё сделает сам). - Запускаем первый бэкап с помощью Borg:
borg create --stats --list borg@172.17.0.3:MyBorgRepo::"MyFirstBackup-{now:%Y-%m-%d_%H:%M:%S}" /etc /root
Про ключи:
-
--stats
и--list
дают нам статистику по бэкапу и попавшим в него файлам; -
borg@172.17.0.3:MyBorgRepo
— тут всё понятно, это наш сервер и каталог. А что дальше за магия?.. -
::"MyFirstBackup-{now:%Y-%m-%d_%H:%M:%S}"
— это имя архива внутри репозитория. Оно произвольно, но мы придерживаемся форматаИмя_бэкапа-timestamp
(timestamp в формате Python).
-
Что дальше? Конечно, посмотреть, что же попало в наш бэкап! Список архивов внутри репозитория:
borg@b3e51b9ed2c2:~$ borg list MyBorgRepo/
Warning: Attempting to access a previously unknown unencrypted repository!
Do you want to continue? [yN] y
MyFirstBackup-2018-08-04_16:55:53 Sat, 2018-08-04 16:55:54 [89f7b5bccfb1ed2d72c8b84b1baf477a8220955c72e7fcf0ecc6cd5a9943d78d]
Видим бэкап с timestamp’ом и как Borg спрашивает нас, действительно ли мы хотим обратиться к нешифрованному репозиторию, в котором ещё ни разу не были.
Смотрим список файлов:
borg list MyBorgRepo::MyFirstBackup-2018-08-04_16:55:53
Достаём файл из бэкапа (можно и весь каталог):
borg@b3e51b9ed2c2:~$ borg extract MyBorgRepo::MyFirstBackup-2018-08-04_16:55:53 etc/hostname
borg@b3e51b9ed2c2:~$ ll etc/hostname
-rw-r--r-- 1 borg borg 13 Aug 4 16:27 etc/hostname
Поздравляю, ваш первый бэкап с Borg готов!
Практика: автоматизируй это [с GitLab]!
Завернув всё это в скрипты, мы настроили бэкапы вручную подобным образом примерно на 40 хостах. Поняв, что Borg действительно работает, начали переводить на него больше и более крупные проекты…
И тут мы столкнулись с тем, что есть в Bareos, но нет у Borg! А именно: WebUI или какого-то централизованного места для настройки бэкапов. И мы очень надеемся, что это временное явление, но пока нам надо было что-то решить. Погуглив готовые инструменты и собравшись в видеоконференции, мы взялись за дело. Была замечательная идея интеграции Borg с нашими внутренними сервисами, как мы делали раньше с Bacula (сама Bacula забирала список job’ов из нашего централизованного API, к которому мы имели свой интерфейс, интегрированный с другими настройками проектов). Подумали, как можно сделать, обрисовали план, как и куда это можно встроить, но… Нормальные бэкапы нужны сейчас, а на грандиозные планы времени взять неоткуда. Что делать?
Вопросы и требования стояли примерно следующим образом:
- Что использовать как централизованное управление бэкапами?
- Что умеет любой Linux-администратор?
- Что сможет понять и настроить даже менеджер, показывающий график бэкапов клиентам?
- Что каждый день выполняет по расписанию задания на вашей системе?
- Что не будет трудным в настройке и не будет ломаться?..
Ответ был очевиден: это старый добрый crond, который героически выполняет свой долг каждый день. Простой. Не зависает. Сможет поправить даже менеджер, который с Unix на «вы».
Итак, crontab, но где же всё это держать? Неужели каждый раз ходить на машину проекта и править файл руками? Конечно, нет. Мы можем положить наше расписание в Git-репозиторий и настроить GitLab Runner, который по коммиту будет обновлять его на хосте.
Примечание: Именно GitLab был выбран в качестве средства автоматизации, потому что он удобен для поставленной задачи и в нашем случае есть практически везде. Но должен заметить, что он ни в коем случае не является необходимостью.
Раскладывать crontab для бэкапов вы можете привычным для себя средством автоматизации или вообще вручную (на маленьких проектах или домашних инсталляциях).
Итак, вот что понадобится для простой автоматизации:
1. GitLab и репозиторий, в котором для начала будет два файла:
-
schedule
— расписание бэкапов, -
borg_backup_files.sh
— простой скрипт бэкапа файлов (как в примере выше).
Пример schedule
:
# WARNING! CRONTAB MANAGED FROM GITLAB CI RUNNER IN ${CI_PROJECT_URL}
# CI_COMMIT_SHA: ${CI_COMMIT_SHA}
# Branch/tag: ${CI_COMMIT_REF_NAME}
# Timestamp: ${TIMESTAMP}
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# MyRemoteHost
0 0 * * * ${CI_PROJECT_DIR}/borg_backup_files.sh 'SYSTEM /etc,/opt'
Переменные CI используются для того, чтобы проверить успешность обновления crontab’а, а CI_PROJECT_DIR
— каталог, в котором окажется репозиторий после клонирования runner’ом. Последняя строка указывает на то, что бэкап выполняется каждый день в полночь.
Пример borg_backup_files.sh
:
#!/bin/bash
BORG_SERVER="borg@10.100.1.1"
NAMEOFBACKUP=${1}
DIRS=${2}
REPOSITORY="${BORG_SERVER}:$(hostname)-${NAMEOFBACKUP}"
borg create --list -v --stats \
$REPOSITORY::"files-{now:%Y-%m-%d_%H:%M:%S}" \
$(echo $DIRS | tr ',' ' ') || \
echo "borg create failed"
Первым аргументом здесь передаётся имя бэкапа, а вторым — список директорий для бэкапа, через запятую. Строго говоря, списком может являться и набор отдельных файлов.
2. GitLab Runner, запущенный на машине, которую необходимо бэкапить, и заблокированный только на выполнение job’ов этого репозитория.
3. Сам CI-сценарий, реализуемый файлом .gitlab-ci.yml
:
stages:
- deploy
Deploy:
stage: deploy
script:
- export TIMESTAMP=$(date '+%Y.%m.%d %H:%M:%S')
- cat schedule | envsubst | crontab -
tags:
- borg-backup
4. SSH-ключ у пользователя gitlab-runner
c доступом к серверу бэкапов (в примере это 10.100.1.1). По умолчанию он должен лежать в .ssh/id_rsa
домашнего каталога пользователя (gitlab-runner
).
5. Пользователь borg
на том же 10.100.1.1 с доступом только к команде borg serve
:
$ cat .ssh/authorized_keys
command="/usr/bin/borg serve" ssh-rsa AAAAB3NzaC1yc2EAA...
Теперь при коммите в репозиторий Runner заполнит содержимое crontab’а. А при наступлении времени срабатывания cron’а выполнится бэкап каталогов /etc
и /opt
, который окажется на сервере бэкапов в каталоге MyHostname-SYSTEM
сервера 10.100.1.1.
Вместо заключения: что можно ещё?
Применение Borg на этом, конечно, не заканчивается. Вот несколько идей для дальнейшей реализации, часть которых мы у себя уже реализовали:
- Добавить универсальные скрипты для разных бэкапов, которые по окончанию выполнения запускают
borg_backup_files.sh
, направленный на каталог с результатом своей работы. Например, так можно бэкапить PostgreSQL (pg_basebackup), MySQL (innobackupex), GitLab (встроенный rake job, создающий архив). - Центральный хост со schedule для бэкапа. Не настраивать же на каждом хосте GitLab Runner? Пусть он будет один на сервере бэкапов, а crontab при запуске передаёт скрипт бэкапа на машину и запускает его там. Для этого, конечно, понадобится пользователь
borg
на машине клиенте иssh-agent
, чтобы не раскладывать ключ к серверу бэкапов на каждой машине. - Мониторинг. Куда же без него! Алерты о некорректно завершённом бэкапе обязательно должны быть.
- Очистка borg repository от старых архивов. Несмотря на хорошую дедупликацию, старые бэкапы всё равно приходится чистить. Для этого можно сделать вызов
borg prune
по окончанию работы скрипта бэкапа. - Веб-интерфейс к расписанию. Пригодится, если правка crontab руками или в web-интерфейсе для вас выглядит не солидно/неудобно.
- Pie charts. Немного графиков для наглядного представления процента успешно выполненных бэкапов, времени их выполнения, ширины «съеденного» канала. Не зря я уже писал, что не хватает WebUI, как в Bareos…
- Простые действия, которые хотелось бы получать по кнопке: запуск бэкапа по требованию, восстановление на машину и т.п.
И в самом конце хотелось бы добавить пример эффективности дедупликации на реальном рабочем бэкапе WAL-файлов PostgreSQL в production-среде:
borg@backup ~ $ borg info PROJECT-PG-WAL
Repository ID: 177eeb28056a60487bdfce96cfb33af1c186cb2a337226bc3d5380a78a6aeeb6
Location: /mnt/borg/PROJECT-PG-WAL
Encrypted: No
Cache: /mnt/borg/.cache/borg/177eeb28056a60487bdfce96cfb33af1c186cb2a337226bc3d5380a78a6aeeb6
Security dir: /mnt/borg/.config/borg/security/177eeb28056a60487bdfce96cfb33af1c186cb2a337226bc3d5380a78a6aeeb6
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
All archives: 6.68 TB 6.70 TB 19.74 GB
Unique chunks Total chunks
Chunk index: 11708 3230099
Это 65 дней бэкапа WAL-файлов, которые делались каждый час. При использовании Bacula/Bareos, т.е. без дедупликации, мы получили бы 6,7 Тб данных. Только подумайте: можем позволить себе хранить почти 7 терабайт данных, прошедших через PostgreSQL, всего в 20 Гб фактически занимаемого места.
P.S.
Читайте также в нашем блоге:
- «Теория и практика unattended upgrades в Ubuntu»;
- «Junior, который в первый день работы удалил базу данных с production»;
- «Ускоряем bootstrap больших баз данных с помощью Kubernetes».
Резервное копирование сегодня — это не просто создать архив с данными и разместить его в удаленном хранилище, современные объемы данных делают такое занятие крайне проблемным и дорогостоящим, а максимально эффективно использовать как ресурсы системы хранения, так и пропускную способность каналов передачи данных. Первая задача решается при помощи дедупликации, а разгрузить каналы связи позволяет инкрементное копирование вместе с эффективным сжатием. Всеми этими достоинствами обладает система резервного копирования 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, то увидим большой набор случайных символов — это и есть ваш открытый ключ. Открытый ключ не является секретным, и вы можете передавать его в том числе по открытым каналам связи.
Теперь вернемся на сервер и добавим открытый ключ клиента, чтобы он мог безопасно подключаться и работать с сервером резервного копирования. Для этого выполним команду:
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 info borg@203.0.113.112:my_repo
Информации немного, но вполне достаточно, чтобы оценить эффективность хранения копий.
Аналогичную информацию можно получить и по отдельному архиву, например, команда:
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
Здесь цифры уже интереснее. Во-первых, обратите внимание на время работы задания. Всего за 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 позволяет гибко задавать условия очистки, например, мы можем использовать следующие ключи:
- —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 не анализирует архивы и если вы делаете в один репозиторий разные копии, то храниться будет только самая последняя, чтобы этого избежать используйте префикс имени архива. Допустим вы создаете архивы с именами 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/shborg 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_reporm -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.
There are different ways to install Borg:
-
Distribution Package — easy and fast if a package is
available from your distribution. -
Standalone Binary — easy and fast, we provide a ready-to-use binary file
that comes bundled with all dependencies. -
From Source, either:
-
Building a binary on Windows — builds a binary file for Windows using MSYS2.
-
Using pip — installing a source package with pip needs
more installation steps and requires all dependencies with
development headers and a compiler. -
Using git — for developers and power users who want to
have the latest code or use revision control (each release is
tagged).
-
Distribution Package¶
Some distributions might offer a ready-to-use borgbackup
package which can be installed with the package manager.
Important
Those packages may not be up to date with the latest
Borg releases. Before submitting a bug
report, check the package version and compare that to
our latest release then review Important notes 2.x to see if
the bug has been fixed. Report bugs to the package
maintainer rather than directly to Borg if the
package is out of date in the distribution.
Distribution |
Source |
Command |
---|---|---|
Alpine Linux |
Alpine repository |
|
Arch Linux |
[extra] |
|
Debian |
Debian packages |
|
Gentoo |
ebuild |
|
GNU Guix |
GNU Guix |
|
Fedora/RHEL |
Fedora official repository |
|
FreeBSD |
FreeBSD ports |
|
macOS |
Homebrew |
or
|
Mageia |
cauldron |
|
NetBSD |
pkgsrc |
|
NixOS |
.nix file |
|
OpenBSD |
OpenBSD ports |
|
OpenIndiana |
OpenIndiana hipster repository |
|
openSUSE |
openSUSE official repository |
|
Raspbian |
Raspbian testing |
|
Ubuntu |
Ubuntu packages, Ubuntu PPA |
|
Please ask package maintainers to build a package or, if you can package /
submit it yourself, please help us with that! See #105 on
github to followup on packaging efforts.
Current status of package in the repositories
Standalone Binary¶
Note
Releases are signed with an OpenPGP key, see
Security for more instructions.
Borg x86/x64 amd/intel compatible binaries (generated with pyinstaller)
are available on the releases page for the following platforms:
-
Linux: glibc >= 2.28 (ok for most supported Linux releases).
Older glibc releases are untested and may not work. -
MacOS: 10.12 or newer (To avoid signing issues download the file via
command line or remove thequarantine
attribute after downloading:
$ xattr -dr com.apple.quarantine borg-macosx64.tgz
) -
FreeBSD: 12.1 (unknown whether it works for older releases)
ARM binaries are built by Johann Bauer, see: https://borg.bauerj.eu/
To install such a binary, just drop it into a directory in your PATH
,
make borg readable and executable for its users and then you can run borg
:
sudo cp borg-linux64 /usr/local/bin/borg sudo chown root:root /usr/local/bin/borg sudo chmod 755 /usr/local/bin/borg
Optionally you can create a symlink to have borgfs
available, which is an
alias for borg mount
:
ln -s /usr/local/bin/borg /usr/local/bin/borgfs
Note that the binary uses /tmp to unpack Borg with all dependencies. It will
fail if /tmp has not enough free space or is mounted with the noexec
option. You can change the temporary directory by setting the TEMP
environment variable before running Borg.
If a new version is released, you will have to download it manually and replace
the old version using the same steps as shown above.
From Source¶
Note
Some older Linux systems (like RHEL/CentOS 5) and Python interpreter binaries
compiled to be able to run on such systems (like Python installed via Anaconda)
might miss functions required by Borg.
This issue will be detected early and Borg will abort with a fatal error.
Dependencies¶
To install Borg from a source package (including pip), you have to install the
following dependencies first. For the libraries you will also need their
development header files (sometimes in a separate -dev or -devel package).
-
Python 3 >= 3.10.0
-
OpenSSL >= 1.1.1 (LibreSSL will not work)
-
libacl (which depends on libattr)
-
libxxhash >= 0.8.1
-
liblz4 >= 1.7.0 (r129)
-
libzstd >= 1.3.0
-
libffi (required for argon2-cffi-bindings)
-
pkg-config (cli tool) — Borg uses this to discover header and library
locations automatically. Alternatively, you can also point to them via some
environment variables, see setup.py. -
Some other Python dependencies, pip will automatically install them for you.
-
Optionally, if you wish to mount an archive as a FUSE filesystem, you need
a FUSE implementation for Python:-
pyfuse3 >= 3.1.1 (for fuse 3, use pip install borgbackup[pyfuse3]), or
-
llfuse >= 1.3.8 (for fuse 2, use pip install borgbackup[llfuse]).
-
Additionally, your OS will need to have FUSE support installed
(e.g. a package fuse for fuse 2 or a package fuse3 for fuse 3 support).
-
If you have troubles finding the right package names, have a look at the
distribution specific sections below or the Vagrantfile in the git repository,
which contains installation scripts for a number of operating systems.
In the following, the steps needed to install the dependencies are listed for a
selection of platforms. If your distribution is not covered by these
instructions, try to use your package manager to install the dependencies.
After you have installed the dependencies, you can proceed with steps outlined
under Using pip.
Debian / Ubuntu¶
Install the dependencies with development headers:
sudo apt-get install python3 python3-dev python3-pip python3-virtualenv \ libacl1-dev \ libssl-dev \ liblz4-dev libzstd-dev libxxhash-dev \ libffi-dev \ build-essential pkg-config sudo apt-get install libfuse-dev fuse # needed for llfuse sudo apt-get install libfuse3-dev fuse3 # needed for pyfuse3
In case you get complaints about permission denied on /etc/fuse.conf
: on
Ubuntu this means your user is not in the fuse
group. Add yourself to that
group, log out and log in again.
Fedora¶
Install the dependencies with development headers:
sudo dnf install python3 python3-devel python3-pip python3-virtualenv \ libacl-devel \ openssl-devel \ lz4-devel libzstd-devel xxhash-devel \ libffi-devel \ pkgconf sudo dnf install gcc gcc-c++ redhat-rpm-config sudo dnf install fuse-devel fuse # needed for llfuse sudo dnf install fuse3-devel fuse3 # needed for pyfuse3
openSUSE Tumbleweed / Leap¶
Install the dependencies automatically using zypper:
sudo zypper source-install --build-deps-only borgbackup
Alternatively, you can enumerate all build dependencies in the command line:
sudo zypper install python3 python3-devel \ libacl-devel openssl-devel xxhash-devel libzstd-devel liblz4-devel \ libffi-devel \ python3-Cython python3-Sphinx python3-msgpack-python python3-pkgconfig pkgconf \ python3-pytest python3-setuptools python3-setuptools_scm \ python3-sphinx_rtd_theme gcc gcc-c++ sudo zypper install python3-llfuse # llfuse
macOS¶
When installing borgbackup via Homebrew, the basic dependencies are installed automatically.
For FUSE support to mount the backup archives, you need macFUSE, which is available
via github, or Homebrew:
brew install --cask macfuse
When installing Borg via pip
, be sure to install the llfuse
extra,
since macFUSE only supports FUSE API v2. Also, since Homebrew won’t link
the installed openssl
formula, point pkg-config to the correct path:
PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig" pip install borgbackup[llfuse]
When working from a borg git repo workdir, you can install dependencies using the
Brewfile:
brew install python@3.11 # can be any supported python3 version brew bundle install # install requirements from borg repo's ./Brewfile pip3 install virtualenv
Be aware that for all recent macOS releases you must authorize full disk access.
It is no longer sufficient to run borg backups as root. If you have not yet
granted full disk access, and you run Borg backup from cron, you will see
messages such as:
/Users/you/Pictures/Photos Library.photoslibrary: scandir: [Errno 1] Operation not permitted:
To fix this problem, you should grant full disk access to cron, and to your
Terminal application. More information can be found here.
FreeBSD¶
Listed below are packages you will need to install Borg, its dependencies,
and commands to make FUSE work for using the mount command.
pkg install -y python3 pkgconf pkg install openssl pkg install liblz4 zstd xxhash pkg install fusefs-libs # needed for llfuse pkg install -y git python3 -m ensurepip # to install pip for Python3 To use the mount command: echo 'fuse_load="YES"' >> /boot/loader.conf echo 'vfs.usermount=1' >> /etc/sysctl.conf kldload fuse sysctl vfs.usermount=1
Windows¶
Note
Running under Windows is experimental.
Warning
This script needs to be run in the UCRT64 environment in MSYS2.
Install the dependencies with the provided script:
./scripts/msys2-install-deps
Windows 10’s Linux Subsystem¶
Note
Running under Windows 10’s Linux Subsystem is experimental and has not been tested much yet.
Just follow the Ubuntu Linux installation steps. You can omit the FUSE stuff, it won’t work anyway.
Cygwin¶
Note
Running under Cygwin is experimental and has not been tested much yet.
Use the Cygwin installer to install the dependencies:
python39 python39-devel python39-setuptools python39-pip python39-wheel python39-virtualenv libssl-devel libxxhash-devel liblz4-devel libzstd-devel binutils gcc-g++ git make openssh
Make sure to use a virtual environment to avoid confusions with any Python installed on Windows.
Building a binary on Windows¶
Note
This is experimental.
Warning
This needs to be run in the UCRT64 environment in MSYS2.
Ensure to install the dependencies as described within Dependencies: Windows.
# Needed for setuptools < 70.2.0 to work - https://www.msys2.org/docs/python/#known-issues # export SETUPTOOLS_USE_DISTUTILS=stdlib pip install -e . pyinstaller -y scripts/borg.exe.spec
A standalone executable will be created in dist/borg.exe
.
Using pip¶
Virtualenv can be used to build and install Borg without affecting
the system Python or requiring root access. Using a virtual environment is
optional, but recommended except for the most simple use cases.
Ensure to install the dependencies as described within From Source.
Note
If you install into a virtual environment, you need to activate it
first (source borg-env/bin/activate
), before running borg
.
Alternatively, symlink borg-env/bin/borg
into some directory that is in
your PATH
so you can run borg
.
This will use pip
to install the latest release from PyPi:
virtualenv --python=python3 borg-env source borg-env/bin/activate # might be required if your tools are outdated pip install -U pip setuptools wheel # install Borg + Python dependencies into virtualenv pip install borgbackup # or alternatively (if you want FUSE support): pip install borgbackup[llfuse] # to use llfuse pip install borgbackup[pyfuse3] # to use pyfuse3
To upgrade Borg to a new version later, run the following after
activating your virtual environment:
pip install -U borgbackup # or ... borgbackup[llfuse/pyfuse3]
When doing manual pip installation, man pages are not automatically
installed. You can run these commands to install the man pages
locally:
# get borg from github git clone https://github.com/borgbackup/borg.git borg # Install the files with proper permissions install -D -m 0644 borg/docs/man/borg*.1* $HOME/.local/share/man/man1/borg.1 # Update the man page cache mandb
Using git¶
This uses latest, unreleased development code from git.
While we try not to break master, there are no guarantees on anything.
Ensure to install the dependencies as described within From Source.
# get borg from github git clone https://github.com/borgbackup/borg.git # create a virtual environment virtualenv --python=$(which python3) borg-env source borg-env/bin/activate # always before using! # install borg + dependencies into virtualenv cd borg pip install -r requirements.d/development.txt pip install -r requirements.d/docs.txt # optional, to build the docs pip install -e . # in-place editable mode or pip install -e .[pyfuse3] # in-place editable mode, use pyfuse3 or pip install -e .[llfuse] # in-place editable mode, use llfuse # optional: run all the tests, on all installed Python versions # requires fakeroot, available through your package manager fakeroot -u tox --skip-missing-interpreters
By default the system installation of python will be used.
If you need to use a different version of Python you can install this using pyenv
:
... # create a virtual environment pyenv install 3.10.0 # minimum, preferably use something more recent! pyenv global 3.10.0 pyenv local 3.10.0 virtualenv --python=${pyenv which python} borg-env source borg-env/bin/activate # always before using! ...
Note
As a developer or power user, you should always use a virtual environment.