tawasuyu
⎇ main docs/gnome-boot-test.md Markdown · 132 siq'ikuna · 5.3 KB Ñawpa willay ch'uya

prueba d270c5e67 · Sergio ·

1# Boot test: GNOME bajo Ente #0 (sin systemd)
2
3Procedimiento para verificar que GNOME 45+ arranca con `ente-zero` como
4PID 1 y los 8 D-Bus shims (logind, hostnamed, timedated, localed,
5journald, resolved, polkit, machined) cubren las llamadas que el
6escritorio realiza durante la sesión.
7
8## Qué se prueba
9
101. **PID 1 boot**: el kernel arranca, mounta initramfs, transfiere control
11   a `/init` que es `ente-zero` con la Card Semilla.
122. **Genesis spawning**: ente-zero encarna el bus D-Bus (dbus-daemon),
13   los 8 compat-shims, NetworkManager, y gdm/sddm (display manager).
143. **D-Bus interception**: los compat-shims toman los nombres
15   `org.freedesktop.{logind,hostname1,timedate1,locale1,resolve1,
16   PolicyKit1,machine1}` antes que cualquier sondeo de systemd.
174. **GNOME session**: gdm autenticación → GNOME shell → settings panels
18   funcionan (Region & Language, Date & Time, About, Network).
19
20## Prerequisitos
21
22- QEMU (`qemu-system-x86_64`) con KVM.
23- Imagen base con kernel + GNOME instalados — sugerencia: una Arch Linux
24  o Fedora minimal modificada (más abajo). NixOS también es razonable.
25- ~10 GiB libre.
26
27## Esqueleto del rootfs
28
29`scripts/build-rootfs.sh` genera un overlay sobre una imagen base que:
30
311. Compila el workspace en modo release (`cargo build --workspace --release`)
322. Copia los binarios a `<rootfs>/usr/local/bin/`:
33   - `ente-zero`
34   - `ente-{logind,hostnamed,timedated,localed,journald,resolved,polkit,machined}-compat`
35   - `ente-echo`, `brainctl`, `busctl`, `ente-journalctl`
363. Renombra el `/init` original a `/sbin/init.systemd` (backup)
374. Symlink `/init` → `/usr/local/bin/ente-zero`
385. Coloca la Card Semilla en `/ente/seed.card.json`
396. Desinstala los services systemd que ahora son shims (logind, etc) o
40   los enmascara con `systemctl mask` (en la imagen base, antes de
41   reescribir `/init`)
42
43## Card Semilla para el boot test
44
45`/ente/seed.card.json` debe declarar como genesis los Entes esenciales:
46- D-Bus daemon (`/usr/bin/dbus-daemon --system`)
47- Los 8 compat-shims
48- NetworkManager
49- udev daemon (kernel events ya manejados por nuestro Netlink stream;
50  udev añade reglas de userspace — opcional)
51- gdm o sddm
52
53El shape es la serialización serde de `EntityCard` (ver
54`crates/ente-card/src/lib.rs`). Para el primer arranque sin GNOME hay un
55ejemplo defensivo en `docs/seed-vps-min.json` (PID 1 + un `sleep infinity`
56supervisado). Extiéndelo añadiendo entradas a `genesis[]` con `payload` de
57forma `{"Native": {"exec": "...", "argv": [...], "envp": []}}` y
58`supervision` `{"Restart": {"initial": 100, "max": 30000}}` para los
59daemons que sí queremos restart-supervisados.
60
61## Boot
62
63```bash
64scripts/run-vm.sh /path/to/base.qcow2 /path/to/built-rootfs.iso
65```
66
67QEMU arranca con:
68- `-kernel` el kernel de la imagen base
69- `-initrd` (opcional) si la imagen no es bootable directa
70- `-append "init=/usr/local/bin/ente-zero rd.break=initqueue"` para
71  redirigir PID 1 desde el initramfs.
72- `-display gtk,gl=on` para ver la sesión gráfica.
73
74## Verificaciones
75
76### Console
77- ente-zero arranca como PID 1 (`/proc/1/comm` == `ente-zero`).
78- Genesis instancia los 8 shims: logs `Ente encarnado label=compat-X`.
79- D-Bus daemon responde: `busctl list` muestra los nombres tomados por
80  los shims (deberían aparecer como `org.freedesktop.X1`).
81
82### gdm
83- Llega al greeter — significa que polkit, logind, hostnamed responden.
84- Login funciona — verifica que `Inhibit`, `CreateSession`, `ListSessions`
85  no bloquean la pila de PAM.
86
87### GNOME shell
88- Settings → About: hostname y OS info pobladas (hostnamed properties).
89- Settings → Date & Time: timezone correcta (timedated).
90- Settings → Region & Language: locale actual visible (localed).
91- Settings → Network: NetworkManager opera, los DNS lookups funcionan
92  (resolved).
93- "Restart" en menú: invoca `org.freedesktop.login1.Reboot` → llega a
94  nuestro stub → log en journal.
95
96### Journal
97- `ente-journalctl --tail 100` muestra mensajes capturados durante el boot.
98- Filtros `--unit gdm.service` y `--source syslog` funcionan.
99
100## Limitaciones conocidas
101
102- **systemd-units**: GNOME no usa systemd unit files directamente, pero
103  algunas apps los crean dinámicamente (e.g., gnome-terminal con
104  `systemd-run --user`). Esas calls fallarán con NotSupported y la app
105  caerá a un fallback no-systemd.
106- **sd_notify**: services que usan `Type=notify` para anunciar readiness
107  fallan silenciosamente (NOTIFY_SOCKET no se setea). Reemplazables con
108  `Type=simple` y nuestro Supervision::Restart.
109- **systemd-tmpfiles**: tmpfiles.d no se procesa. Aplicar manualmente
110  o portar el comportamiento a un Ente.
111- **systemd journal binary export**: nuestro journal usa CAS por hash,
112  no el formato `.journal` binario. Apps que llamen
113  `journalctl --output=export` no son compatibles. `ente-journalctl`
114  cubre los casos típicos.
115
116## Plan de regresión
117
118Hacer boot test en CI tras cada cambio en los compat-shims:
119
1201. `cargo build --workspace --release`
1212. `scripts/build-rootfs.sh` (overlay sobre imagen base inmutable)
1223. `scripts/run-vm.sh --headless --timeout 120` con script de comprobación
123   automatizado (xdotool o similar, o screen-shotting).
1244. Capturar `dmesg` + `ente-journalctl` outputs como artefactos.
125
126Output esperado en stdout del test:
127```
128PASS: ente-zero como PID 1
129PASS: 8 compat-shims encarnados
130PASS: gdm greeter mostrado
131PASS: settings panels operativos
132```

