gioser

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1181Shell 82Rust 62Markdown 521515 Definiciones

⎇ 534014c3ec69daea789a1d0523e1d00a69c6ed65 scripts/wlr/sway-headless.sh Shell · 87 líneas · 5.3 KB Historia crudo

takana etapa 5c: comentarios de scripts, MOTD, y un BUG que introdujo la etapa 4 476168bb0 · Sergio ·

1#!/bin/sh
2# sway-headless.sh — arranca el perfil escritorio-sway SIN QEMU, SIN kernel y SIN imagen de disco, y
3# captura la pantalla con grim. Hermano de sway-start.sh (que arranca dentro de la VM); éste corre el
4# cierre hidratado dentro de un `bwrap` sobre la máquina de desarrollo.
5#
6# PARA QUÉ. Validar «el escritorio dibuja» costaba armar un product-rootfs + imagen EFI + arranque en
7# QEMU: ~40 min por vuelta y hace falta un `takana bootstrap product` que hoy no está en el store.
8# Headless da la misma evidencia —píxeles reales, dibujados por NUESTROS binarios— en ~2 min, así que
9# el ciclo de diagnóstico deja de ser el cuello de botella. NO sustituye al arranque en QEMU: no prueba
10# kernel, ni initramfs, ni DRM, ni el PID1. Prueba el compositor y sus clientes, que es justo lo que
11# el arranque en VM tapa detrás de una pantalla negra.
12#
13# INVOCACIÓN (desde la raíz del repo, con work/sway-rootfs ya hidratado):
14#   mkdir -p /tmp/sway-out
15#   bwrap --bind work/sway-rootfs / --bind /usr/lib/musl /usr/lib/musl \
16#         --bind /tmp/sway-out /salida --dev /dev --proc /proc --tmpfs /run --tmpfs /tmp \
17#         --unshare-user --uid 0 --gid 0 --setenv PATH /usr/bin:/bin:/usr/sbin:/sbin \
18#         /bin/sh /sway-headless.sh
19#
20# ── LO QUE EL CIERRE 121/121 NO TRAE Y HAY QUE INYECTAR ────────────────────────────────────────
21# Medido el 2026-08-26 sobre el perfil COMPLETO. Nada de esto lo aporta la clausura:
22#   · libz.so.1 / libexpat.so.1 / libffi.so.8 — sway salió DINÁMICO contra ellas y el corpus sólo
23#     produce los `.a`. `libz.so.1` está como artefacto aparte (`zlib-shared`); las otras dos hoy
24#     sólo existen en `.dev-fs/alpine`. Sin ellas sway ni arranca: «Error relocating /usr/bin/sway:
25#     XML_ParserFree: symbol not found».
26#   · /etc/passwd — sin él yambar hace getpwuid y falla. (`fonts.conf` NO hace falta: lo trae el
27#     propio artefacto de fontconfig; el problema eran las fuentes, no su configuración.)
28#
29# YA NO hace falta inyectar `xkeyboard-config` ni `dejavu-fonts`: desde el 2026-08-26 están
30# DECLARADAS como raíces de `escritorio-sway` y las recetas viven en `recipes/incoming-wlr/`. Antes
31# existían sólo en las colas de kde/gnome/cosmic, así que el perfil no las alcanzaba y el escritorio
32# arrancaba sin datos XKB y sin una sola fuente. Prueba de que la declaración es equivalente a la
33# inyección manual: la captura resultante es **bit a bit idéntica**, mismo sha256.
34#
35# ── BASH NO CORRE EN ESTE ROOTFS, Y ASÍ ES COMO SE VE ──────────────────────────────────────────
36# `/bin/bash` está enlazado dinámico contra ncurses y el corpus sólo produce `libncurses.a`:
37#     Error relocating /bin/bash: tgetent: symbol not found
38# El síntoma NO fue un error de bash. Fue que `foot` abría, sway registraba «New xdg_shell toplevel»
39# —o sea la ventana EXISTÍA en el árbol— y la captura salía con UN SOLO COLOR, el de swaybg: foot
40# lanzaba el shell, el shell moría al instante y la ventana se cerraba antes del frame. Por eso acá
41# el shell es busybox, que sí es autosuficiente.
42#
43# ── LA EVIDENCIA ES CONTAR COLORES, NO LEER EL LOG ─────────────────────────────────────────────
44# El log entero puede estar en verde con la pantalla vacía. La medida que no se puede falsear:
45#   1 color   = sólo el fondo de swaybg   ⇒ NINGÚN cliente dibujó (aunque el árbol los liste)
46#   ~380      = terminal con texto        ⇒ #242424 fondo de foot, #285577/#4c7899 bordes de sway,
47#                                           #d0d0d0 el texto. ESO es un escritorio dibujando.
48
49export XDG_RUNTIME_DIR=/run/user/0
50mkdir -p "$XDG_RUNTIME_DIR"; chmod 700 "$XDG_RUNTIME_DIR"
51export WLR_BACKENDS=headless
52export WLR_HEADLESS_OUTPUTS=1
53export WLR_RENDERER=pixman
54export XDG_CONFIG_HOME=/root/.config
55export SHELL=/bin/bash
56export LANG=C
57export HOME=/root
58
59(
60  i=0
61  while [ ! -S /run/user/0/wayland-1 ] && [ $i -lt 40 ]; do sleep 1; i=$((i+1)); done
62  [ -S /run/user/0/wayland-1 ] || { echo "!! el socket wayland nunca apareció"; exit 1; }
63  export WAYLAND_DISPLAY=wayland-1
64  echo "== socket listo, lanzando clientes"
65  /usr/bin/swaybg -c '#1a4b8c' & sleep 2
66  # bash NO corre en este rootfs: está enlazado dinámico contra ncurses y el corpus sólo produce
67  # libncurses.a ⇒ «Error relocating /bin/bash: tgetent: symbol not found». foot lanzaba el shell,
68  # el shell moría al instante y foot cerraba la ventana: el toplevel APARECÍA en el árbol de sway
69  # y la captura salía 100% del color de swaybg. Se usa busybox, que sí es autosuficiente.
70  /usr/bin/foot -- /bin/busybox sh -c '
71      echo "  hammer — distro reproducible desde fuente"
72      echo
73      echo "  compositor : sway 1.10 / wlroots 0.18.2"
74      echo "  terminal   : foot 1.27.0"
75      echo "  libc       : musl        toolchain: zig cc"
76      echo
77      /bin/busybox uname -a
78      echo
79      echo "  binarios en /usr/bin: $(/bin/busybox ls /usr/bin | /bin/busybox wc -l)"
80      /bin/busybox sleep 60' >/salida/foot.log 2>&1 & sleep 12
81  echo "== capturando"
82  /usr/bin/grim /salida/captura.png 2>&1 && echo "== grim OK: $(ls -l /tmp/captura.png)"
83  sleep 1
84  /usr/bin/swaymsg exit 2>/dev/null
85) &
86
87exec /usr/bin/sway -d 2>&1