BorgBackup – Datensicherung unter Proxmox
Wer schon einmal wichtige Daten verloren hat weiß spätestens dann, wie wichtig eine Datensicherung ist. Beim Einsatz von Proxmox sind verschiedene Datenbereiche zu betrachten, die geeignet gesichert werden sollten. In diesem Artikel beschreiben wir die Datensicherung unter Proxmox mit BorgBackup.
Sicherungsbereiche unter Proxmox
Innerhalb der Virtualisierungsplattform Proxmox existieren verschiedene Bereiche, die bedarfsgerecht gesichert werden sollten. Typische Datenbereiche sind
- LXC mit ihren Daten
- Virtuelle Maschinen mit ihren Daten
- Konfigurationsdateien auf dem Promox Host
- Ausgelagerte Volumes von Docker Containern, die auf dem Proxmox Host laufen
- Daten aus einem ZFS-Storage auf dem Proxmox Host
Nachfolgend beschreibe ich meine Sicherungsmechanismen, die für mein Homelab ausreichend sind. Dabei werden der Proxmox Backup Server und Mechanismen wie ZFS Auto Snapshot bewusst außen vor gelassen, um die Sicherungen mit Bordmitteln einfach und ohne viel Vorwissen umsetzen zu können.
Sicherung von Containern und Virtuellen Maschinen unter Proxmox
Die Datensicherung unter Proxmox von Containern (LXC) und virtuellen Maschinen (VM) erfolgt mit den Backup-Mechanismen, die Proxmox von Hause aus mit sich brint. Zum Halten der Daten wurden verschiedene Sicherungsbereiche angelegt:
Hierzu wurden folgende Datenbereiche im Storagebereich im Rechenzentrum von Proxmox angelegt:
- NFS-Freigabe auf ein Verzeichnis eines Synology-NAS (/mnt/pve/HomeNAS_Backup)
- Ein Verzeichnis auf dem ZFS-Pool (/tank/backup)
Ebenfalls im Rechenzentrum wurden anschließend folgende Backup-Jobs eingerichtet:
Im ersten Job werden alle ausgewählten LXCs und VMs täglich um 03:00 Uhr vollständig in das Verzeichnis /tank/backup im ZFS-Pool auf dem Proxmox-Host gesichert. Hiervon werden 7 Versionen = Tage vorgehalten.
Im zweiten Job werden die dieselben LXCs und VMs einmal die Woche, am Sonntag um 05:00 Uhr vollständig auf dem Synology-NAS gesichert. Hiervon werden 3 Versionen = 3 Wochen vorgehalten.
Für meinen Bedarf ist damit eine ausreichende Sicherung der Container und virtuellen Maschinen unter Proxmox erfolgt.
Sicherung von Systemdateien und ausgelagerten Daten mit BorgBackup
Mit dem zuvor beschriebenen Sicherungsmechanismus sind allerdings noch keine Systemdateien und auf dem Proxmox-Host ausgelagerten Dateien, zum Beispiel aus Docker Containern persistierte Daten, gesichert. Dies erfolgt mit BorgBackup.
Installation von BorgBackup
BorgBackup kann über apt install borgbackup
installiert werden. Diese Variante ist NICHT zu empfehlen, da hiermit nur die Version 1.1 installiert wird, wir möchten aber die Version 1.2.3 installieren, da diese mehr Funktionen bietet.
Daher gehen wir auf die Release-Seite von BorgBackup und laden uns die borg-linux64 mit einem wget
in das Home-Verzeichnis auf dem Proxmox-Host herunter.
root@pve1:~# wget https://github.com/borgbackup/borg/releases/download/1.2.3/borg-linux64
--2023-03-21 20:46:16-- https://github.com/borgbackup/borg/releases/download/1.2.3/borg-linux64
Resolving github.com (github.com)... 140.82.121.4
Connecting to github.com (github.com)|140.82.121.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/35517126/e86184db-cffb-4a32-996e-db7dc446ff76?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230321%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230321T194507Z&X-Amz-Expires=300&X-Amz-Signature=25c9a6c7e0d84714b429683188f7b85b1bd75e8038ba35a4bc8c8a5f1ba43d1c&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=35517126&response-content-disposition=attachment%3B%20filename%3Dborg-linux64&response-content-type=application%2Foctet-stream [following]
--2023-03-21 20:46:16-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/35517126/e86184db-cffb-4a32-996e-db7dc446ff76?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20230321%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230321T194507Z&X-Amz-Expires=300&X-Amz-Signature=25c9a6c7e0d84714b429683188f7b85b1bd75e8038ba35a4bc8c8a5f1ba43d1c&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=35517126&response-content-disposition=attachment%3B%20filename%3Dborg-linux64&response-content-type=application%2Foctet-stream
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.111.133, 185.199.108.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 22829040 (22M) [application/octet-stream]
Saving to: ‘borg-linux64’
borg-linux64 100%[===============================================================================>] 21.77M 17.6MB/s in 1.2s
2023-03-21 20:46:17 (17.6 MB/s) - ‘borg-linux64’ saved [22829040/22829040]
Anschließend die Datei nach /usr/local/bin
kopieren, die Zugriffsrechte anpassen und ausführbar machen.
cp borg-linux64 /usr/local/bin/borg
chown root:root /usr/local/bin/borg
chmod 755 /usr/local/bin/borg
Die Versionsabfrage sollte dann wie folgt aussehen:
root@pve1:~# borg -V
borg 1.2.3
BorgBackup Repository erstellen
Der erste Schritt besteht darin, ein Repository zu erstellen, in dem unsere Backupdaten gehalten werden – es handelt sich quasi um einen Topf, in dem die Daten abgelegt werden. Grundsätzlich können beliebig viele solcher Repositories angelegt werden.
Ich habe dazu auf meinem Synology-NAS im Backup-Storage (siehe oben) ein zusätzliches Verzeichnis proxmox_docker_backup
angelegt, in dem alle persistierten Daten aus meinen Docker-Containern abgelegt werden. Siehe hierzu auch den Artikel Proxmox / Docker – persistenten Storage in Container einbinden.
Die Initialisierung des Repositories erfolgt mit:
borg init -e repokey /mnt/pve/HomeNAS_Backup/proxmox_docker_backup
Dabei wird nach einer Passphrase gefragt, die man sich gut merken bzw. in einem Passwortmanager speichern sollte.
Das Repository ist jetzt angelegt und kann Daten aufnehmen.
Erstellen eines Backups mit BorgBackup
In diesem Beispiel wird der gesamte, ausgelagerte Datenbestand aus meinen Docker-Containern gesichert. Diese liegen unter /tank/docker
.
borg create --stats --progress -C lz4 /mnt/pve/HomeNAS_Backup/proxmox_docker_backup::test /tank/docker/
Hier sind folgende Punkte wichtig:
–stats und –progress | Ausgabe von Fortschritts- und Statusinformationen zum erstellten Backup |
-C lz4 | Die verwendete Komprimierungsmethode |
/mnt/pve/HomeNAS_Backup/proxmox_docker_backup::test | Das test ist der Name des zu erstellenden Backups und folgt per :: hinter dem Namen des Repositories |
/tank/docker | Das zu sichernde Verzeichnis |
Herausragend sind bei BorgBackup die Komprimierungs- und Deduplizierungsfunktionen, wie das folgende Beispiel zeigt:
root@pve1:~# borg info /mnt/pve/HomeNAS_Backup/proxmox_docker_backup
Enter passphrase for key /mnt/pve/HomeNAS_Backup/proxmox_docker_backup:
Repository ID: 05a16c7df94cee7bf68497fbd5cbe2f681d2269b73bcfb2982dd316ac6f713c7
Location: /mnt/pve/HomeNAS_Backup/proxmox_docker_backup
Encrypted: Yes (repokey)
Cache: /root/.cache/borg/05a16c7df94cee7bf68497fbd5cbe2f681d2269b73bcfb2982dd316ac6f713c7
Security dir: /root/.config/borg/security/05a16c7df94cee7bf68497fbd5cbe2f681d2269b73bcfb2982dd316ac6f713c7
------------------------------------------------------------------------------
Original size Compressed size Deduplicated size
All archives: 4.60 GB 1.76 GB 371.27 MB
Unique chunks Total chunks
Chunk index: 7530 45281
Differenz zwischen zwei Backups anzeigen lassen
Nehmen wir an, wir haben auf die beschriebene Weise zwei Backups test und test1 erstellt, kann man sich die Differenz zwischen den beiden Backups wie folgt anzeigen lassen:
borg diff /mnt/pve/HomeNAS_Backup/proxmox_docker_backup::test test1
Löschen eines mit BorgBackup erstellten Backups
Ein erstelltes Backup wird wie folgt gelöscht:
borg delete /mnt/pve/HomeNAS_Backup/proxmox_docker_backup::test1
In diesem Fall wird das Backup mit dem Namen test1
gelöscht.
Automatische Datensicherung unter Proxmox mit BorgBackup
Selbstverständlich kann man auch verschiedene Quellen (Verzeichnisse) in ein Backup mit aufnehmen oder auch ausschließen, dazu verweise ich auf die Dokumentation von BorgBackup. Grundsätzlich ist das Ziel aber eine automatische Datensicherung unter Proxmox, diese wird mittels Cron-Job und einem Script umgesetzt.
Ich verwende dazu folgendes Backup-Script von der BorgBackup Seite, was ich für meine Bedürfnisse angepasst habe:
#!/bin/sh
# See the section "Passphrase notes" for more infos.
export BORG_PASSPHRASE='GEHEIME_PASSPHRASE'
# some helpers and error handling:
info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; }
trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM
info "Starting backup"
# Back up the most important directories into an archive named after
# the machine this script is currently running on:
borg create \
--verbose \
--filter AME \
--list \
--stats \
--show-rc \
--compression lz4 \
--exclude-caches \
--exclude '/tank/docker/data' \
\
'/mnt/pve/HomeNAS_Backup/proxmox_docker_backup::{hostname}-{now}' \
/tank/docker \
backup_exit=$?
info "Pruning repository"
# Use the `prune` subcommand to maintain 7 daily, 4 weekly and 6 monthly
# archives of THIS machine. The '{hostname}-*' globbing is very important to
# limit prune's operation to this machine's archives and not apply to
# other machines' archives also:
borg prune \
--list \
--show-rc \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
'/mnt/pve/HomeNAS_Backup/proxmox_docker_backup'
prune_exit=$?
# actually free repo disk space by compacting segments
info "Compacting repository"
borg compact
compact_exit=$?
# use highest exit code as global exit code
global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit ))
global_exit=$(( compact_exit > global_exit ? compact_exit : global_exit ))
if [ ${global_exit} -eq 0 ]; then
info "Backup, Prune, and Compact finished successfully"
elif [ ${global_exit} -eq 1 ]; then
info "Backup, Prune, and/or Compact finished with warnings"
else
info "Backup, Prune, and/or Compact finished with errors"
fi
exit ${global_exit}
Das Script habe ich nach /root/borg_backup/borg_docker_backup.sh
gespeichert und mit chmod+x
ausführbar gemacht.
Zusätzlich wurde mit crontab -e
ein Cron-Job mit folgendem Eintrag erstellt:
05 05 * * * /bin/sh /root/borg_backup/borg_docker_backup.sh > /var/log/borgbackup.log 2>&1
Jeden Tag um 05:05 wird das Script aufgerufen und die Zusammenfassung in eine Logdatei geschrieben.
Fazit
Die Datensicherung unter Proxmox mit BorgBackup ist eine schöne Lösung ohne viel SchickSchnack, die einfach sehr gut funktioniert und mit der man auch testen und rumspielen kann, ohne sich gleich das ganze System irreparabel zu beschädigen. Im Zweifel löscht man das Repository hart per Hand auf dem Zielsystem und fängt von vorne an.
An dieser Stelle kann nicht auf alle Einstellungen und Konfigurationsmöglichkeiten eingegangen werden, da diese a) sehr vielfältig sind und b) von den individuellen Erfordernissen abhängen. Ich verweise daher nochmal auf die Dokumentation von BorgBackup.
Im kommenden zweiten Teil zu BorgBackup werden wir uns mit der Wiederherstellung von Backups beschäftigen, da es auch hier verschiedene Möglichkeiten gibt, verlorene Daten wiederherzustellen.
Hallo,
interessanter Artikel.
Aber wo beschreibst Du die Sicherung der Systemdateien, falls Proxmox selbst neu aufgesetzt werden muss?
VG
Matthias
Hallo Matthias,
danke Dir, grundsätzlich kannst Du mit der beschriebenen Vorgehensweise alles sichern, was Du möchtest. Du kannst ja eine beliebige Anzahl solcher Sicherungsjobs anlegen. Ich habe mich in dem Artikel auf ausgelagerte Nutzdaten von Container konzentriert.
Viele Grüße