Files
hammer/scripts/kde/metal-desktop-image.sh
sergioandClaude Opus 5 84e088fd13 imágenes: PID1 sale del artefacto sellado, no del directorio base congelado
Las 4 imágenes de escritorio (GNOME + los 3 de KDE: qemu, metal, dual) fundían `work/metal-rootfs`
por hardlinks y se llevaban SU arje-zero, que era del 2026-06-19: ese directorio se armó a mano en
la campaña de metal y nadie lo regeneraba al re-sellar la receta. Resultado: todas arrancaban con un
PID1 de hace mes y medio, en silencio.

No es hipotético — se comió un fix real. El `identity mismatch` del bus del fractal estaba arreglado
río arriba y la VM seguía imprimiendo el mensaje viejo porque el binario de la imagen no venía de la
receta (ver el comentario de recipes/arje-zero.toml).

El síntoma engaña porque el directorio base es LEGÍTIMO para todo lo demás —busybox, firmware, el
kernel EFI-stub, la estructura de /etc—: sólo la pieza que TAMBIÉN es receta se queda atrás, y justo
esa es PID1. La regla que queda escrita en el helper: si algo del rootfs tiene receta, la imagen lo
toma del artefacto sellado, no de la copia congelada.

El helper va en scripts/lib/ y no inline ×4 a propósito: el porqué es largo y vale una sola copia.
Elige el artefacto por `hammer hash` (el de la receta de HOY, no el más nuevo por fecha, que miente
en cuanto conviven dos) y ABORTA si falta, porque seguir con el PID1 congelado es exactamente el
modo de falla que cierra.

Probado: las 4 pasan `bash -n` y la imagen GNOME lo ejecuta bien sourceado (`✓ e570c1482432 (el de
work/metal-rootfs era de 2026-06-19)`), con la VM ya validada booteando ese PID1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 19:52:00 -04:00

69 lines
3.4 KiB
Bash
Executable File

#!/usr/bin/env bash
# metal-desktop-image.sh — arma la IMAGEN DE DISCO EFI con el escritorio KDE completo, para METAL.
#
# Funde dos rootfs y delega el particionado en scripts/install-image-efi.sh (ADR 0010 paso 5: EFI-stub
# soberano, initrd chico de pivote → switch_root a la ext4 real ⇒ el sistema NO vive en RAM, que es lo que
# hace inviable el camino de metal-usb-sdboot.sh con un escritorio de ~7 GB).
#
# work/metal-rootfs base metal: arje-zero PID1 + busybox + firmware (i915 tgl_* + iwlwifi AX201)
# work/kde-metal-rootfs KDE hidratado del store sellado (206 pkgs, cierre runtime completo)
# → work/metal-desktop-rootfs (hardlinks, NO copia: no muta ninguno de los dos)
# → work/hammer-kde-metal.img GPT: ESP(bzImage EFI-stub + initrd pivote) + ext4 / + /store + /var/lib/hammer
#
# Uso: scripts/kde/metal-desktop-image.sh
# BOOT=1 KVM=1 scripts/kde/metal-desktop-image.sh # + arranca en OVMF para validar antes de quemar
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
BASE="${BASE:-work/metal-rootfs}"
KDE="${KDE:-work/kde-metal-rootfs}"
MERGED="${MERGED:-work/metal-desktop-rootfs}"
IMG="${IMG:-work/hammer-kde-metal.img}"
[ -d "$BASE" ] || { echo "falta $BASE (scripts/metal-iso.sh lo arma)" >&2; exit 1; }
[ -d "$KDE" ] || { echo "falta $KDE (hidratá con scripts/kde/hydrate-recipes.py en el worker y bajalo)" >&2; exit 1; }
echo "==> fundiendo rootfs por hardlinks (no muta los originales)"
# Los dos árboles son COMPLEMENTARIOS, no rivales:
# base → musl libc + loader + busybox + arje-zero + firmware (el "sustrato soberano")
# KDE → Qt/KF6/Plasma/apps (complete-closure.sh NO hidrata la libc:
# "los sonames del sustrato base los provee la base del sistema destino")
# Se pone la base primero y KDE encima; en los pocos nombres que coincidan gana KDE.
rm -rf "$MERGED"
cp -al "$BASE" "$MERGED"
cp -al --remove-destination "$KDE"/. "$MERGED"/
. "$ROOT/scripts/lib/pid1-desde-store.sh"
inyectar_pid1 "$MERGED" "$BASE"
echo "==> instalando /usr/bin/plasma-start"
install -Dm755 scripts/kde/plasma-start-metal.sh "$MERGED/usr/bin/plasma-start"
# El escritorio necesita estos dirs runtime; el rootfs es de sólo-lectura hasta que switch_root monta la ext4.
mkdir -p "$MERGED/root/.config" "$MERGED/root/.cache" "$MERGED/run/user/0" "$MERGED/tmp"
chmod 1777 "$MERGED/tmp"
# motd: que el usuario sepa qué correr al llegar al shell.
cat > "$MERGED/etc/motd" <<'MOTD'
#-- hammer :: escritorio KDE Plasma 6 (metal) ------------------------------
Todo construido desde fuente con hammer (musl + zig-cc), sin binarios ajenos.
Arrancar el escritorio: plasma-start
Logs si algo falla: /tmp/kwin.log /tmp/plasmashell.log
Diagnóstico GPU: dmesg | grep -iE 'i915|drm'
---------------------------------------------------------------------------
MOTD
echo "==> rootfs fundido: $(du -sh "$MERGED" | cut -f1) ($(find "$MERGED" -name '*.so*' | wc -l) .so, $(ls "$MERGED"/usr/bin | wc -l) bins)"
# La ext4 de / debe entrar el rootfs + holgura. Se calcula del tamaño real y se redondea hacia arriba.
need_mb=$(du -sm "$MERGED" | cut -f1)
ROOT_SIZE="${ROOT_SIZE:-$(( need_mb + 1536 ))}"
echo "==> ROOT_SIZE=${ROOT_SIZE} MiB (rootfs ${need_mb} MiB + holgura)"
export ROOTFS="$MERGED" IMG ROOT_SIZE
export ESP_MB="${ESP_MB:-128}" STORE_SIZE="${STORE_SIZE:-512}" STATE_SIZE="${STATE_SIZE:-768}"
exec ./scripts/install-image-efi.sh