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 1181Shell 82Rust 62Markdown 521515 Definiciones

⎇ main scripts/wlr/qemu-sway-image.sh Shell · 92 líneas · 4.5 KB Historia crudo

sway ARRANCA EN QEMU con pantalla — evidencia, y seis muros que el grafo no podía ver e3403ff20 · sergio ·

1#!/bin/sh
2# qemu-sway-image.sh — imagen QEMU del perfil escritorio-sway. Hermano de
3# scripts/cosmic/qemu-desktop-image.sh: MISMO andamiaje probado (base metal + cierre hidratado +
4# mesa-llvmpipe + musl), sin las piezas que COSMIC necesita y sway no.
5#
6# QUÉ SE CAE respecto del de COSMIC, y por qué:
7#   · arje-logind-compat — sway toma el DRM con `LIBSEAT_BACKEND=builtin` siendo root, así que no
8#     hace falta un proveedor de login1. Una pieza móvil menos.
9#   · dbus / messagebus / setuid helper — nada del entorno mínimo de sway lo pide.
10#   · catálogo AppStream — era para cosmic-store; acá no hay tienda.
11# Se conserva TODO lo que ya costó caro descubrir: la inyección de kms_swrast (en QEMU no hay GPU),
12# libLLVM.18 (llvmpipe lo JIT-linkea), el runtime C++ de Alpine (deuda conocida de la cadena de
13# mesa) y los DOS sonames de musl (zig-cc emite `libc.so`, el gcc de Alpine
14# `libc.musl-x86_64.so.1`: es la MISMA libc y sin el segundo symlink lo de gcc no carga).
15set -eu
16ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
17
18BASE="${BASE:-work/metal-rootfs}"
19SWAY="${SWAY:-work/sway-rootfs}"
20MESA="${MESA:-$(ls -dt store/*-mesa-llvmpipe 2>/dev/null | head -1)}"
21LLVM="${LLVM:-$(ls -dt store/*-llvm18 2>/dev/null | head -1)}"
22MERGED="${MERGED:-work/sway-qemu-rootfs}"
23IMG="${IMG:-work/hammer-sway-qemu.img}"
24
25[ -d "$BASE" ] || { echo "falta la base metal: $BASE" >&2; exit 1; }
26[ -d "$SWAY" ] || { echo "falta el cierre sway: $SWAY (correr el hydrate)" >&2; exit 1; }
27
28echo "==> fundiendo rootfs por hardlinks (base metal + cierre sway)"
29rm -rf "$MERGED"
30cp -al "$BASE" "$MERGED"
31cp -al --remove-destination "$SWAY"/. "$MERGED"/
32
33. "$ROOT/scripts/lib/pid1-desde-store.sh"
34inyectar_pid1 "$MERGED" "$BASE"
35
36echo "==> parcheando mesa software desde $(basename "$MESA")"
37mkdir -p "$MERGED"/usr/lib/dri
38cp -a --remove-destination "$MESA"/usr/lib/dri/. "$MERGED"/usr/lib/dri/ 2>/dev/null || true
39for so in libglapi libgbm libEGL libGLESv2 libGL libgallium; do
40  cp -a --remove-destination "$MESA"/usr/lib/$so* "$MERGED"/usr/lib/ 2>/dev/null || true
41done
42ls "$MERGED"/usr/lib/dri/*swrast* >/dev/null 2>&1 && echo "   ✓ kms_swrast instalado" || { echo "   ✗ swrast no entró" >&2; exit 1; }
43
44echo "==> inyectando libLLVM.18 (llvmpipe lo JIT-linkea)"
45[ -n "$LLVM" ] && [ -d "$LLVM" ] || { echo "   ✗ falta llvm18 en store/" >&2; exit 1; }
46cp -a --remove-destination "$LLVM"/usr/lib/libLLVM.so.18.1 "$MERGED"/usr/lib/
47ln -sf libLLVM.so.18.1 "$MERGED"/usr/lib/libLLVM.so.18
48ln -sf libLLVM.so.18.1 "$MERGED"/usr/lib/libLLVM.so
49
50echo "==> runtime C++ de Alpine (deuda conocida de la cadena de mesa)"
51for lib in libgcc_s.so.1 libstdc++.so.6; do
52  src=".dev-fs/alpine/usr/lib/$lib"
53  [ -r "$src" ] && cp -a --remove-destination "$src"* "$MERGED"/usr/lib/ 2>/dev/null || echo "   ⚠ sin $lib"
54done
55
56echo "==> musl y los DOS sonames"
57MUSL="${MUSL:-/usr/lib/musl/lib/libc.so}"
58[ -r "$MUSL" ] || { echo "no encuentro musl libc ($MUSL)" >&2; exit 1; }
59mkdir -p "$MERGED/usr/lib/musl/lib" "$MERGED/lib"
60cp -a --remove-destination "$MUSL" "$MERGED/usr/lib/musl/lib/libc.so"
61ln -sf /usr/lib/musl/lib/libc.so "$MERGED/lib/ld-musl-x86_64.so.1"
62ln -sf /usr/lib/musl/lib/libc.so "$MERGED/usr/lib/libc.so"
63
64echo "==> grupo video (wlroots abre /dev/dri)"
65grep -q '^video:' "$MERGED/etc/group" 2>/dev/null || { { cat "$MERGED/etc/group"; echo "video:x:44:"; } > "$MERGED/etc/group.new"; chmod 644 "$MERGED/etc/group.new"; mv "$MERGED/etc/group.new" "$MERGED/etc/group"; }
66
67echo "==> instalando /usr/bin/sway-start y la config"
68install -Dm755 scripts/wlr/sway-start.sh "$MERGED/usr/bin/sway-start"
69install -Dm644 scripts/wlr/sway-config "$MERGED/etc/sway/config"
70
71echo "==> auto-lanzar sway: console-getty ejecuta sway-start (no /bin/sh)"
72python3 - "$MERGED/ente/seed.card.json" <<'PY'
73import json, sys, os
74p = sys.argv[1]; c = json.load(open(p))
75for g in c.get("genesis", []):
76    if g.get("label") == "console-getty":
77        argv = g["payload"]["Native"]["argv"]
78        argv[:] = [("/usr/bin/sway-start" if a == "/bin/sh" else a) for a in argv]
79        print("  console-getty argv →", argv)
80tmp = p + ".new"
81json.dump(c, open(tmp, "w"), indent=2); os.chmod(tmp, 0o644); os.replace(tmp, p)
82PY
83
84ln -sfn /run "$MERGED/var/run"
85mkdir -p "$MERGED/root/.config" "$MERGED/run/user/0" "$MERGED/tmp" "$MERGED/var/log"
86
87echo "==> rootfs fundido: $(du -sh "$MERGED" | cut -f1)"
88need_mb=$(du -sm "$MERGED" | cut -f1)
89ROOT_SIZE="${ROOT_SIZE:-$(( need_mb + 1536 ))}"
90export ROOTFS="$MERGED" IMG ROOT_SIZE
91export ESP_MB="${ESP_MB:-128}" STORE_SIZE="${STORE_SIZE:-512}" STATE_SIZE="${STATE_SIZE:-768}"
92exec ./scripts/install-image-efi.sh