🪵 cosmic: el log de MI validación viajaba horneado en el USB, y la salida salía doble

Dos defectos que juntos hicieron ilegible el 3er viaje.

1. LOG CONTAMINADO. Los logs de sesión van a disco para sobrevivir al apagón en
   metal — bien— pero validar la imagen en QEMU ESCRIBE DENTRO DEL FICHERO DE
   IMAGEN, y después se quema. El usuario grepeó /var/log/cosmic en su máquina y
   leyó `drm=virtio-pci`: mi corrida en QEMU, no la suya. Un log viejo que parece
   nuevo es peor que no tener log.
   Fix: la imagen crea /var/log/cosmic VACÍO como último paso. Y la regla —validar
   sobre una COPIA, o regenerar antes de quemar— queda escrita donde se comete.

2. SALIDA DOBLE. `say` tee'aba a /dev/console siempre. Lanzado a mano desde el
   getty, stdout YA es la pantalla, y /dev/console es tty0 = la MISMA pantalla
   cuando el cmdline llega vacío (la firmware del OptiPlex no aplica el
   CONFIG_CMDLINE horneado). Cada línea salía dos veces, entreverada con lo que
   arje-zero escribe a consola. Eso es lo que se leía como «basura de init»: no era
   ruido ajeno, era el propio script. Ahora /dev/console sólo si `[ -t 1 ]` es falso.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-05 15:33:50 -04:00
co-authored by Claude Opus 5
parent 1284349ee5
commit 77f8b3e3ec
2 changed files with 16 additions and 1 deletions
+6 -1
View File
@@ -34,7 +34,12 @@ LOG=/var/log/cosmic
mkdir -p "$LOG" 2>/dev/null
[ -d "$LOG" ] && [ -w "$LOG" ] || LOG=/tmp
say() { echo "== cosmic :: $*" | tee -a /dev/console /dev/ttyS0 "$LOG/cosmic-start.log" 2>/dev/null; }
# /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.
[ -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; }
+10
View File
@@ -253,6 +253,16 @@ cat > "$MERGED/etc/motd" <<'MOTD'
MOTD
# ── /var/log/cosmic VACÍO, y no es un detalle ───────────────────────────────────────────────────
# Los logs de la sesión van a disco (para que sobrevivan al apagón en metal), pero eso crea una
# trampa: si se valida la imagen arrancándola en QEMU, esa corrida ESCRIBE DENTRO DEL FICHERO DE
# IMAGEN, y al quemarla el USB se lleva el log de la prueba. Pasó: el usuario grepeó el log en metal
# y leyó `drm=virtio-pci` — mi corrida en QEMU, no la suya. Un log viejo que parece nuevo es peor que
# no tener log.
# REGLA: validar sobre una COPIA de la imagen, o regenerarla antes de quemar. Esto es el cinturón.
rm -rf "$MERGED/var/log/cosmic"
install -d -m 755 "$MERGED/var/log/cosmic"
mkdir -p "$MERGED/root/.config" "$MERGED/root/.cache" "$MERGED/run/user/0" "$MERGED/tmp"
chmod 1777 "$MERGED/tmp"