gnome-boot-test.md

Boot test: GNOME bajo Ente #0 (sin systemd)

Procedimiento para verificar que GNOME 45+ arranca con ente-zero como PID 1 y los 8 D-Bus shims (logind, hostnamed, timedated, localed, journald, resolved, polkit, machined) cubren las llamadas que el escritorio realiza durante la sesión.

Qué se prueba

  1. PID 1 boot: el kernel arranca, mounta initramfs, transfiere control a /init que es ente-zero con la Card Semilla.
  2. Genesis spawning: ente-zero encarna el bus D-Bus (dbus-daemon), los 8 compat-shims, NetworkManager, y gdm/sddm (display manager).
  3. D-Bus interception: los compat-shims toman los nombres org.freedesktop.{logind,hostname1,timedate1,locale1,resolve1, PolicyKit1,machine1} antes que cualquier sondeo de systemd.
  4. GNOME session: gdm autenticación → GNOME shell → settings panels funcionan (Region & Language, Date & Time, About, Network).

Prerequisitos

Esqueleto del rootfs

scripts/build-rootfs.sh genera un overlay sobre una imagen base que:

  1. Compila el workspace en modo release (cargo build --workspace --release)
  2. Copia los binarios a <rootfs>/usr/local/bin/:
    • ente-zero
    • ente-{logind,hostnamed,timedated,localed,journald,resolved,polkit,machined}-compat
    • ente-echo, brainctl, busctl, ente-journalctl
  3. Renombra el /init original a /sbin/init.systemd (backup)
  4. Symlink /init → /usr/local/bin/ente-zero
  5. Coloca la Card Semilla en /ente/seed.card.json
  6. Desinstala los services systemd que ahora son shims (logind, etc) o los enmascara con systemctl mask (en la imagen base, antes de reescribir /init)

Card Semilla para el boot test

/ente/seed.card.json debe declarar como genesis los Entes esenciales:

El shape es la serialización serde de EntityCard (ver crates/ente-card/src/lib.rs). Para el primer arranque sin GNOME hay un ejemplo defensivo en docs/seed-vps-min.json (PID 1 + un sleep infinity supervisado). Extiéndelo añadiendo entradas a genesis[] con payload de forma {"Native": {"exec": "...", "argv": [...], "envp": []}} y supervision {"Restart": {"initial": 100, "max": 30000}} para los daemons que sí queremos restart-supervisados.

Boot

scripts/run-vm.sh /path/to/base.qcow2 /path/to/built-rootfs.iso

QEMU arranca con:

Verificaciones

Console

gdm

GNOME shell

Journal

Limitaciones conocidas

Plan de regresión

Hacer boot test en CI tras cada cambio en los compat-shims:

  1. cargo build --workspace --release
  2. scripts/build-rootfs.sh (overlay sobre imagen base inmutable)
  3. scripts/run-vm.sh --headless --timeout 120 con script de comprobación automatizado (xdotool o similar, o screen-shotting).
  4. Capturar dmesg + ente-journalctl outputs como artefactos.

Output esperado en stdout del test:

PASS: ente-zero como PID 1
PASS: 8 compat-shims encarnados
PASS: gdm greeter mostrado
PASS: settings panels operativos