Neustart sauber statt mit Stromausfall

Beim Umstellen der Anzeige habe ich die Maschine mit stop+start neu gestartet -
also mit "qm stop", einem virtuellen Stromausfall. Bei einer laufenden Maschine
mit eingehaengten Dateisystemen genau das Falsche.

Jetzt uebernimmt das Proxmox' eigener reboot-Endpunkt: er faehrt den Gast per
ACPI herunter, der haengt seine Dateisysteme selbst aus, danach geht er wieder
hoch - und dabei werden vorgemerkte Aenderungen wirksam ("Applies pending
changes"). Antwortet der Gast nicht, schlaegt es fehl statt ihm den Strom zu
ziehen; das ist die richtige Richtung.

Der naheliegende Gedanke, im Gast selbst neu zu starten, hilft hier nicht: dabei
setzt sich nur die Maschine zurueck, der QEMU-Prozess laeuft mit der alten
Grafikkarte weiter und die Aenderung bliebe vorgemerkt liegen. Steht so auch im
Warnhinweis.

Gemessen: eintragen, Neustart in 5s, danach vga=qxl und der SPICE-Kanal da.

Ausserdem reichte spice_file() das nackte "no spice port" von Proxmox durch.
Das heisst schlicht, dass die Maschine ohne qxl laeuft - steht jetzt auch so
da, mitsamt dem Weg dorthin.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-08-09 10:38:10 +02:00
co-authored by Claude Opus 5
parent 91c23ce2c0
commit 9d5bf50f99
3 changed files with 45 additions and 11 deletions
+16 -4
View File
@@ -1209,12 +1209,24 @@ def spice_file(proxmox, instance):
die virt-viewer erwartet. Sie enthaelt ein Einmal-Kennwort und laeuft nach
kurzer Zeit ab - also frisch erzeugen, wenn sie nicht mehr zieht.
"""
data = proxmox._json(["create", "/nodes/%s/%s/%d/spiceproxy"
% (instance.node, instance.type, instance.vmid)])
try:
data = proxmox._json(["create", "/nodes/%s/%s/%d/spiceproxy"
% (instance.node, instance.type, instance.vmid)])
except ProxmoxError as exc:
# "no spice port" heisst schlicht: die Maschine laeuft ohne qxl. Das
# nackt durchzureichen hilft niemandem.
if "spice" in str(exc).lower():
raise RecoveryError(
"%s laeuft ohne SPICE-Anzeige - deshalb gibt es keinen Kanal, "
"auf den sich remote-viewer verbinden koennte.\n"
"Einschalten in der Detailansicht mit p , danach neu starten "
"(die Grafikkarte laesst sich im Betrieb nicht wechseln)."
% instance.label)
raise RecoveryError("SPICE-Verbindung nicht abrufbar: %s" % exc)
if not isinstance(data, dict) or not data.get("host"):
raise RecoveryError(
"%s liefert keine SPICE-Verbindung. Laeuft die Maschine, und ist "
"die SPICE-Anzeige eingeschaltet (vga: qxl)?" % instance.label)
"%s liefert keine SPICE-Verbindung. Laeuft die Maschine ueberhaupt?"
% instance.label)
# Derselbe Grund wie beim noVNC-Verweis: der Proxy-Eintrag traegt den
# Hostnamen des Nodes, und wenn der Arbeitsplatz ihn nicht aufloest,