diff --git a/scripts/cosmic/cosmic-start.sh b/scripts/cosmic/cosmic-start.sh index 4e167fb5..81842135 100755 --- a/scripts/cosmic/cosmic-start.sh +++ b/scripts/cosmic/cosmic-start.sh @@ -34,15 +34,27 @@ LOG=/var/log/cosmic mkdir -p "$LOG" 2>/dev/null [ -d "$LOG" ] && [ -w "$LOG" ] || LOG=/tmp -# /dev/console SÓLO si nuestro stdout no es ya un terminal. Si el script lo lanzás a mano desde el -# getty, stdout ES la pantalla y /dev/console (=tty0 cuando el cmdline llega vacío, como en la -# firmware del OptiPlex) es LA MISMA pantalla ⇒ cada línea salía DOS VECES, entreverada con lo que -# arje-zero escribe a la consola. Eso es lo que se leía como «basura»: no era ruido ajeno, era esto. +# ⚠⚠ NUNCA ESCRIBIR A /dev/ttyS0 A CIEGAS — CUELGA EL ARRANQUE EN METAL ⚠⚠ +# Abrir un puerto serie sin portadora BLOQUEA en open() esperando DCD, salvo que el termios tenga +# CLOCAL. El kernel pone CLOCAL cuando registra el puerto COMO CONSOLA, y eso ocurre en QEMU porque el +# cmdline lleva `console=ttyS0,115200`. En el metal del OptiPlex 3060 la firmware NO aplica el +# CONFIG_CMDLINE horneado (el kernel arranca con `Command line:` VACÍO) ⇒ ttyS0 es un puerto común, +# sin cable, sin portadora: el PRIMER `say` se colgaba ahí para siempre. Síntoma exacto y desconcertante: +# /var/log/cosmic se creaba (el mkdir va antes) pero el .log nunca aparecía, y redirigir a fichero +# daba vacío — o sea que el script parecía no ejecutarse cuando en realidad estaba bloqueado en su +# primera línea de salida. Diagnosticado por el usuario quitando los pipes, 2026-08-05. +# +# El serial no se pierde: cuando ES la consola, /dev/console YA ES ttyS0. Cuando no lo es, no había +# nada que escuchara del otro lado. Escribir al fichero de log es lo que sirve en metal. +# +# Y /dev/console sólo si stdout no es ya un terminal: lanzado a mano desde el getty, stdout ES la +# pantalla y /dev/console (=tty0 con cmdline vacío) es LA MISMA ⇒ cada línea salía DOS VECES. [ -t 1 ] && CONS="" || CONS=/dev/console -say() { echo "== cosmic :: $*" | tee -a $CONS /dev/ttyS0 "$LOG/cosmic-start.log" 2>/dev/null; } -# `dump` iba SÓLO al serial, y ahí se perdió la explicación de los tres fallos de la primera corrida -# en la imagen de metal: sin puerto serie, los volcados se escriben a la nada. Ahora también a disco. -dump() { { echo "---- $1 ----"; cat "$1" 2>/dev/null; } | tee -a /dev/ttyS0 "$LOG/cosmic-start.log" >/dev/null 2>&1; } +say() { echo "== cosmic :: $*" | tee -a $CONS "$LOG/cosmic-start.log" 2>/dev/null; } +# `dump` iba SÓLO al serial: en metal eso es a la vez escribir a la nada Y COLGARSE (ver arriba). Por +# eso el 3er viaje terminaba siempre en «log del compositor (primer tramo)»: no era el último paso, +# era donde se bloqueaba. Ahora va al fichero de log, que es lo que se puede leer después. +dump() { { echo "---- $1 ----"; cat "$1" 2>/dev/null; } >> "$LOG/cosmic-start.log" 2>/dev/null; } alive() { s=$(sed -n 's/^State:[[:space:]]*//p' /proc/$1/status 2>/dev/null); case "$s" in ""|Z*) return 1;; *) return 0;; esac; } say "arrancando (pid $$)"