Newer Older
c299213 3 months ago History
98 lines | 3.691kb
Bogdan Timofte authored 3 months ago
1
# PGS - Technical Notes
2

            
3
## Rol
4

            
5
`pgs` ofera un flux manual si predictibil pentru:
6
- suspend to disk la VM-uri QEMU aflate in rulare
7
- shutdown graceful la containere LXC aflate in rulare
8
- resume/start dupa mentenanta pe baza unui state file local
9

            
10
## Comanda instalata
11

            
12
- locatie: `/usr/local/sbin/pgs`
13
- uninstall canonic: `/usr/local/lib/xdev/pve-guests-state/uninstall.sh`
14
- documentatie instalata: `/usr/local/share/doc/xdev/pve-guests-state`
15

            
16
## State runtime
17

            
18
- locatie curenta: `/var/lib/xdev/pve-guests-state/pgs-state.json`
19
- locatie legacy acceptata pentru migrare: `/var/lib/pve-manager/pgs-state.json`
20
- lock file: `/run/pgs.lock`
21

            
22
State file-ul contine:
23
- `timestamp`
24
- `hostname`
25
- `to_resume`
26
- `was_suspended`
27
- `ct_to_start`
28
- `vm_details`
29
  - `mode`
30
  - `suspend_volume`
31
  - `suspend_file_date`
32

            
33
## Comenzi
34

            
35
```bash
36
/usr/local/sbin/pgs suspend [-v] [--dry-run]
37
/usr/local/sbin/pgs resume [-v] [--dry-run]
38
/usr/local/sbin/pgs cleanup [-v] [--dry-run]
39
```
40

            
41
## Comportament
42

            
43
### Suspend
44

            
45
- preflight cleanup pentru volume orphan/stale `vm-*-state-suspend-YYYY-MM-DD.raw`
46
- VM running -> `qm suspend --todisk 1` -> adaugat in `to_resume`
47
- VM paused/suspended RAM -> suspend to disk, dar nu intra in `to_resume`
48
- VM deja suspendat pe disk -> warning, fara auto-resume; detectia pentru disk suspend cere `lock: suspended`, `vmstate:` in config si un volum de saved-state rezolvabil in storage
49
- CT running -> `pct shutdown --timeout 120` -> adaugat in `ct_to_start`
50
- daca exista deja state file, un nou `suspend` face merge peste state-ul existent si pastreaza intentia anterioara de `to_resume`
51
- pentru fiecare VM retinut in state se salveaza si `suspend_volume` plus `suspend_file_date`
52

            
53
### Cleanup
54

            
Bogdan Timofte authored 3 months ago
55
- scaneaza doar storage-urile locale de tip `dir` cu `content images` definite in `/etc/pve/storage.cfg`
Bogdan Timofte authored 3 months ago
56
- cauta exclusiv fisiere `vm-*-state-suspend-YYYY-MM-DD.raw`
57
- ignora fisiere de forma `vm-*-state-cp*.raw`
Bogdan Timofte authored 3 months ago
58
- storages remote precum NFS sunt sarite intentionat, pentru ca un mount stale poate bloca procesul in kernel I/O wait chiar inainte de mentenanta
Bogdan Timofte authored 3 months ago
59
- daca un volum `state-suspend` este referit de un VM valid suspendat, il pastreaza
60
- daca un volum `state-suspend` este referit, dar VM-ul nu mai are stare valida de suspend, curata `lock`, `vmstate` si volumul
61
- daca un volum `state-suspend` nu mai este referit de niciun VM, il trateaza ca orphan si il sterge
62

            
63
### Resume
64

            
65
- VMs din `to_resume` -> `qm resume`
66
- CTs din `ct_to_start` -> `pct start`
67
- daca `suspend_volume` curent nu mai corespunde cu cel din state, VM-ul este tratat ca alterat dupa salvarea state-ului si nu este auto-resumat
68
- daca apar esecuri, state file-ul ramane pentru retry
69
- daca totul reuseste, state file-ul este sters
70

            
71
## Protectii implementate
72

            
73
- stale suspend image cleanup
74
- cleanup pentru volume orphan `vm-*-state-suspend-YYYY-MM-DD.raw`
75
- retry dupa erori specifice de quorum
76
- `pvecm expected 1` in fereastra de mentenanta, cand eroarea indica lipsa de quorum
77
- cleanup pentru `lock: suspended` cand VM-ul este deja running
78
- cleanup pentru artefacte stale de suspend pe VM-uri `stopped`: `lock: suspended`, `vmstate:` ramas in config si volume orphaned de saved-state
79
- lock local pentru a preveni rulari concurente
80

            
81
## Logging
82

            
83
- interactiva: output pe terminal
84
- prin systemd/journal stream: evitarea dublarii mesajelor in journal
85
- tag jurnal: `pgs`
86

            
87
Exemple:
88

            
89
```bash
90
journalctl -t pgs -n 50 --no-pager
91
journalctl -t pgs -f
92
```
93

            
94
## Note de design
95

            
96
- proiectul nu mai foloseste unitati systemd pentru execuție automata
97
- fisierele din `systemd/` sunt legacy si nu fac parte din install-ul curent
98
- proiectul nu are inca propriul config persistent in `/etc/xdev/...`