SDD 26 §3.ter: el muro del display del PGO está despejado, con evidencia

El PGO necesita correr el navegador para juntar el perfil, y las distros lo
hacen bajo xvfb-run. Nosotros no tenemos X11 (Wayland-only), así que el plan
decía «la salida es un sway headless». Ya no es plan: se corrió.

sway con WLR_BACKENDS=headless y WLR_RENDERER=pixman arranca en gioser —un LXC
SIN /dev/dri, o sea sin GPU ninguna— y dibuja píxeles reales. La captura va como
evidencia: sway 1.10 / wlroots 0.18.2 / foot 1.27.0, los tres binarios nuestros,
salida HEADLESS-1 a 1280x720. Ciclo completo ~2 min.

Dos cosas que costó y quedan escritas para no repetirlas:

· Hidratar BAJO el montaje del store. hydrate-profile.py enlaza, y un hardlink
  no cruza montajes: con --into work/... sale EXDEV porque el store está en otro
  disco. Con --into store/.rootfs/sway son 193/193 nodos y 4,9 G que no ocupan.

· Inyectar el loader de musl. sway salió DINÁMICO y pide
  /lib/ld-musl-x86_64.so.1, que el cierre no trae. El error es
  «exec: /usr/bin/sway: not found», que se lee como «falta el binario» cuando lo
  que falta es su INTÉRPRETE. En musl el libc.so ES el loader, así que se
  resuelve con un --ro-bind. Misma familia que el resto de la noche: el mensaje
  nombra lo que buscó, no lo que falta.

Queda el segundo muro del PGO, que es de diseño y no de infra: el profdata no es
determinista, así que hay que generarlo UNA vez y sellarlo como artefacto propio
consumido por hash.
This commit is contained in:
Sergio
2026-09-06 16:09:24 +00:00
parent ff9dffaff6
commit e88e4ab3d7
2 changed files with 19 additions and 0 deletions
+19
View File
@@ -172,6 +172,25 @@ y el scope de addons se juntan en una sola pasada, no en seis.
camino no existe acá. La salida hammer-nativa es correrlo bajo un **sway headless**
(`WLR_BACKENDS=headless`), que ya tenemos del frente wlr/sway y arranca en segundos.
**✅ EL MURO DEL DISPLAY ESTÁ DESPEJADO (2026-09-06).** No es una previsión: se corrió. `sway`
headless con `WLR_BACKENDS=headless` y `WLR_RENDERER=pixman` arranca en **gioser**, que es un LXC
**sin `/dev/dri`** —o sea sin GPU ninguna, todo software— y dibuja píxeles de verdad:
`docs/evidencia/sway-headless-gioser-sin-gpu-2026-09-06.png` (sway 1.10 / wlroots 0.18.2 /
foot 1.27.0, los tres binarios nuestros, salida `HEADLESS-1` a 1280x720). El ciclo entero es de
~2 min con `scripts/wlr/sway-headless.sh`.
Dos cosas que hubo que resolver y conviene tener escritas antes de repetirlo:
· **Hidratar bajo el montaje del store.** `hydrate-profile.py` ENLAZA, y un hardlink no cruza
montajes: con `--into work/...` sale `EXDEV` porque el store vive en otro disco. Con
`--into store/.rootfs/sway` son 193/193 nodos, 41.677 ficheros y **4,9 G que no ocupan** (son
hardlinks al store).
· **Inyectar el loader de musl.** `sway` salió DINÁMICO y pide `/lib/ld-musl-x86_64.so.1`, que el
cierre no trae; el error es `exec: /usr/bin/sway: not found`, que se lee como «falta el binario»
y lo que falta es su intérprete. Se resuelve con
`--ro-bind /usr/lib/musl/lib/libc.so /lib/ld-musl-x86_64.so.1` (en musl el `libc.so` ES el
loader). Es la misma familia que el resto de la noche: el mensaje nombra lo que buscó, no lo que
falta.
**Y el perfil no es determinista.** Los contadores dependen del timing de la corrida, así que dos
generaciones del profdata no dan los mismos bytes — a las distros no les importa porque no persiguen
bit-repro; a nosotros nos rompe el invariante. La salida: **generar el perfil UNA vez y sellarlo como
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB