🔬 cosmic/metal: cosmic-diag — una corrida, toda la evidencia, incluido el dmesg

En metal cada iteración cuesta un viaje físico, así que la captura no puede depender
de que alguien recuerde los pasos. `cosmic-diag` corre la sesión y deja en
/var/log/cosmic: dmesg ANTES, run.txt de la sesión, y dmesg DESPUÉS.

El dmesg de después es lo que faltaba. Medido en el OptiPlex 3060: cosmic-comp toma
seat0 (seatd lo confirma: "Opened client 1"), vive 4,9s y se DESCONECTA, pero su log
se corta a los 0,4s sin panic y con RUST_BACKTRACE=1 activo. Eso no es un error
manejado, es una señal — y si es SIGSEGV el kernel imprime
`cosmic-comp[PID]: segfault at ... in <BIBLIOTECA>`, que ES el diagnóstico.

Descartado antes de pedir otro viaje: la clausura está completa (iris_dri.so, libEGL
y cosmic-comp resuelven todos sus NEEDED en el rootfs), y los errores de tema no son
la causa — cosmic-panel sobrevive al mismo GetKey(list_button) y muere después, de
NoCompositor. Los tres clientes que "no encuentran compositor" son consecuencia.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-05 16:42:02 -04:00
co-authored by Claude Opus 5
parent b854230863
commit e125b7a7c3
+27
View File
@@ -163,6 +163,30 @@ else
echo " ⚠ sin $AKEY ⇒ sshd escuchará pero será inalcanzable (depuración sólo a ciegas)"
fi
# ── cosmic-diag: UN comando que deja toda la evidencia en disco ─────────────────────────────────
# Depurar en metal cuesta un viaje físico por iteración, así que el objetivo es que una corrida
# capture TODO de una vez y sin que nadie tenga que acordarse de los pasos. Lo que importa acá y no
# se estaba capturando: el `dmesg` DESPUÉS de la sesión. Si cosmic-comp muere por SIGSEGV —que es lo
# que indica su log cortado a los 0,4 s, sin panic y con RUST_BACKTRACE=1— el kernel imprime
# `cosmic-comp[PID]: segfault at ... in <BIBLIOTECA>`, y esa biblioteca ES el diagnóstico.
cat > "$MERGED/usr/bin/cosmic-diag" <<'DIAG'
#!/bin/sh
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
L=/var/log/cosmic
mkdir -p "$L"
echo "== cosmic-diag: corriendo la sesión y capturando todo en $L (unos 60s) =="
/bin/busybox dmesg > "$L/dmesg-antes.txt" 2>&1
cosmic-start > "$L/run.txt" 2>&1 &
sleep 50
/bin/busybox dmesg > "$L/dmesg-despues.txt" 2>&1
/bin/busybox sync
echo "== listo. Lo que importa: =="
grep -aiE "segfault|general protection|trap |Code: " "$L/dmesg-despues.txt" | tail -5 || true
echo "== (si no salió nada arriba, no fue SIGSEGV: cosmic-comp salió por su cuenta) =="
echo "== evidencia completa en $L — apagá y traé el USB =="
DIAG
chmod 0755 "$MERGED/usr/bin/cosmic-diag"
# ── getty en tty1: el prompt TIENE que salir por la PANTALLA ────────────────────────────────────
# Lección del 1er viaje físico de KDE, que costó un USB quemado: el CMDLINE horneado es
# `console=tty0 console=ttyS0,115200 …` y el kernel hace /dev/console = la ÚLTIMA `console=` ⇒ ttyS0.
@@ -244,6 +268,9 @@ cat > "$MERGED/etc/motd" <<'MOTD'
Arrancar el escritorio: cosmic-start
⇒ tiene que decir "GL por HARDWARE". Si dice SOFTWARE, el viaje no
sirve: ScreenCast fallaría igual que en QEMU.
Si NO levanta: cosmic-diag <-- UN comando, deja todo en
/var/log/cosmic/ (incluido el dmesg de después,
que es donde el kernel nombra el segfault)
Probar el portal: portal-probe version
portal-probe screencast <-- LO QUE VINIMOS A VER
GPU detectada: ls /dev/dri ; dmesg | grep -iE 'i915|drm'