Veeam Backups unter Linux mit SystemD triggern

Veeam Backup ist meiner Meinung nach eine der besten Lösungen für Backups die man kostenlos bekommen kann. Besonders unter Linux muss man die mölgichkeit Snapshot-Backups von Ext4 Partitionen machen zu können hervorheben.

Leider hat besonders die Linux Version einen Großen nachteil gegenüber der Windows Version: das Scheduling der Backups ist extrem eingeschränkt. Man kann nur Tag und Stunde einstellen an dem das Backup stattfinden soll. Wenn zu dem Zeitpunkt der Rechner im Sleep-Modus oder gar ausgeschaltet ist, wird das Backup nicht durchgeführt und vor allem auch nicht nachgeholt.

Um das zu umgehen musste ich etwas in die Trickkiste greifen und SystemD Timer, SystemD Services und ein wenig Scrpting verbinden.

Veeam CLI

Man kann Veeam Jobs auch außerhalb der Terminal UI steuern. Dafür gibt es das veeamconfig Tool.

Beispielweise kann man mit folgendem Befehl ein Backup starten:

veeamconfig job run --name "<JOBNAME>"

Das Problem ist nur, dass dieser Befehl nicht blockierend ist, sondern direkt zurückkehrt. Um dann herauszufinden ob das Backup abgeschlossen ist und mit welchem Status, muss man den Befehl

veeamconfig job status --name "<JOBNAME>"

ausführen. Weil der Befehl auch nicht blockierend ist, ist die einzige Lösung Polling. Wir müssen immer wieder nachfragen, ob der Job noch läuft, bis er entweder abgeschlossen ist oder fehlerhaft beendet wurde.

Hier ist der wichtige Teil des Polling-Skripts, der die Job-Übernahme übernimmt:

# Session-ID aus der Job-Start-Ausgabe extrahieren
SESSION_ID=$(echo "$OUTPUT" | grep -oP 'Session ID: \[\{\K[^}]+')

# Session-Status abfragen bis zum Abschluss
while true; do
    STATUS=$(/usr/bin/veeamconfig session info --id "$SESSION_ID" | grep "State:")
    STATE=$(echo "$STATUS" | grep -oP 'State:\s+\K\w+')
    
    if [ "$STATE" = "Success" ] || [ "$STATE" = "Warning" ]; then
        echo "Job abgeschlossen mit Status: $STATE"
        exit 0
    elif [ "$STATE" = "Failed" ]; then
        echo "Job fehlgeschlagen!"
        exit 1
    fi
    
    echo "Job läuft noch... Status: $STATE"
    sleep $POLL_INTERVAL
done

Das Skript enthält auch eine Signalbehandlung zum kontrollierten Stoppen von Backups bei Bedarf.

SystemD

Die auf der SystemD Seite war es wesentlich einfacher. SystemD Timer erlauben es mir, den Computer aus dem Sleep-Mode aufzuwecken, um das Backup zu starten. Hierzu muss man lediglich in der [Timer]-Block die Option WakeSystem=true setzen.

Die Service-Unit war genauso wenig ein Problem mit dem Skript. Ich musste lediglich verhindern, dass der Computer wieder in den Schlafzustand wechseln kann solange das Backup läuft. Hierzu habe ich systemd-inhibit genutzt.

SystemD Service

Die Service-Unit führt unser Skript aus und verhindert dabei, dass das System während der Backups in den Schlafmodus wechselt:

[Unit]
Description=Veeam Backup Job %i
After=network.target

[Service]
Type=simple
ExecStart=systemd-inhibit --what "sleep:idle:shutdown" --why "Veeam Backup %i" --who "Veeam Job" --mode "block-weak" /usr/local/bin/veeam-run-polling %i
Restart=no

SystemD Timer

Dieser Timer weckt das System und führt das Backup alle zwei Tage um 10:30 Uhr aus:

[Unit]
Description=Veeam Backup Timer for Job %i

[Timer]
OnCalendar=*-*-1/2 10:30:00
Persistent=true
WakeSystem=true
DeferReactivation=true
Unit=veeam-run@%i.service

[Install]
WantedBy=timers.target

Alle Unit Files und das Skript sind auf https://git.screebo.net/cperrin/veeam-systemd-timers zu finden.