Scopul inițial a fost simplu: - să se poată salva starea guest-urilor active înainte de lucrări de mentenanță; - să se poată restaura după revenirea nodurilor; - să se evite pornirea guest-urilor care erau deja suspendate sau oprite înainte de operație.
Pentru VM-uri QEMU, asta a însemnat qm suspend --todisk 1.
Pentru containere LXC, asta a însemnat pct shutdown, urmat de pct start la restaurare.
Prima variantă a fost automată:
- systemd apela suspend la oprirea nodului;
- systemd apela resume la revenirea nodului;
- un fișier JSON local păstra lista guest-urilor care trebuiau restaurate.
Motivația a fost să existe un flux "hands-off" pentru reboot și shutdown.
În practică, abordarea automată a fost fragilă pe un cluster Proxmox real.
Problemele observate:
- imagini stale de suspend:
- disk image '...state-suspend-....raw' already exists
- scrieri eșuate în pmxcfs / /etc/pve:
- Permission denied
- Device or resource busy
- ferestre fără quorum în timpul opririi sau revenirii nodurilor;
- VM-uri care porneau, dar rămâneau cu lock: suspended;
- restaurări parțiale, cu numai o parte din guest-uri repornite;
- comportament dependent de ordinea exactă în care reveneau rețeaua, corosync, storage-ul și pve-cluster.
Problema structurală a fost aceasta:
- qm suspend și qm resume nu sunt operații pur locale;
- ele au nevoie de scrieri coerente în /etc/pve;
- /etc/pve depinde de pmxcfs și de starea clusterului;
- în scenarii în care mai multe noduri se opresc sau pornesc în același timp, această dependență devine sursă de curse și inconsistențe.
Am adăugat mai multe remedieri tactice:
- cleanup pentru imagini stale;
- retry după eșec;
- relaxare temporară de quorum cu pvecm expected 1;
- curățare automată pentru lock: suspended.
Aceste remedieri au redus unele erori, dar nu au schimbat faptul că modelul automat rămânea nedeterminist în scenarii de mentenanță pe întregul cluster.
Automatizarea la shutdown/boot nu a fost suficient de robustă pentru mediul real.
Mai exact: - pentru reboot de un singur nod, putea funcționa uneori acceptabil; - pentru lucrări în care mai multe noduri sau întregul cluster sunt oprite, rezultatele nu au fost suficient de predictibile.
Problema nu mai era un bug punctual, ci o nepotrivire între design și condițiile reale de operare.
A fost aleasă o variantă mai simplă și mai controlabilă:
- fără automatizare systemd;
- fără hook-uri la shutdown sau boot;
- suspendarea se rulează manual înainte de mentenanță;
- restaurarea se rulează manual după revenirea clusterului.
Comenzile sunt:
/usr/local/sbin/pgs suspend -v
/usr/local/sbin/pgs resume -v
Se pierde comoditatea automatizării, dar se câștigă:
- control explicit asupra momentului execuției;
- posibilitatea de a aștepta revenirea clusterului înainte de resume;
- debug mai simplu;
- mai puține efecte surprinzătoare în timpul shutdown-ului;
- separare clară între pregătirea mentenanței și restaurarea ulterioară.
Practic, operatorul decide când clusterul este suficient de stabil pentru restaurare, în loc să lase asta pe seama ordinii de pornire a serviciilor.
Deși automatizarea a fost eliminată, scriptul păstrează unele protecții utile:
- detecție și cleanup pentru imagini stale de suspend;
- tratament pentru guest-uri deja pornite sau deja suspendate;
- cleanup pentru lock: suspended când este posibil;
- jurnalizare clară în journalctl -t pgs.
Acestea rămân utile și în fluxul manual.
Proiectul nu mai încearcă: - să orchestreze reboot-ul nodurilor; - să decidă automat momentul corect pentru restore; - să garanteze restaurare automată după revenirea clusterului.
Acesta este acum un utilitar manual de guest state, nu un manager de reboot.