Proxmox: Automatische Snapshots einrichten

Für die Bereitstellung von virtuellen Maschinen setze ich noch immer auf die von mir bevorzugte Virtualisierungslösung Proxmox VE. Während die automatische Erstellung von Backups bereits über das Web-Interface eingerichtet werden kann, ist das für Auto-Snapshots noch nicht implementiert. Ein Forenbeitrag im offiziellen Forum erweckt auch nicht den Eindruck, dass diese Funktionalität (derzeit) geplant ist.

Die Empfehlung, auch von den Proxmox Entwicklern, ist, dafür einen Cronjob einzurichten. Für die Art, wie ein Snapshot für die VMs getriggert wird, gibt es allerdings verschiedene Herangehensweisen:

  1. Nutzung eines Scripts, welches direkt „qm snapshot“ auf der Shell für jede VM aufruft, oder
  2. die Nutzung der offiziellen Proxmox API

Für die erste Variante bin ich auf das Script pve-autosnap gestoßen, auch die frühere Version von eve4pve-autosnap setzt auf diese Methode. Letzteres wird allerdings nicht mehr weiterentwickelt. Der Entwickler setzt nun auf die offizielle Proxmox API, wendet also die zweitere Variante an, und hat das Tool in cv4pve-autosnap umbenannt.

Als Grund gibt der Entwickler an:

The old bash version inside Proxmox VE is no longer supported because the Proxmox VE developers continue to change output.

 

Das macht meiner Meinung nach auch Sinn und ist die bessere Lösung, weshalb ich bei meinen Setups ebenfalls auf die zweite Variante setze und cv4pve-autosnap dafür verwende. Diese Variante ermöglicht es auch, die Snapshots auf mehreren Proxmox Knoten von extern zu triggern. Ich beziehe mich nachfolgend allerdings auf die Verwendung auf einem einzelnen Host. Für wen die „extern“-Variante interessant sein sollte, wirft am besten einmal einen Blick in die Readme-Datei des Projekts auf Github.

cv4pve-autosnap einrichten

Der Entwickler stellt die aktuellste Variante bereits für verschiedene Betriebssysteme compiliert zur Verfügung. So kann das Tool selbst auf Windows und macOS ausgeführt werden, um die Snapshots von extern zu starten. Für die Verwendung auf dem Proxmox Knoten selbst, verwende ich die Version „cv4pve-autosnap-linux-x64“. Alternativ kann das Tool natürlich auch selbst compiliert werden, der Source Code steht schließlich bereit. 😉

Zunächst wird die aktuellste Version heruntergeladen:

wget https://github.com/Corsinvest/cv4pve-autosnap/releases/latest/download/cv4pve-autosnap-linux-x64.zip

Anschließend entpackt:

unzip cv4pve-autosnap-linux-x64.zip

Das Tool ausführbar gemacht:

chmod +x cv4pve-autosnap

Danach kann das Tool noch an einen Ort eurer Wahl verschoben werden, bei mir landet händisch bereitgestelltes in /usr/local/bin/.

mv cv4pve-autosnap /usr/local/bin/

Da das Tool über die API einen Snapshot triggert, wird noch ein User benötigt, der die erforderlichen Rechte (VM.Audit + VM.Snapshot) besitzt und keine TFA-Authentifizierung aktiviert hat. Ich habe dafür einen neuen User „snapshot“ erstellt, eine Rolle angelegt und ihm die erforderlichen Rechte auf alle VMs eingeräumt.

Rolle in Proxmox anlegen

Rolle mit den erforderlichen Rechten

Berechtigung für den User erteilen und Rolle zuweisen

Für die Erstellung eines täglichen Snapshots von allen VMs unter Beibehalt der letzten sechs Snapshots, würde die Syntax so aussehen und muss natürlich noch mit den eigenen Anmeldedaten gefüttert werden.

/usr/local/bin/cv4pve-autosnap --host=127.0.0.1 --username="snapshot@pve" --password="PASSWORD" --vmid=all snap --label="daily" --keep=6

Das ganze einmal aufgerufen, sollte eine Ausgabe wie folgt ergeben:

ACTION Snap 
VMs:   all  
Label: daily 
Keep:  6 
State: False
----- VM 100 -----
Create snapshot: autodaily191104191947
----- VM 101 -----
Create snapshot: autodaily191104191948

Durch die Verwendung von verschiedenen Labels können beispielsweise auch mehrere tägliche, wöchentliche und monatliche Snapshots aufbewahrt werden:

/usr/local/bin/cv4pve-autosnap --host=127.0.0.1 --username="snapshot@pve" --password="PASSWORD" --vmid=all snap --label="daily" --keep=6
/usr/local/bin/cv4pve-autosnap --host=127.0.0.1 --username="snapshot@pve" --password="PASSWORD" --vmid=all snap --label="weekly" --keep=4
/usr/local/bin/cv4pve-autosnap --host=127.0.0.1 --username="snapshot@pve" --password="PASSWORD" --vmid=all snap --label="monthly" --keep=2

