26 Kapitel in vier Teilen, in der Reihenfolge, in der man sie braucht:
erst sichern, dann Dateien holen, dann ganze Maschinen wiederherstellen,
dahinter der Nachschlagteil.
Gebaut wird mit MkDocs + Material. Bewusst ohne Netzabhaengigkeiten:
keine Schriften vom CDN (font: false), Volltextsuche mit deutschem
Stemming liegt neben den Seiten. Im Notfall steht vielleicht das halbe
Netz - dann nuetzt eine Doku im Internet nichts.
handbuch/bauen.sh baut handbuch/site/
handbuch/bauen.sh ansehen Vorschau auf 127.0.0.1:8000
install.sh nimmt das gebaute Handbuch mit nach
/usr/share/doc/pvesnap/handbuch/ - falls es vorliegt. Auf dem Host selbst
wird nichts gebaut, mkdocs gehoert nicht auf einen Hypervisor.
Die 28 Bildschirmfotos sind nicht abfotografiert, sondern erzeugt: Der
echte Programmcode laeuft in einem Pseudo-Terminal gegen einen erfundenen
Proxmox-Host (Attrappen fuer pvesh, perl und rbd), pyte baut den Bildschirm
nach, heraus faellt ein SVG. Damit stimmen sie garantiert mit dem Programm
ueberein, sind reproduzierbar und enthalten keine echten Daten. Die
Werkstatt dafuer liegt unter handbuch/werkstatt/ samt LIESMICH.md.
Nebenbei: die Schlussmeldung von install.sh warb noch mit --exchange,
das mit dem eingebauten Austauschlaufwerk weggefallen ist.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Der Abschnitt beschrieb noch, Proxmox fahre den Gast per ACPI herunter. Das
ist seit gestern nur noch eine von drei Moeglichkeiten - und die unzuverlaes-
sigste, weil Windows den Aus-Knopf gern ignoriert. Beschrieben ist jetzt die
Wahl samt Begruendung, mit dem Warten auf ein Herunterfahren von innen als
empfohlenem Weg.
Dazu ein eigener Abschnitt zum Herunterfahren: Taste h schaltet nicht mehr
still nach Zeitablauf hart ab, sondern laesst bei Widerstand die Wahl. Ein
stilles Abschalten waere ein Stromausfall mit Ansage.
Abgeglichen: alle zehn Unterbefehle, alle sechzehn Parameter und die Tasten
p, h, v und e stehen drin.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Beim Abgleich Code gegen README fehlten der Unterbefehl "spice", die Parameter
--spice/--usb/--iso und das ganze Thema dahinter. Jetzt drin, mit dem Grund:
eine abgeschottete Maschine erreicht keinen USB-Server im Netz, ueber SPICE
kommt das Geraet dagegen vom Rechner des Bedieners.
Dazu die beiden Fallen, beide am laufenden System gemessen: USB ohne SPICE ist
wirkungslos ("no spice port"), und SPICE vertraegt sich nicht mit geladenem
Arbeitsspeicher, solange im Original nicht schon 'vga: qxl' steht. Mit der
Empfehlung, genau das auf Produktivmaschinen einmal zu setzen.
Ausserdem nachgetragen: das nachtraegliche Umstellen mit Taste p samt sauberem
Neustart, --no-install-deps, das Verzeichnis der Transfer-Laufwerke,
tools/get-guest-tools.sh und dass der noVNC-Verweis die IP traegt.
Eine Zeile war schlicht falsch: transfer_ui.py sei "auch aus dem Explorer
erreichbar" - die Anbindung steht noch aus. Falsche Doku ist schlimmer als
keine.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Wer merkt, dass ihm ein Laufwerk fehlt, merkt es genau dort - beim Blick auf
"Transfer-Laufwerke: keine". Bisher schickte der Hinweistext ihn dafuer zwei
Ebenen zurueck in die Uebersicht. Jetzt oeffnet v die Verwaltung direkt aus
der Maske, und beim Zurueckkommen steht der Balken auf der Auswahlzeile - also
da, wo man das eben Angelegte gleich anhaken will.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Es tat dasselbe wie die Transfer-Laufwerke, nur schlechter: namenlos, nicht
vorher befuellbar, nicht wiederverwendbar, und es starb mit der Maschine. Zwei
Mechanismen fuer dieselbe Sache sind schlechter als einer.
Entfernt: --exchange, --exchange-storage, --exchange-fs, --exchange-dir, die
Unterbefehle pull und release, das Formatieren und Einhaengen auf dem Host
samt Mount-Merkliste. Was davon gebraucht wurde, steckt jetzt in transfer.py -
dort aber benannt, dauerhaft und im laufenden Betrieb wechselbar.
Aeltere Eintraege in der Merkliste stoeren nicht: ihr Austauschlaufwerk ist
ein gewoehnliches Volume der Maschine und wird beim Verwerfen ohnehin von
Proxmox mitgeloescht.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
NTFS wird nicht mehr angeboten und nirgends mehr erwaehnt - exFAT deckt den
Windows-Fall ab, ohne dass etwas nachinstalliert werden muss, das 'fuse' und
damit pve-cluster gefaehrdet. In snapfs.py bleibt ntfs stehen: dort geht es
ums Lesen von Windows-Gast-Snapshots, eine ganz andere Sache.
parted legt nur noch die Partition an, ohne Dateisystem-Hinweis. Dabei ist
aufgefallen, dass genau dieser Hinweis vorher die Typ-Kennung gesetzt hatte:
ohne ihn vergibt parted 0FC63DAF-... ("Linux filesystem"), und Windows haengt
so eine Partition nicht ein. Die Kennung wird jetzt ausdruecklich gesetzt:
parted ... mkpart primary 1MiB 100% set 1 msftdata on
-> EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 (Microsoft basic data)
Nur darauf vergibt Windows von selbst einen Laufwerksbuchstaben.
Das alte --exchange kennt jetzt ebenfalls exfat statt ntfs.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Die Abhaengigkeit vom Quell-Snapshot ist eine Ceph-Eigenheit. Bisher meldete
flatten alles andere pauschal als "kein Ceph-Datentraeger" - das klingt nach
Einschraenkung, ist bei LVM-thin aber das Gegenteil.
Nachgemessen auf local-lvm: ein Thin-Snapshot teilt sich die Bloecke im Pool
(256 MB Nutzdaten liegen dort nur einmal), ist aber trotzdem eigenstaendig -
Quell-Snapshot und Original liessen sich loeschen, waehrend der Klon existiert,
und seine Pruefsumme blieb unveraendert. Dort gibt es also weder geschuetzte
Snapshots noch etwas zu flatten.
lvmthin nicht noetig, Klon ist von sich aus unabhaengig
zfspool nicht moeglich, ginge nur ueber zfs send | zfs recv
rbd noetig fuer den Dauerbetrieb
lvm dick PVE kann dort gar keine Snapshots
Der Hinweis in der Zusammenfassung richtet sich jetzt ebenfalls nach dem
Storage-Typ, statt immer zum Flatten zu raten.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Gemessen an einem Container, der durchgehend schrieb, waehrend abgekoppelt
wurde:
64 MB vor dem Flatten geschrieben -> SHA-256 danach OK
192 MB waehrend des Flatten -> SHA-256 danach OK
12 Schreibvorgaenge im Zeitfenster 19:35:48 - 19:36:10
Flatten selbst 19:35:48 - 19:36:11
Gast durchgehend running
rbd flatten fuellt nur Bloecke auf, die der Klon nicht selbst besitzt - was
der Gast geschrieben hat, gehoert ihm und wird nicht ueberschrieben.
Dazu die Einordnung gegenueber dem Live-Restore des Proxmox Backup Servers:
dort wird im Hintergrund nachgeladen, hier nicht. Der Klon ist von Anfang an
vollstaendig und - weil Copy-on-Write nichts kopiert - unabhaengig von der
Groesse in etwa einer Sekunde fertig. Eine 2-TB-VM wird also nicht erst
stundenlang kopiert, sondern ist sofort in Betrieb.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Am ganzen Durchlauf gemessen: VM 9802 aus einem 802-Snapshot mit geladenem
Arbeitsspeicher gestartet, dann geflattet, waehrend sie lief.
32-GiB-Platte, 13 GiB kopiert, rund 70s
bei jeder Messung qmpstatus=running, QEMU-Monitor antwortete
Uhr auf der Konsole lief weiter (10:38 -> 10:39, mit Bildschirmanimation)
danach kein PARENT mehr, Quell-Snapshots entschuetzt
Kostenschaetzung sagte 14.1G vorher - kopiert wurden 13 GiB
Anders als beim Live-Restore des Proxmox Backup Servers wird nichts
nachgeladen: der Klon liegt im selben Pool und ist von Anfang an vollstaendig.
flatten loest nur die Abhaengigkeit, nicht die Verfuegbarkeit.
Nebenbei: ein Datentraeger, den es gar nicht mehr gibt - etwa der kopierte
Arbeitsspeicher, den Proxmox nach dem Fortsetzen selbst freigibt - wurde als
"war schon eigenstaendig" gemeldet. Er wird jetzt uebergangen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
flatten
Linked Clones haengen fuer immer am Quell-Snapshot: der wird unloeschbar,
und die Original-Platte muss bestehen bleiben. Fuer "mal reinschauen" egal,
fuer eine dauerhaft uebernommene Maschine nicht. `pvesnap-recovery flatten`
loest sie ueber `rbd flatten`, hebt danach den Schutz auf und meldet die
Maschine als eigenstaendig. In der Oberflaeche Taste f; die Detailansicht
zeigt an, ob eine Instanz noch verlinkt ist.
Vorher wird gemessen, wieviel kopiert werden muss - `rbd du` zeigt je
Snapshot nur den Zuwachs, kopiert wird aber der gesamte sichtbare Inhalt.
Im Test: Snapshot-Zeile 56 MiB, tatsaechlicher Bedarf ueber 8 GB.
Und es wird geprueft, ob der Platz reicht. Der Grund ist Erfahrung: laeuft
ein Ceph-Pool beim Kopieren voll, blockiert er alle Schreibvorgaenge. Dann
steht jede VM auf dem Storage - und Aufraeumen geht auch nicht mehr, weil
Loeschen ebenfalls ein Schreibvorgang ist.
cleanup
Wird eine Wiederherstellung in der Proxmox-Oberflaeche geloescht statt mit
destroy, bleiben Klon und Snapshot-Schutz liegen. `cleanup` findet das.
Als Wahrheit ueber vergebene VMIDs dienen die Konfigurationsdateien unter
/etc/pve/nodes/* - nicht /cluster/resources: dort fehlt ein Gast auf einem
abgemeldeten Node moeglicherweise, und dann wuerden wir die Platten einer
lebenden Maschine loeschen. Ohne Elternteil wird nichts angefasst, und der
Schutz faellt nur, wenn kein Klon mehr daran haengt.
Nebenbei: Abfragen antworten bei fehlender Eingabe mit "nein", statt einen
Stacktrace zu werfen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
-y soll Routinefragen sparen, nicht die eine Frage abschalten, bei der es
weh tut. Der Fall "Original laeuft und die Wiederherstellung geht mit
denselben MAC-Adressen ans Netz" ist jetzt als kritisch gefuehrt:
-y wird abgewiesen (Exit 2), Hinweis auf --force
interaktiv das Wort "ja" muss ausgeschrieben werden, "j" reicht nicht
--force laeuft durch
Oberflaeche zweite Rueckfrage, die den Grund beim Namen nennt statt
nur "Warnungen gelesen?" zu fragen
Ausserdem wird stdout vor der Fehlerausgabe geleert - sonst stand die
Begruendung beim Umleiten ueber dem, worauf sie sich bezieht.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Zwei Betriebsarten:
live abgeschottet ohne Netzwerk - zum Hineinschauen ueber die
noVNC-Konsole, Dump ziehen, Daten ueber ein Austauschlaufwerk
herausholen
recovery mit Netzwerk und gleicher Identitaet (SMBIOS-UUID, vmgenid,
MAC-Adressen, Hostname) - warnt, wenn das Original noch laeuft
Die Datentraeger werden ueber PVE::Storage::vdisk_clone geklont, also mit
derselben Funktion und Cluster-Sperre, die Proxmox selbst verwendet. Auf
Ceph/ZFS/LVM-thin ist das Copy-on-Write: 32 GiB waren im Test in 0,8s
geklont, das Original bleibt unberuehrt.
Enthaelt der Snapshot den Arbeitsspeicher, wird er mitkopiert - die Maschine
laeuft dann genau dort weiter, wo sie stand, statt zu booten. Dafuer muss die
Geraeteausstattung exakt passen:
- vmgenid und smbios1 bleiben erhalten (ohne vmgenid bricht das Laden mit
"Unknown savevm section" ab)
- runningmachine/runningcpu werden uebernommen
- die Netzwerkkarte wird abgeklemmt statt entfernt
- das Austauschlaufwerk kommt erst nach dem Fortsetzen per Hotplug dazu,
sonst bemerkt der Gast es nie (nachgewiesen ueber "info virtio-status")
Proxmox meldet einen fehlgeschlagenen RAM-Ladevorgang als TASK OK und laesst
die Maschine angehalten stehen - deshalb wird das Task-Protokoll mitgelesen,
fortgesetzt und deutlich gemeldet, wenn stattdessen kalt gebootet wurde.
Austausch mit dem Host: bei VMs eine formatierte Zusatzplatte, bei
Containern ein durchgereichtes Verzeichnis - dort passt auch ein bereits
eingehaengtes Netzlaufwerk.
Verworfen wird restlos, samt Aufheben des rbd-Snapshot-Schutzes, den das
Klonen setzt - sonst koennte die Vorhaltezeit den Snapshot nie mehr loeschen.
Angefasst wird nur, was den Tag pvesnap-recovery traegt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Der Abschnitt zur Web-Oberflaeche beschreibt jetzt beides ausfuehrlich:
die Einrichtung als Dienst ueber install.sh --with-webexplorer --port
(mit Beispielen fuer eigene Adresse und --no-start), das Nachtraegliche
Aendern ueber /etc/pvesnap/web.conf und die ueblichen systemctl-Befehle -
sowie den Start von Hand mit einer Tabelle aller Parameter und
Beispielen fuer die typischen Faelle: SSH-Tunnel, Backup-Team mit
VM.Backup statt VM.Snapshot, einzelner Dienstleister ueber --allow-user,
Zugangsschluessel statt Anmeldung, freies Verzeichnis, Aufraeumen.
Der Explorer hat ebenfalls eine Parametertabelle bekommen.
Dabei fiel auf, dass "pvesnap-web <vmid>" ohne Snapshot-Namen bisher gar
nichts bewirkte - man bekam trotzdem die vollstaendige Gastliste. Jetzt
schraenkt die Angabe die Oberflaeche wirklich auf diesen Gast ein, und
zwar auch gegen Aufrufe ueber die Adresszeile.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
install.sh --with-webexplorer --port <nummer> richtet pvesnap-web.service
ein. Fehlt der Port, bricht das Skript mit einer Erklaerung ab; --port
ohne --with-webexplorer, ein Port ausserhalb 1-65535, etwas anderes als
eine Zahl und Port 8006 (Proxmox selbst) werden ebenfalls abgefangen -
und zwar vor der root-Pruefung, damit ein Tippfehler sofort auffaellt.
--help beschreibt jetzt alle Optionen mit Beispielen.
Port, Adresse und Anmeldeart stehen in /etc/pvesnap/web.conf und lassen
sich dort aendern, ohne die Unit anzufassen.
Angemeldet wird mit den Benutzern von Proxmox VE: dieselbe Maske aus
Benutzer, Passwort und Realm-Auswahl, geprueft ueber POST /access/ticket
auf der lokalen API - also derselbe Weg wie im Proxmox-Webinterface. Alle
Realms funktionieren damit automatisch; Zwei-Faktor-Anmeldungen werden
abgewiesen statt halb durchgewinkt.
Ein gueltiges Passwort allein reicht nicht: zusaetzlich braucht der
Benutzer auf dem Gast das Recht VM.Snapshot (geprueft auf /, /vms,
/vms/<id> und dem Pool). Sonst koennte jeder Proxmox-Benutzer saemtliche
Dateien aller Gaeste lesen. In der Gastliste erscheinen nur erlaubte
Gaeste, root@pam sieht wie in Proxmox alles. Anpassbar ueber
--require-privilege und --allow-user.
Ausserdem: SIGTERM haengt einen offenen Snapshot wieder aus (ohne das
bliebe er bei "systemctl stop" eingebunden), und beim Start werden Reste
von Prozessen abgeraeumt, die es nicht mehr gibt - parallel laufende
Sitzungen bleiben dabei unangetastet.
Auf pvetest01 geprueft: Dienststart ueber systemd, Anmeldemaske mit den
Realms des Hosts, Abweisung ohne und mit falschen Zugangsdaten (401,
protokolliert mit Absender-IP), Zugriff ohne Recht (403 auf Snapshot-
Liste und Oeffnen), vollstaendiger Ablauf als Berechtigter bis zum
Datei-Download, Abmelden macht die Sitzung ungueltig, und SIGTERM
hinterlaesst weder rbd-Maps noch Mountpunkte.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Bisher endete das Programm, sobald man den Dateibrowser verliess - wollte
man einen zweiten Snapshot ansehen, musste man es neu starten und sich
wieder durch Gast und Snapshot klicken.
Jetzt gibt es drei Ebenen, aus denen q oder F10 jeweils eine zurueckfuehrt:
Gastauswahl -> Snapshot-Auswahl -> Dateibrowser
Beim Verlassen des Browsers wird der Snapshot ausgehaengt, bevor die
Snapshot-Liste wieder erscheint - dort steht dann auch, was in der
Zwischenzeit dazugekommen ist. Aus der Snapshot-Liste geht es zurueck zur
Gastauswahl, deren Inventar dabei ebenfalls neu gelesen wird.
Das rechte Fenster behaelt sein Verzeichnis ueber mehrere Snapshots
hinweg, damit man aus verschiedenen Snapshots ins selbe Ziel sammeln kann.
Auf pvetest01 gegen echte Snapshots geprueft: beim Wechsel wird der erste
Snapshot restlos abgebaut, bevor der zweite eingebunden wird (nie mehr als
eine Einbindung gleichzeitig), und der regulaere Ausstieg hinterlaesst
weder rbd-Maps noch Mountpunkte.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Snapshots anzulegen half bisher nur halb - an die Daten darin kam man nur
ueber einen Rollback. Dafuer jetzt zwei Werkzeuge auf gemeinsamer Basis.
snapfs.py bindet einen Snapshot schreibgeschuetzt ein und liefert einen
gewoehnlichen Pfad; die Oberflaechen wissen dadurch nichts ueber Storages:
rbd (Ceph) rbd map pool/image@snap, bei nicht unterstuetzten
Image-Features faellt es auf rbd-nbd zurueck
zfspool Container ueber .zfs/snapshot, VMs ueber einen Klon
lvmthin/lvm die Snapshot-LV snap_<volume>_<snapname> aktivieren
dir/nfs/cifs qemu-nbd --load-snapshot (nur qcow2)
Gemountet wird mit ro,noload bzw. ro,norecovery,nouuid - Snapshots
laufender Gaeste haben fast immer ein unsauberes Journal. Alles Angelegte
steht in /run/pvesnap/explorer.json und laesst sich nach einem Absturz mit
"--cleanup" wieder abraeumen.
pvesnap-explorer: zwei Fenster wie im Midnight Commander, links der
Snapshot, rechts der lokale Rechner. Markieren, F5, Fortschrittsbalken,
ESC bricht ab, vorhandene Dateien werden abgefragt. In den Snapshot hinein
kann nicht kopiert werden. Geraetedateien und Sockets werden
uebersprungen, symbolische Verweise bleiben Verweise.
pvesnap-web: derselbe Inhalt im Browser, auch vom anderen Rechner.
Einzelne Dateien direkt, Verzeichnisse und Mehrfachauswahl als ZIP, das im
Strom erzeugt wird - ohne Zwischendatei auf der Platte. Zugang nur mit dem
beim Start ausgegebenen Schluessel; Pfade ausserhalb des Snapshots werden
abgewiesen; es wird ausschliesslich gelesen.
Nebenbei: die curses-Bausteine sind aus tui.py nach curses_util.py
gewandert, damit Editor und Explorer sie teilen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Als Dienst schlug jeder Snapshot mit "cfs-lock 'storage-data' error: got
lock request timeout" fehl, waehrend derselbe Aufruf in der Shell
funktionierte.
Ursache war ProtectSystem=full in unserer eigenen Unit: das haengt /etc im
Namespace des Dienstes schreibgeschuetzt ein. pvesh fuehrt die Proxmox-API
im eigenen Prozess aus, der Snapshot-Task ist also ein Kindprozess von
pvesnap und erbt diese Einschraenkung. pmxcfs legt seine Sperren aber als
Verzeichnisse unter /etc/pve/priv/lock/ an - das mkdir scheitert, Proxmox
wiederholt es erfolglos und meldet am Ende einen Lock-Timeout statt eines
Rechtefehlers.
ProtectHome=yes war aus demselben Grund schaedlich: es blendet /root aus,
womit die SSH-Schluessel fuer die uebrigen Cluster-Nodes fehlen.
* Unit enthaelt keine Sandbox-Optionen mehr, mit Kommentar, warum nicht.
* Neu: pvesnap/preflight.py prueft root-Rechte, Schreibzugriff auf /etc/pve
und Sichtbarkeit von /root. Der Dienst schreibt das beim Start ins
Journal, "pvesnap check" zeigt es ebenfalls an - damit faellt so etwas
sofort auf, statt sich als Lock-Timeout zu tarnen.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Auf einem echten Host schlugen Snapshots reihenweise mit
"cfs-lock 'storage-NAME' error: got lock request timeout" fehl.
Ursache: 'pvesh create .../snapshot' lief mit dem allgemeinen
Kommando-Zeitlimit von 60s. Genau so lange wartet Proxmox aber auf den
Storage-Lock. Lief der Aufruf in unser Zeitlimit, ging es mit der naechsten
VM weiter, waehrend der Task noch lief - und die naechste VM scheiterte
dann an derselben Sperre. Eine VM konnte so einen ganzen Lauf umwerfen.
* Snapshot-Aktionen laufen jetzt mit dem langen task_timeout statt mit dem
kurzen Zeitlimit fuer Lesezugriffe.
* Ohne UPID in der Antwort wird ersatzweise gewartet, bis der Gast nicht
mehr gesperrt ist, statt sofort weiterzumachen.
* Sperr-Fehler gelten als voruebergehend und werden 'retries'-mal mit
'retry_delay' Abstand wiederholt; echte Fehler wie "storage does not
support snapshots" nicht.
* Neu: 'pause_between' fuer eine Pause zwischen zwei Gaesten.
Ausserdem: Kommentare hinter einem Wert ("retries = 2 # ...") wurden nicht
abgeschnitten und machten die Konfiguration ungueltig - das eigene
Beispiel war davon betroffen. 'description' bleibt bewusst unangetastet,
damit ein '#' in der Beschreibung erhalten bleibt.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Nach dem Speichern musste man bisher in die Konsole wechseln, um die
Konfiguration mit "systemctl reload pvesnap" scharf zu schalten. Die
Gruppenliste kann das jetzt selbst:
* 'r' laedt den Dienst neu; ungespeicherte Aenderungen werden vorher zum
Speichern angeboten, ein gestoppter Dienst zum Starten, und wenn das
Neuladen scheitert, wird ein Neustart angeboten.
* Nach 's' fragt der Editor direkt, ob neu geladen werden soll.
* Die Kopfzeile zeigt laufend den Zustand des Dienstes.
* Die Tastenleiste bricht auf schmalen Terminals auf zwei Zeilen um,
statt hinten abgeschnitten zu werden.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>