đ©» 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>
Semantic delta
No definition changed: this change is text, documentation or data.
1 files · +20 â8
- scripts/cosmic/cosmic-start.sh +20 â8
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 $$)"