#!/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"/ 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