tawasuyu

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 1430Shell 145Markdown 87Rust 852973 Definitions

⎇ 534014c3ec69daea789a1d0523e1d00a69c6ed65 scripts/wlr/sway-start.sh Shell · 75 lines · 5.2 KB History raw

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

1#!/bin/sh
2# sway-start.sh — arranque de sway dentro de la VM. Lo ejecuta el `console-getty` de arje-zero en
3# lugar de /bin/sh, así que corre como PID de sesión sin login manager.
4#
5# ── LA SESIÓN VA POR `seatd-launch`, NO POR EL BACKEND «builtin» ───────────────────────────────
6# Primer intento: `LIBSEAT_BACKEND=builtin`, que en libseat abre el DRM directo siendo root.
7# **Falló, y el log lo dijo exacto**:
8#     [libseat] No backend matched name 'builtin'
9#     [backend/session] Unable to create seat: Invalid argument → Failed to start a DRM session
10# Porque NUESTRO libseat no lo trae: `recipes/seatd.toml` construye con `-Dlibseat-seatd=enabled
11# -Dlibseat-logind=disabled`, o sea UN solo backend. Confirmado con `strings libseat.so`: lista
12# `seatd` y nada más.
13# ⇒ La receta manda sobre lo que uno cree recordar de un proyecto. Y la misma receta trae la
14#   solución: `-Dserver=enabled` construye el demonio Y `seatd-launch`, que lo levanta, corre el
15#   comando y limpia al salir.
16# ── tmpfs SOBRE /run: la raíz de takana se monta de SÓLO LECTURA ───────────────────────────────
17# El diagnóstico lo dijo sin ambigüedad: «/run/user/0 NO escribible». `/run` no es un tmpfs sino un
18# directorio normal sobre la raíz, y la raíz de esta distro es INMUTABLE por diseño (root ro +
19# partición de estado aparte). Sin esto, sway no puede crear su lockfile y muere en bucle con
20# «unable to open lockfile /run/user/0/wayland-N.lock check permissions» — un mensaje que suena a
21# permisos de directorio y en realidad es un sistema de ficheros de sólo lectura.
22# Montar un tmpfs es lo que hace cualquier init; acá lo hace el lanzador porque arje-zero deja /run
23# para quien lo necesite.
24BB=/bin/busybox
25$BB mount -t tmpfs -o mode=755 tmpfs /run 2>/dev/null || true
26
27export XDG_RUNTIME_DIR=/run/user/0
28$BB mkdir -p "$XDG_RUNTIME_DIR"; $BB chmod 700 "$XDG_RUNTIME_DIR"
29
30# ── RENDERER PIXMAN, NO GLES2: en QEMU no hay driver de GPU que mesa pueda cargar ──────────
31# Con gles2 el arranque muere: «MESA-LOADER: failed to open virtio_gpu: /usr/lib/dri/virtio_gpu_dri.so
32# No such file or directory» — mesa busca el driver del dispositivo REAL que ve (virtio_gpu) y
33# nuestro mesa-llvmpipe sólo trae swrast/kms_swrast. Y «Not allowed to force software rendering when
34# API explicitly selects a hardware device»: LIBGL_ALWAYS_SOFTWARE no lo salva porque wlroots ya
35# eligió el dispositivo EGL explícitamente. Las dos variables juntas se pedían cosas contradictorias.
36# wlroots trae un renderer PIXMAN por software que NO pasa por EGL ni GBM (buffers dumb del DRM) y
37# se construye SIEMPRE: -Drenderers sólo elige entre gles2 y vulkan. Es la salida para una VM sin GPU.
38export WLR_RENDERER=pixman
39
40# Diagnóstico: sin esto, cuando algo falla el log dice «no outputs» y nada más.
41export WLR_DRM_NO_ATOMIC=1
42export WAYLAND_DEBUG=0
43
44# ⚠ EL LOG VA AL SERIAL, NO A UN FICHERO DENTRO DE LA VM. El primer intento lo mandaba a
45# /var/log/sway.log y la captura salió 99% negra SIN UNA SOLA LÍNEA que explicara por qué: el
46# diagnóstico estaba dentro de la caja que no arranca. Un log que no se puede leer desde fuera no
47# es un log. (La causa resultó ser `libz.so.1` ausente del rootfs, invisible en la pantalla negra.)
48# ── DIAGNÓSTICO EXPLÍCITO antes de arrancar ────────────────────────────────────────────────────
49# sway falló con «unable to open lockfile /run/user/0/wayland-N.lock check permissions» y yo no
50# tenía forma de saber si el directorio existía, de quién era, ni si /run era escribible. Adivinar
51# cuesta un ciclo de imagen+arranque (~3 min); imprimir la verdad cuesta cuatro líneas.
52echo "== id: $($BB id 2>&1)"
53echo "== /run:        $($BB ls -ld /run 2>&1)"
54echo "== /run/user/0: $($BB ls -ld /run/user/0 2>&1)"
55if $BB touch /run/user/0/.probe 2>/dev/null; then echo "== /run/user/0 ESCRIBIBLE"; $BB rm -f /run/user/0/.probe
56else echo "== /run/user/0 NO escribible"; fi
57
58$BB rm -f /run/seatd.sock   # el getty reinicia en bucle si sway falla; un socket huérfano impide arrancar seatd
59# ── LOS CLIENTES SE LANZAN CUANDO EL SOCKET YA ESCUCHA, NO DESDE LA CONFIG ─────────────────────
60# Los `exec` del fichero de config de sway dispararon a los 0,259 s y el workspace se creó a los
61# 0,305 s ⇒ los tres murieron con «Failed to create launch context. No workspace». Resultado: el
62# compositor arrancaba PERFECTO —salida activada, modo 1280x800, commit OK— y la captura salía 100%
63# negra, porque no había un solo cliente dibujando. Es el peor tipo de fallo: todo verde en el log
64# y nada en la pantalla, que es exactamente por lo que la regla dice validar CON PANTALLA.
65# Acá se espera al socket de Wayland y recién entonces se lanza, que es la condición real.
66(
67  i=0
68  while [ ! -S /run/user/0/wayland-1 ] && [ $i -lt 60 ]; do $BB sleep 1; i=$((i+1)); done
69  export WAYLAND_DISPLAY=wayland-1
70  /usr/bin/swaybg -c '#1a4b8c' &
71  /usr/bin/yambar &
72  /usr/bin/foot &
73) &
74
75exec /usr/bin/seatd-launch -- /usr/bin/sway -d 2>&1