Aktionen

Proxmox PVE Virtual Environment QEMU Agent Freeze und Thaw Skripte bei Snapshot ausführen pre-freeze-script post-thaw-script

Aus znilwiki

Version vom 11. Mai 2025, 14:38 Uhr von BLinz (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „<u>'''Changelog:'''</u><br> * 11.05.2025 erste Version ---- ==Vorwort== Ich war auf der Suche wie man bei einem Snapshot eigene Skripte ausführen lassen kann. Unter VMware nutze ich das schon seit Jahren um ein Hot-Backup von MySQL-Datenbanken auszuführen.<br> Dabei wird unmittelbar vor einem Snapshot ein {{code|pre-freeze-script}} ausgeführt welches die Datenbank flusht und weitere Schreibzugriffe blockiert und unmittelbar danach ein {{code|post-thaw-…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Changelog:

  • 11.05.2025 erste Version

Vorwort

Ich war auf der Suche wie man bei einem Snapshot eigene Skripte ausführen lassen kann. Unter VMware nutze ich das schon seit Jahren um ein Hot-Backup von MySQL-Datenbanken auszuführen.
Dabei wird unmittelbar vor einem Snapshot ein pre-freeze-script ausgeführt welches die Datenbank flusht und weitere Schreibzugriffe blockiert und unmittelbar danach ein post-thaw-script welches den Schreibzugriff wieder freigibt. Zwischen der Ausführung der beiden Skripte liegen dabei nur wenige Sekunden.
Das Backup kann danach die vollständige VM wegsichern und es ist sichergestellt das die Datenbank im inneren Konsistent ist.

Das muss doch auch unter Proxmox PVE gehen ... jupp, es geht!<vr> Da das ganz kein Selbstläufer war - ich musste mir das wieder aus verschiedenen Webseiten und Quellen zusammensuchen.


Voraussetzungen

Damit das ganze funktioniert müssen in der VM die QEMU-Tools installiert sein.
Unter Ubuntu / Debian z.B. mit

apt install qemu-guest-agent
systemctl enable qemu-guest-agent.service
systemctl start qemu-guest-agent.service

Unter Windows muss man diese per ISO installieren:

https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers

Siehe auch: https://pve.proxmox.com/wiki/Qemu-guest-agent
Zusätzlich muss in der Option der VM der QEMU Guest Agent aktiviert sein:


Ob der Agent auch läuft und Funktioniert, kann man unter anderen in der Summary daran sehen das dort die IPs der VM zu sehen sind:




Linux

Es sollte ein Verzeichnis

/etc/qemu

geben in welchem ein Skript und ein Verzeichnis liegt:

/etc/qemu/
├── fsfreeze-hook
└── fsfreeze-hook.d

Das Skript wird bei jedem Snapshot 2x aufgerufen. Diese startet wiederum jedes Skript im Unterverzeichnis

/etc/qemu/fsfreeze-hook.d/

Dabei werden die Skripte beim ersten mal, unmittelbar vor dem Snapshot mit dem Parameter freeze aufgerufen und danach mit dem Parameter thaw.
Leider wird das Skript "ab Werk" nicht gestartet, das der QEMU Agent das beachten soll muss man diesem erst in die Konfiguration schreiben - und die gibt es nicht ...
Wir könnten das direkt in den Aufruf des Dienstes per qemu-guest-agent.service schreiben, eleganter geht es wie folgt:

qemu-ga -D > /etc/qemu/qemu-ga.conf

Schreibt die aktuell gültige Konfiguration in die Datei /etc/qemu/qemu-ga.conf, diese müssen wir danach aber unbedingt bearbeiten:

nano /etc/qemu/qemu-ga.conf

und wie folgt abändern:

[general]
daemon=false
method=virtio-serial
path=/dev/virtio-ports/org.qemu.guest_agent.0
pidfile=/var/run/qemu-ga.pid
statedir=/var/run
verbose=false
retry-path=false
# block-rpcs=
# allow-rpcs=
fsfreeze-hook=/etc/qemu/fsfreeze-hook

Die beiden gelben Zeilen müsst Ihr unbedingt auskommentieren, sonst startet der Dienst hinterher nicht mehr (es darf nur eine der beiden Zeilen zur gleichen Zeit angegeben sein),
die grüne Zeile sorgt dafür das das /etc/qemu/fsfreeze-hook in Zukunft auch aufgerufen wird.
Speichert die Datei und startet den Dienst einmal neu:

systemctl restart qemu-guest-agent.service

und prüft ob das geklappt hat - wenn in der Konfigurationsdatei etwas falsch eingetragen ist, startet dieser eben nicht:

systemctl status qemu-guest-agent.service

Beispielausgabe:

● qemu-guest-agent.service - QEMU Guest Agent
     Loaded: loaded (/usr/lib/systemd/system/qemu-guest-agent.service; static)
     Active: active (running) since Sun 2025-05-11 14:33:02 CEST; 43s ago
   Main PID: 252408 (qemu-ga)
      Tasks: 2 (limit: 4609)
     Memory: 404.0K (peak: 424.0K)
        CPU: 27ms
     CGroup: /system.slice/qemu-guest-agent.service
             └─252408 /usr/sbin/qemu-ga



Zum testen erstellen wir das folgende Skript:

nano /etc/qemu/fsfreeze-hook.d/test.sh

mit folgendem Inhalt: