From 11e6a3c78c9d8593a4c89a17d74d7648b16c5f35 Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 5 Aug 2026 11:41:16 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A9=20cosmic/metal:=20imagen=20EFI=20c?= =?UTF-8?q?on=20iris=20HW=20=E2=80=94=20el=20viaje=20que=20cierra=20Screen?= =?UTF-8?q?Cast?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hermano de kde/metal-desktop-image-dual.sh, pero con la decisión INVERTIDA y ése es el motivo de existir. La de KDE va por mesa-llvmpipe a propósito (tenía que aguantar también una NVIDIA Pascal, cuya mesa HW sólo existe como binario Alpine ⇒ rompería soberanía). Acá el objetivo es cerrar ScreenCast, y el diagnóstico de hoy midió que lo que falla es el COMPOSITOR en una llamada EGL —8 ms antes del `Paused`— porque en QEMU mesa es kms_swrast: software, SIN exportación dmabuf. El `mesa` del corpus se construye con -Dgallium-drivers=iris y YA está en el rootfs de COSMIC; en QEMU nunca se usaba, en un TigerLake es el driver correcto y trae dmabuf de verdad. O sea que este viaje no es "lo mismo pero en metal": es la única forma de saber si ScreenCast está bien. ⚠ Por eso NO se inyecta llvmpipe: mezclarlos no es aditivo — llvmpipe trae su propio libgbm/libEGL/libgallium y sobrescribirlos DESACTIVA iris. Si la máquina no tuviera Intel, la imagen correcta sería la de KDE, no ésta con un parche. Y lo que NO hace falta inyectar, medido: la de KDE mete libLLVM.so.18 + libgcc_s + libstdc++ porque el JIT de llvmpipe los NEEDea. Acá NO — iris_dri.so pide sólo libglapi/libdrm/libz/libzstd/libc (mesa va con -Dllvm=disabled) y cosmic-comp ocho NEEDED sin C++. CERO binarios ajenos de Alpine. Verificado con clausura ELF completa del rootfs: 472 objetos escaneados, 42 raíces de runtime, 0 con NEEDED sin proveedor (los 3 huecos son llvm-*/perl, herramientas de build que el escritorio no arranca). Se instala EL MISMO cosmic-start validado en QEMU, no una variante: nada de lo que hace es específico del emulador, y que corra el mismo fichero es lo que hace que "validado en QEMU" signifique algo para el metal. VALIDADO EN OVMF CON PANTALLA, que es la regla de oro que costó un USB en el 1er viaje de KDE (-serial null para simular metal sin puerto serie): arje-zero PID 1, las 4 particiones montadas, el motd VISIBLE y el prompt `/ #` en la pantalla — o sea que el getty de tty1 hace su trabajo. El shell responde: iris_dri.so presente, /dev/dri/card0, y cosmic-start/portal-probe/wireplumber en PATH. Falta quemar el USB, que es destructivo y necesita que el usuario confirme el device. Co-Authored-By: Claude Opus 5 (1M context) --- .../cosmic-metal-boot-pantalla-2026-08-05.png | Bin 0 -> 36166 bytes scripts/cosmic/metal-desktop-image.sh | 151 ++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 docs/evidencia/cosmic-metal-boot-pantalla-2026-08-05.png create mode 100755 scripts/cosmic/metal-desktop-image.sh diff --git a/docs/evidencia/cosmic-metal-boot-pantalla-2026-08-05.png b/docs/evidencia/cosmic-metal-boot-pantalla-2026-08-05.png new file mode 100644 index 0000000000000000000000000000000000000000..8c235373e83d23054124443fad01e0b00970d29c GIT binary patch literal 36166 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 exit 1; }; done +[ -n "$KERNEL" ] && [ -r "$KERNEL" ] || { echo "falta linux-metal-dual (hammer build recipes/linux-metal-dual.toml)" >&2; exit 1; } + +echo "==> fundiendo rootfs por hardlinks (base metal + COSMIC)" +rm -rf "$MERGED" +cp -al "$BASE" "$MERGED" +cp -al --remove-destination "$COSMIC"/. "$MERGED"/ + +. "$ROOT/scripts/lib/pid1-desde-store.sh" +inyectar_pid1 "$MERGED" "$BASE" + +# El driver HW tiene que estar SÍ O SÍ: si no está, esta imagen no tiene razón de ser y es mejor +# fallar acá que descubrirlo con el USB en la mano frente a una pantalla negra. +[ -r "$MERGED/usr/lib/dri/iris_dri.so" ] || { echo " ✗ falta iris_dri.so — sin GPU Intel esta imagen no sirve" >&2; exit 1; } +echo "==> GL por HARDWARE: $(ls "$MERGED"/usr/lib/dri/ | tr '\n' ' ')" + +echo "==> inyectando musl (loader + libc) — COSMIC es dinámico, la base metal es estática" +MUSL="${MUSL:-/usr/lib/musl/lib/libc.so}" +[ -r "$MUSL" ] || { echo "no encuentro musl libc ($MUSL)" >&2; exit 1; } +mkdir -p "$MERGED/usr/lib/musl/lib" "$MERGED/lib" +cp -a "$MUSL" "$MERGED/usr/lib/musl/lib/libc.so" +ln -sf /usr/lib/musl/lib/libc.so "$MERGED/lib/ld-musl-x86_64.so.1" +ln -sf /usr/lib/musl/lib/libc.so "$MERGED/usr/lib/libc.so" + +# ── el arranque del escritorio ────────────────────────────────────────────────────────────────── +# Se instala EL MISMO script que se validó en QEMU, y no una variante: nada de lo que hace es +# específico del emulador. Levanta XDG_RUNTIME_DIR, seatd, el bus de sistema, el shim de logind, +# pipewire, wireplumber, el compositor y los clientes — todos pasos de escritorio, no de QEMU. Que +# corra el mismo fichero es lo que hace que «validado en QEMU» signifique algo para el metal. +echo "==> instalando /usr/bin/cosmic-start (el MISMO script validado en QEMU)" +install -Dm755 scripts/cosmic/cosmic-start-qemu.sh "$MERGED/usr/bin/cosmic-start" + +# ── getty en tty1: el prompt TIENE que salir por la PANTALLA ──────────────────────────────────── +# Lección del 1er viaje físico de KDE, que costó un USB quemado: 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 supervisa un solo getty, sobre `console` ⇒ en un metal sin puerto serie el +# shell nace INVISIBLE: la pantalla se congela en el último printk y parece que el arranque murió, +# cuando está vivo. Nunca se vio en QEMU porque siempre se validaba con `-nographic`, donde el serial +# ES la pantalla. +# +# Se arregla acá y no en el cmdline: un getty sobre tty1 no depende del cmdline (en metal siempre hay +# VT) y no obliga a re-sellar el kernel. El getty de `console` se conserva para debug por serie. +echo "==> añadiendo getty en tty1 (el prompt de `console` va al SERIAL, invisible en metal)" +cat > "$MERGED/usr/bin/console-login" <<'LOGIN' +#!/bin/sh +# arje-zero lanza los getty con envp VACÍO ⇒ sin PATH no se resuelve ni `cat` ni `cosmic-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"] = "01HQAR53D4M2NBV8KZTYXFQA04" +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` antes del heredoc para ROMPER EL HARDLINK: `cat >` escribiría el inodo COMPARTIDO con +# work/metal-rootfs y le cambiaría el motd a todas las demás imágenes. +rm -f "$MERGED/etc/motd" +cat > "$MERGED/etc/motd" <<'MOTD' + + #-- hammer :: escritorio COSMIC (metal, Intel i915 + iris HW) --------------- + GL por HARDWARE (iris). Es la diferencia con la imagen de KDE, y el motivo + de este viaje: en QEMU mesa era software y ScreenCast no podía exportar + dmabuf. + + Arrancar el escritorio: cosmic-start + Probar el portal: portal-probe version + portal-probe screencast <-- LO QUE VINIMOS A VER + GPU detectada: ls /dev/dri ; dmesg | grep -iE 'i915|drm' + Logs si algo falla: /tmp/cosmic-session.log /tmp/pipewire.log + --------------------------------------------------------------------------- + +MOTD + +mkdir -p "$MERGED/root/.config" "$MERGED/root/.cache" "$MERGED/run/user/0" "$MERGED/tmp" +chmod 1777 "$MERGED/tmp" + +echo "==> rootfs fundido: $(du -sh "$MERGED" | cut -f1)" +need_mb=$(du -sm "$MERGED" | cut -f1) +ROOT_SIZE="${ROOT_SIZE:-$(( need_mb + 1536 ))}" +echo "==> ROOT_SIZE=${ROOT_SIZE} MiB · kernel: $(basename "$(dirname "$(dirname "$KERNEL")")")" + +export ROOTFS="$MERGED" IMG ROOT_SIZE KERNEL +export ESP_MB="${ESP_MB:-160}" STORE_SIZE="${STORE_SIZE:-512}" STATE_SIZE="${STATE_SIZE:-768}" +exec ./scripts/install-image-efi.sh