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. 😉

11 comments Write a comment

  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

    • @Bernd
      ich habe im o.g. Skript /etc/cron.d/snapshot die „–label“ der Intervalle modifiziert: von hourly,daily, weekly, monthly nach „_hourly_, _daily_, _weekly_, _monthly_ um die Lesbarkeit, das Skripting und die Sortierung im Windows-Previous Versions Fenster „Schöner“ und lesbarer zu haben.

      in der smb.conf geht es dann nur noch darum, dem VFS Modul „shadow“ beizubringen, wie die Snapshots heißen, und wie das Muster dieser aufgebaut ist, damit das Modul die Zeitlichen zusammenhänge passend an den Sambaserver kommunizieren kann.

      Folgendermaßen sieht es dann aus:

      shadow: snapdir = .zfs/snapshot
      shadow: localtime = no
      shadow: sort = desc
      shadow: format = ly_%y%m%d%H%M%S
      shadow: snapprefix = ^auto_\(manual\)\{0,1\}\(month\)\{0,1\}\(week\)\{0,1\}\(dai\)\{0,1\}\(hour\)\{0,1\}$
      shadow: delimiter = ly_

      dabei bekommen manuell angefertigte Snapshots bei mir das –label=“_manually_“

  4. In der aktuellen Version (1.13 vom 04. Januar 2022) werden weitere Rechte benötigt: Datastore.Audit und Pool.Allocate. Wenn man das alles in einen Eintrag verpacken will, müssen die Rechte auch direkt für ‚/‘ vergeben werden und nicht für ‚/vms‘.
    Ansonsten einer prima Anleitung, vielen Dank!

  5. Wie sieht es mit Performanceeinbußen aus?
    Ich habe schon an unterschiedlichen Stellen gelesen, dass das ein wenig davon abhängt welche Kombination aus Speicher (ceph, lvm, nfs etc) und Disk-Typ (qcow2, raw, block) man nutzt. Aber wie viel Performance das regelmäßige Snapshotten in etwa kostet im Vergleich zu einem System ohne Snapshots konnte ich noch nicht finden.

  6. 1. Tatsächlich benötigt man VM.Audit, VM.Snapshot, Datastore.Audit und Pool.Allocate.

    2. Es ist sinnvoll, den undokumentierten Parameter „–only-running“ aufzunehmen, denn VMs, die nicht laufen, verursachen auch keine Änderungen. Da die Snapshots alle in der Proxmox-GUI aufgeführt werden, ist das verwirrend / aufwendig. BTW: Bitte bei ZFS nicht mit „zfs destroy“ Snapshots löschen – dann ist der Snapshot weg, wird aber immer noch in der Proxmox-VM-Definition gezeigt und führt beim Entfernen zu Fehlern.

    3. Es gibt eine neue Möglichkeit für die Credentials, nämlich per API-Token zuzugreifen. Allerdings ist es so gut wie unmöglich, die Parameter so zu übergeben, wie man sich zunächst denkt, weil das Quoting/Escaping/Parsing nicht klappt. Es gibt jedoch die Möglichkeit, Teile der Kommandozeile in eine Datei zu legen und diese mittels @file in die Parameterleiste aufzunehmen. Man muss dem API-Token die o.a. Rechte zuweisen und die „privilege separation“ ausschalten.

    4. Man kann den Output im Fehlerfall per Mail versenden lassen (MAILTO-Parameter).

    Somit ergibt sich hier eine modifizierte crontab:

    PATH=/usr/bin:/bin:/usr/local/bin/
    MAILTO=“proxmox@test.de“

    SNAP_CREDENTIALS=/etc/cv4pve-autosnap/credentials.conf

    # „all“ for all VMs, exceptions with „-123“ possible, or just the following VMs: „123,124“
    SNAP_VMID=“all,-105″

    SNAP_KEEP_HOURLY=23
    SNAP_KEEP_DAILY=6
    SNAP_KEEP_WEEKLY=4
    SNAP_KEEP_MONTHLY=3

    # hourly
    1 1-23 * * * snapshot cv4pve-autosnap @“$SNAP_CREDENTIALS“ –vmid=“$SNAP_VMID“ snap –only-running –label=“hourly“ –keep=“$SNAP_KEEP_HOURLY“ > /dev/null

    # weekly -> So; daily -> Mo-Sa
    1 0 2-31 * * snapshot [ „$(date +\%u)“ = „7“ ] && cv4pve-autosnap @“$SNAP_CREDENTIALS“ –vmid=“$SNAP_VMID“ snap –only-running –label=“weekly“ –keep=“$SNAP_KEEP_WEEKLY“ > /dev/null || cv4pve-autosnap @“$SNAP_CREDENTIALS“ –vmid=“$SNAP_VMID“ snap –only-running –label=“daily“ –keep=“$SNAP_KEEP_DAILY“ > /dev/null

    # monthly
    1 0 1 * * snapshot cv4pve-autosnap @“$SNAP_CREDENTIALS“ –vmid=“$SNAP_VMID“ snap –only-running –label=“monthly“ –keep=“$SNAP_KEEP_MONTHLY“ > /dev/null

    In /etc/cv4pve-autosnap/credentials.conf kann man dann –host und entweder –username / –password oder –api-token unterbringen, was auch den manuellen Aufruf des Tools erleichtert.

Schreibe einen Kommentar

Required fields are marked *.