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:
co-authored by
Claude Opus 5
parent
91c23ce2c0
commit
9d5bf50f99
@@ -273,6 +273,20 @@ class Proxmox:
|
||||
return self._wait_upid(guest.node, stdout, "Aendern von %s" % guest.label,
|
||||
guest)
|
||||
|
||||
def reboot_guest(self, guest, timeout=180):
|
||||
"""Sauber neu starten: Proxmox faehrt den Gast per ACPI herunter und
|
||||
startet ihn wieder. Dabei werden vorgemerkte Aenderungen wirksam.
|
||||
|
||||
Bewusst ohne Notabschaltung: antwortet der Gast nicht, schlaegt das
|
||||
hier fehl, statt ihm den Strom zu ziehen. Ein Dateisystem, das gerade
|
||||
beschrieben wird, nimmt einen Stromausfall uebel - und genau davor
|
||||
soll das hier schuetzen.
|
||||
"""
|
||||
return self._guest_task(guest, "create", "status/reboot",
|
||||
"Neustart von %s" % guest.label,
|
||||
["--timeout", str(int(timeout))],
|
||||
timeout=timeout + 120)
|
||||
|
||||
def resume_guest(self, guest):
|
||||
return self._guest_task(guest, "create", "status/resume",
|
||||
"Fortsetzen von %s" % guest.label)
|
||||
|
||||
Reference in New Issue
Block a user