gioser

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 1471Shell 173Rust 105Markdown 943545 Definitions

⎇ 746d2dedd17905b67f8977018d27615e38c70ded scripts/kde/metal-desktop-image-dual.sh Shell · 97 lines · 5.2 KB History raw

kde/metal: andamiaje escritorio dual-GPU (Intel i915 + NVIDIA nouveau) por software 746d2dedd · sergio ·

1#!/usr/bin/env bash
2# metal-desktop-image-dual.sh — imagen de disco EFI KDE para METAL que aguanta DOS GPUs (Intel i915 y
3# NVIDIA Pascal/nouveau) con render por SOFTWARE (mesa-llvmpipe soberano). USB "live" que se adapta a la
4# máquina donde se bootee. Ver [[kde-metal-qemu-desktop]] y el runbook docs/runbooks/kde-qemu-desktop.md.
5#
6# Por qué software y no iris/nouveau HW: el mesa hammer-built es swrast/llvmpipe; una mesa HW con nouveau
7# hoy sólo existe como binario Alpine (rompe soberanía). llvmpipe sobre el KMS del kernel (i915 O nouveau)
8# funciona idéntico en ambas máquinas y reusa los fixes ya validados. HW-accel = iteración siguiente.
9#
10#   work/metal-rootfs        base: arje-zero PID1 + busybox + firmware i915 (static ⇒ hay que inyectar musl)
11#   work/kde-metal-rootfs    KDE runtime-completo (Qt/KF6/Plasma/apps)
12#   + store/*-mesa-llvmpipe  swrast/llvmpipe (software GL) + libLLVM.18
13#   + firmware nvidia/gp106  de work/mirada-rootfs (nouveau necesita el blob firmado para modeset en Pascal)
14#   + kernel linux-generic   (i915 + nouveau + radeon builtin) ← NO linux-metal (ese apaga nouveau)
15#   → work/hammer-kde-metal-dual.img
16#
17# Uso:  scripts/kde/metal-desktop-image-dual.sh
18#       BOOT=1 scripts/kde/metal-desktop-image-dual.sh   # + arranca en OVMF para validar el boot chain
19set -euo pipefail
20ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
21
22BASE="${BASE:-work/metal-rootfs}"
23KDE="${KDE:-work/kde-metal-rootfs}"
24MESA="${MESA:-$(ls -dt store/*-mesa-llvmpipe 2>/dev/null | head -1)}"
25LLVM="${LLVM:-$(ls -dt store/*-llvm18 2>/dev/null | head -1)}"
26KERNEL="${KERNEL:-$(ls -dt store/*-linux-generic/boot/bzImage 2>/dev/null | head -1)}"
27NVFW_SRC="${NVFW_SRC:-work/mirada-rootfs/lib/firmware/nvidia}"
28MERGED="${MERGED:-work/metal-desktop-dual-rootfs}"
29IMG="${IMG:-work/hammer-kde-metal-dual.img}"
30
31for x in "$BASE" "$KDE"; do [ -d "$x" ] || { echo "falta $x" >&2; exit 1; }; done
32[ -n "$MESA" ] && [ -d "$MESA" ] || { echo "falta mesa-llvmpipe en store/" >&2; exit 1; }
33[ -n "$LLVM" ] && [ -d "$LLVM" ] || { echo "falta llvm18 en store/" >&2; exit 1; }
34[ -n "$KERNEL" ] && [ -r "$KERNEL" ] || { echo "falta kernel linux-generic (build recipes/linux-generic.toml)" >&2; exit 1; }
35
36echo "==> fundiendo rootfs por hardlinks (base metal + KDE)"
37rm -rf "$MERGED"
38cp -al "$BASE" "$MERGED"
39cp -al --remove-destination "$KDE"/. "$MERGED"/
40
41echo "==> inyectando mesa-llvmpipe (software GL) desde $MESA"
42cp -a "$MESA"/usr/lib/dri/. "$MERGED"/usr/lib/dri/ 2>/dev/null || true
43for so in libglapi libgbm libEGL libGLESv2 libgallium; do
44  cp -a "$MESA"/usr/lib/$so* "$MERGED"/usr/lib/ 2>/dev/null || true
45done
46ls "$MERGED"/usr/lib/dri/*swrast* >/dev/null 2>&1 || { echo "   ✗ swrast no entró" >&2; exit 1; }
47
48echo "==> inyectando libLLVM.18 + libgcc_s + libstdc++ (llvmpipe JIT los NEEDea)"
49cp -a "$LLVM"/usr/lib/libLLVM.so.18.1 "$MERGED"/usr/lib/
50ln -sf libLLVM.so.18.1 "$MERGED"/usr/lib/libLLVM.so.18
51ln -sf libLLVM.so.18.1 "$MERGED"/usr/lib/libLLVM.so
52GCCS="${GCCS:-.dev-fs/alpine/usr/lib/libgcc_s.so.1}"; [ -r "$GCCS" ] && cp -a "$GCCS" "$MERGED"/usr/lib/ || echo "   ⚠ sin libgcc_s"
53STDCXX="${STDCXX:-.dev-fs/alpine/usr/lib/libstdc++.so.6}"; [ -r "$STDCXX" ] && cp -a "$STDCXX"* "$MERGED"/usr/lib/ 2>/dev/null || echo "   ⚠ sin libstdc++"
54
55echo "==> inyectando musl (loader + libc) — los binarios KDE son dinámicos, la base metal es estática"
56MUSL="${MUSL:-/usr/lib/musl/lib/libc.so}"
57[ -r "$MUSL" ] || { echo "no encuentro musl libc ($MUSL)" >&2; exit 1; }
58mkdir -p "$MERGED/usr/lib/musl/lib" "$MERGED/lib"
59cp -a "$MUSL" "$MERGED/usr/lib/musl/lib/libc.so"
60ln -sf /usr/lib/musl/lib/libc.so "$MERGED/lib/ld-musl-x86_64.so.1"
61ln -sf /usr/lib/musl/lib/libc.so "$MERGED/usr/lib/libc.so"
62
63echo "==> inyectando firmware NVIDIA gp106 (nouveau lo exige para modeset en Pascal; i915 ya está en la base)"
64if [ -d "$NVFW_SRC" ]; then
65  mkdir -p "$MERGED/lib/firmware/nvidia"
66  cp -a "$NVFW_SRC"/. "$MERGED/lib/firmware/nvidia/"
67  echo "   ✓ nvidia fw: $(ls "$MERGED/lib/firmware/nvidia" | tr '\n' ' ')"
68else
69  echo "   ⚠ sin $NVFW_SRC — la rama NVIDIA no hará modeset (Intel sí)"
70fi
71
72echo "==> instalando /usr/bin/plasma-start (metal software-GL, lanzamiento manual)"
73install -Dm755 scripts/kde/plasma-start-metal-sw.sh "$MERGED/usr/bin/plasma-start"
74
75cat > "$MERGED/etc/motd" <<'MOTD'
76
77  #-- hammer :: escritorio KDE Plasma 6 (metal, dual-GPU software) ------------
78   Render por software (llvmpipe soberano) sobre i915 (Intel) o nouveau (NVIDIA).
79
80   Arrancar el escritorio:   plasma-start
81   Logs si algo falla:       /tmp/kwin.log  /tmp/plasmashell.log
82   Ver GPU detectada:        ls /dev/dri ; dmesg | grep -iE 'i915|nouveau|drm'
83  ---------------------------------------------------------------------------
84
85MOTD
86
87mkdir -p "$MERGED/root/.config" "$MERGED/root/.cache" "$MERGED/run/user/0" "$MERGED/tmp"
88chmod 1777 "$MERGED/tmp"
89
90echo "==> rootfs fundido: $(du -sh "$MERGED" | cut -f1)"
91need_mb=$(du -sm "$MERGED" | cut -f1)
92ROOT_SIZE="${ROOT_SIZE:-$(( need_mb + 1536 ))}"
93echo "==> ROOT_SIZE=${ROOT_SIZE} MiB · kernel: $(basename "$(dirname "$(dirname "$KERNEL")")")"
94
95export ROOTFS="$MERGED" IMG ROOT_SIZE KERNEL
96export ESP_MB="${ESP_MB:-160}" STORE_SIZE="${STORE_SIZE:-512}" STATE_SIZE="${STATE_SIZE:-768}"
97exec ./scripts/install-image-efi.sh