Für eine Ausführung muss das Script nur zu den gewünschten Zeiten durch einen Cronjob aufgerufen werden.

Ein beispielhafter Cron, der monatliche-, wöchentliche-, tägliche- und stündliche Snapshots vorhält, könnte so aussehen:

/etc/cron.d/snapshot
PATH=/usr/bin:/bin:/usr/local/bin/
 
SNAP_HOST="127.0.0.1"
SNAP_USER="snapshot@pve"
SNAP_PASS="FILL_IN"
 
# "all" for all VMs, exceptions with "-123" possible, or just the following VMs: "123,124"
SNAP_VMID="all"
 
SNAP_KEEP_HOURLY=2
SNAP_KEEP_DAILY=6
SNAP_KEEP_WEEKLY=4
SNAP_KEEP_MONTHLY=2
 
# hourly
0 1-23	*	*	*	root	cv4pve-autosnap --host="$SNAP_HOST" --username="$SNAP_USER" --password="$SNAP_PASS" --vmid="$SNAP_VMID" snap --label="hourly" --keep="$SNAP_KEEP_HOURLY" > /dev/null
 
# weekly -> So; daily -> Mo-Sa
0 0	2-31	*	*	root	[ "$(date +\%u)" = "7" ] && cv4pve-autosnap --host="$SNAP_HOST" --username="$SNAP_USER" --password="$SNAP_PASS" --vmid="$SNAP_VMID" snap --label="weekly" --keep="$SNAP_KEEP_WEEKLY" > /dev/null || cv4pve-autosnap --host="$SNAP_HOST" --username="$SNAP_USER" --password="$SNAP_PASS" --vmid="$SNAP_VMID" snap --label="daily" --keep="$SNAP_KEEP_DAILY" > /dev/null
 
# monthly
0 0	1	*	*	root	cv4pve-autosnap --host="$SNAP_HOST" --username="$SNAP_USER" --password="$SNAP_PASS" --vmid="$SNAP_VMID" snap --label="monthly" --keep="$SNAP_KEEP_MONTHLY" > /dev/null

Das Tool läuft übrigens auch wunderbar als normaler User und bedarf nicht unbedingt der Ausführung als Root-Benutzer. 😉

5 Kommentare Schreibe einen Kommentar

  1. Hallo,
    stimmt denn das User-Script?
    Es soll ja stündlich, täglich. wöchentlich und monatlich Snapshots erstellen.
    Es sind aber nur 3 Zeilen – und in der 2.Zeile steht hinten etwas von „daily“?

    Sollten es dann nicht 4 Einträge / 4 Zeilen sein?

    VG Hardy

    • Im zweiten Cron ist weekly und daily zusammengefasst: Wenn Wochentag=7/So -> weekly, ansonsten wird ein daily erzeugt.

  2. …mit dem Script kommt bei mir folgende Fehlermeldung:

    crontab: installing new crontab
    „/tmp/crontab.va0dhh/crontab“:23: bad minute
    errors in crontab file, can’t install.
    Do you want to retry the same edit? (y/n) y

    • Eventuell unvollständig kopiert oder ein Fehler beim Anpassen erfolgt? Am besten noch einmal gegenprüfen, das Cron-Setup ist bei mir mehrfach so im Einsatz.

  3. Hallo,

    Danke für den Artikel, das Tool läuft wirklich super!
    Ich habe nur eine Frage dazu, ich nutze einen LXC Container mit Samba und einem Mountpoint.
    So habe ich eine schlanke performante Windows Freigabe.
    Genutzt habe ich das Script vom Bashclub:
    https://github.com/bashclub/zamba-lxc-toolbox

    Ich würde aber gerne die Snapshots unter Windows sehen, damit diese bei den Vorgängerversionen zu sehen und durchsuchbar sind.

    Hierfür hat man mit zfs-auto-snapshot folgende Einstellungen in die SMB.conf eingetragen:
    allow trusted domains = No
    dns proxy = No
    shadow: snapdir = .zfs/snapshot
    shadow: sort = desc
    shadow: format = -%Y-%m-%d-%H%M
    shadow: snapprefix = ^zfs-auto-snap_\(frequent\)\{0,1\}\(hourly\)\{0,1\}\(daily\)\{0,1\}\(monthly\)\{0,1\}
    shadow: delimiter = -20

    Das funktioniert aber leider nicht mehr und es werden die Snapshots nicht mehr angezeigt.

    Weißt du zufällig, wie man das anpassen muss?

    Vielen Dank

    Gruß Bernd

Schreibe einen Kommentar zu Timo Antworten abbrechen

Pflichtfelder sind mit * markiert.