🩻 cosmic: escribir a /dev/ttyS0 COLGABA el arranque en metal (open() espera DCD)
Diagnosticado por el usuario en el OptiPlex 3060 quitando los pipes de say(). 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 pasa en QEMU porque el cmdline lleva `console=ttyS0,115200`. En ese metal la firmware NO aplica el CONFIG_CMDLINE horneado —el kernel arranca con `Command line:` VACÍO— así que ttyS0 es un puerto común, sin cable: el PRIMER say() se colgaba ahí. Explica los tres síntomas que no cerraban: - /var/log/cosmic se creaba (el mkdir va antes) pero el .log nunca aparecía; - `cosmic-start > /salida.txt` daba VACÍO ⇒ parecía que el script no se ejecutaba, cuando estaba bloqueado en su primera línea de salida; - la corrida terminaba siempre en «log del compositor (primer tramo)»: no era el último paso, era el dump() bloqueándose en el mismo sitio. El serial no se pierde: cuando ES la consola, /dev/console YA ES ttyS0. Cuando no lo es, no había nadie del otro lado. En metal lo que sirve es el fichero de log. Con say() destrabado, la detección de GL quedó CONFIRMADA en metal por primera vez: == cosmic :: GL por HARDWARE — kernel drm=i915 + iris_dri.so (sin overrides) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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 $$)"
|
||||
|
||||
Reference in New Issue
Block a user