tawasuyu

sergio/takana

> Una distribución Linux construida con un laboratorio funcional y hermético en el > sótano, y una terminal mutable, clásica y anárquica en el piso de arriba — diseñada > desde el suelo para que una IA programadora entienda, modifique y co…

TOML 1574Shell 204Rust 111Markdown 993763 Definiciones

kde/metal: fix — el prompt nacía en el SERIAL; getty en tty1 (por eso el USB "no abría")

Síntoma: el USB de escritorio arranca, se ve el kernel, "arje-zero: despierta como PID 1",
el remount de la ext4 y el stack-depth de netup… y ahí la pantalla se congela para siempre.

Causa: el CMDLINE horneado es "console=tty0 console=ttyS0,115200 …" y el kernel hace
/dev/console = la ÚLTIMA console= ⇒ ttyS0. La seed card de la base metal supervisa un solo
getty, sobre `console` ⇒ en una laptop sin puerto serie el shell nace INVISIBLE. Los printk
sí van a las DOS consolas: por eso se ven los mensajes del kernel y después silencio. El
sistema nunca estuvo colgado — reproducido en OVMF: por el serial hay shell root (PID 98,
sshd arriba); en pantalla, nada. Nunca se vio antes porque toda validación fue -nographic,
donde el serial ES la pantalla (y el comentario de install-image-efi.sh afirmaba lo contrario:
"console=tty0 al final ⇒ el stdout va a la PANTALLA").

Fix en el script de imagen, no en el cmdline: un getty sobre tty1 es independiente del
cmdline (en metal siempre hay VT) y no obliga a recompilar/re-sellar el kernel (~60min).
Se conserva el getty de `console` para debug por serial.

- seed card del rootfs fundido += nodo tty1-getty (clona console-getty, argv → tty1)
- /usr/bin/console-login: muestra el motd y exec sh. Exporta PATH: arje-zero lanza el getty
  con envp VACÍO ⇒ sin él no se resolvía ni `cat` ni `plasma-start`.
- ambos escriben rompiendo el hardlink (os.replace / rm -f): $MERGED es cp -al de la base,
  escribir in-place mutaba work/metal-rootfs y toda imagen que comparta el inodo — ya había
  pasado con /etc/motd.

Validado en OVMF con pantalla (no -nographic): motd + prompt "/ #" visibles, y `ls /dev/dri`
tecleado por QMP responde card0 (teclado + PATH OK).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

081fdd8a34dff23df45dc92375d11473d617d1ec · por sergio · (hace 3 meses) · padre 6c1a4a8b3 · ver el árbol en este commit

Delta semántico

Ninguna definición cambió: el cambio es de texto, documentación o datos.

1 archivos · +39 −0

diff --git a/scripts/kde/metal-desktop-image-dual.sh b/scripts/kde/metal-desktop-image-dual.sh
index 0db5c1c9..e8aff569 100755
--- a/scripts/kde/metal-desktop-image-dual.sh
+++ b/scripts/kde/metal-desktop-image-dual.sh
@@ -72,6 +72,45 @@ fi
 echo "==> instalando /usr/bin/plasma-start (metal software-GL, lanzamiento manual)"
 install -Dm755 scripts/kde/plasma-start-metal-sw.sh "$MERGED/usr/bin/plasma-start"
 
+# --- getty en tty1: el prompt TIENE que salir por la PANTALLA -----------------------------------------
+# El CMDLINE horneado es "console=tty0 console=ttyS0,115200 …" y el kernel hace /dev/console = la ÚLTIMA
+# console= ⇒ ttyS0. La seed card de la base metal supervisa un solo getty, sobre `console` ⇒ en un metal
+# sin puerto serie el shell nace INVISIBLE: la pantalla se congela en el último printk del kernel (los
+# printk sí van a las dos consolas) y parece que el arranque murió, cuando en realidad está vivo. Eso
+# nunca se vio en QEMU porque siempre validamos con -nographic, donde el serial ES la pantalla.
+# Fix acá y no en el cmdline: un getty sobre tty1 es independiente del cmdline (en metal siempre hay VT)
+# y no obliga a recompilar/re-sellar el kernel. El getty de `console` se conserva (debug por serial).
+echo "==> añadiendo getty en tty1 a la seed card (el prompt de console va al SERIAL, invisible en metal)"
+cat > "$MERGED/usr/bin/console-login" <<'LOGIN'
+#!/bin/sh
+# arje-zero lanza el getty con envp VACÍO ⇒ sin PATH no se resuelve ni `cat` ni `plasma-start`.
+export PATH=/usr/bin:/bin:/usr/sbin:/sbin
+export HOME=/root TERM=linux
+[ -r /etc/motd ] && /bin/busybox cat /etc/motd
+exec /bin/sh
+LOGIN
+chmod 0755 "$MERGED/usr/bin/console-login"
+python3 - "$MERGED/ente/seed.card.json" <<'PY'
+# OJO: $MERGED es un árbol de HARDLINKS a la base metal ⇒ escribir in-place mutaría también
+# work/metal-rootfs (y toda otra imagen que comparta el inodo). Se escribe a un temporal y se
+# os.replace ⇒ se reemplaza la ENTRADA de directorio, el inodo compartido queda intacto.
+import json, sys, copy, os
+p = sys.argv[1]
+card = json.load(open(p))
+gen = card["genesis"]
+gen[:] = [g for g in gen if g["label"] != "tty1-getty"]          # idempotente
+base = next(g for g in gen if g["label"] == "console-getty")
+tty1 = copy.deepcopy(base)
+tty1["id"] = "01HQAR53D4M2NBV8KZTYXFQA03"
+tty1["label"] = "tty1-getty"
+tty1["payload"]["Native"]["argv"] = ["getty", "-n", "-l", "/usr/bin/console-login", "38400", "tty1"]
+gen.append(tty1)
+json.dump(card, open(p + ".new", "w"), indent=2, sort_keys=True)
+os.replace(p + ".new", p)
+print("   ✓ genesis: " + ", ".join(g["label"] for g in gen))
+PY
+
+rm -f "$MERGED/etc/motd"   # romper el hardlink: `cat >` escribiría el inodo COMPARTIDO con work/metal-rootfs
 cat > "$MERGED/etc/motd" <<'MOTD'
 
   #-- hammer :: escritorio KDE Plasma 6 (metal, dual-GPU software) ------------