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 1389Shell 137Markdown 80Rust 802559 Definitions

⎇ 02cc25542d0dcfcb878e40db57546b374a02d175 scripts/kde/run-qemu-desktop.sh Shell · 81 lines · 4.1 KB History raw

audio: ALSA encendido en el kernel — y el muro real es libudev-zero, no el stack de audio 8c3bd323d · sergio ·

1#!/usr/bin/env bash
2# run-qemu-desktop.sh — arranca la imagen KDE en QEMU (virtio-gpu + software GL) de forma REPRODUCIBLE.
3# Antes era un comando ad-hoc. Por defecto headless (DISPLAY=none) para diagnóstico por serial sin
4# interferir con la sesión mirada del laptop; DISP=gtk para ver la ventana (necesita DISPLAY=:0 Xwayland,
5# y cada restart de mirada mata la ventana).
6#
7#   scripts/kde/run-qemu-desktop.sh              # headless, serial → work/qemu-desktop-serial.log
8#   DISP=gtk scripts/kde/run-qemu-desktop.sh     # ventana gráfica (virtio-gpu por gtk)
9#   TIMEOUT=90 scripts/kde/run-qemu-desktop.sh   # mata QEMU a los 90s (diagnóstico automático)
10set -euo pipefail
11ROOT="$(cd "$(dirname "$0")/../.." && pwd)"; cd "$ROOT"
12
13IMG="${IMG:-work/hammer-kde-qemu.img}"
14SERIAL="${SERIAL:-work/qemu-desktop-serial.log}"
15OVMF_CODE="${OVMF_CODE:-/usr/share/edk2/x64/OVMF_CODE.4m.fd}"
16OVMF_VARS_SRC="${OVMF_VARS_SRC:-/usr/share/edk2/x64/OVMF_VARS.4m.fd}"
17VARS="${VARS:-work/qemu-desktop-OVMF_VARS.fd}"
18DISP="${DISP:-none}"
19MEM="${MEM:-4G}"
20SMP="${SMP:-4}"
21
22[ -r "$IMG" ] || { echo "falta $IMG — corré scripts/kde/qemu-desktop-image.sh" >&2; exit 1; }
23[ -r "$OVMF_CODE" ] || { echo "falta OVMF_CODE ($OVMF_CODE)" >&2; exit 1; }
24# copia escribible de las VARS (pflash necesita rw; la del sistema es read-only)
25[ -r "$VARS" ] || cp "$OVMF_VARS_SRC" "$VARS"
26
27case "$DISP" in
28  gtk) DISPLAY_ARGS=(-display gtk -device virtio-gpu-pci) ;;
29  none) DISPLAY_ARGS=(-display none -device virtio-gpu-pci) ;;
30  *) DISPLAY_ARGS=(-display "$DISP" -device virtio-gpu-pci) ;;
31esac
32
33# serial nuevo cada corrida (el diagnóstico depende de que no se mezcle con boots viejos)
34: > "$SERIAL"
35
36QEMU_ARGS=(
37  -machine q35 -accel kvm -cpu host
38  -m "$MEM" -smp "$SMP"
39  -vga none    # virtio-gpu-pci (abajo) es el ÚNICO display: sin esto QEMU añade una VGA estándar por
40               # defecto y OVMF pinta el GOP ahí ⇒ simpledrm (card1) muestra el framebuffer EFI y kwin
41               # pinta en virtio-gpu (card0, otro device que no se ve) ⇒ pantalla congelada en TianoCore.
42               # Con -vga none, OVMF usa virtio-gpu ⇒ virtio-gpu-DRM expulsa simpledrm ⇒ un solo output.
43  -drive if=pflash,format=raw,unit=0,file="$OVMF_CODE",readonly=on
44  -drive if=pflash,format=raw,unit=1,file="$VARS"
45  -drive file="$IMG",format=raw,if=virtio
46  "${DISPLAY_ARGS[@]}"
47  -serial "file:$SERIAL"
48  -monitor "unix:${MON:-work/qemu-monitor.sock},server,nowait"
49  -no-reboot
50)
51
52# AUDIO=1 (default): darle a la VM una tarjeta de sonido EMULADA. No es para oír nada —el backend es
53# `none`, que descarta las muestras— sino para que HAYA UN DISPOSITIVO QUE ENUMERAR.
54#
55# Sin esto, `wpctl status` sale con «Devices:» vacío y un único sink `auto_null`, y ese resultado es
56# AMBIGUO: se lee igual si wireplumber funciona sobre una VM sin hardware que si wireplumber no
57# funciona. Con una ich9-intel-hda emulada, el árbol de /sys/class/sound existe y la respuesta
58# distingue las dos cosas. AUDIO=0 para volver al caso sin tarjeta.
59if [ "${AUDIO:-1}" = 1 ]; then
60  QEMU_ARGS+=(-audiodev none,id=snd0 -device ich9-intel-hda -device hda-duplex,audiodev=snd0)
61fi
62
63# NET=none (default): SIN tarjeta de red. No es sólo ahorro — QEMU añade una e1000 por defecto, y OVMF
64# la usa para crear entradas de arranque PXE/HTTP (IPv4 e IPv6). Cuando la entrada de disco que OVMF
65# tenía cacheada en sus VARS deja de coincidir —y basta AGREGAR UN DISPOSITIVO PCI, como la tarjeta de
66# sonido de arriba, para que las rutas se corran— la firmware cae al orden por defecto y se pasa un
67# par de minutos en timeouts de PXE antes de llegar al disco. Con un TIMEOUT corto eso se ve como
68# «la VM no arrancó», y el serial sólo muestra `PXE-E16: No valid offer received`. Pasó de verdad.
69# Este escritorio no necesita red; `NET=user` si algún día hace falta.
70if [ "${NET:-none}" = none ]; then
71  QEMU_ARGS+=(-nic none)
72fi
73
74echo "==> QEMU (DISP=$DISP, serial=$SERIAL)"
75echo "    imagen: $IMG"
76if [ -n "${TIMEOUT:-}" ]; then
77  echo "    TIMEOUT=${TIMEOUT}s (auto-kill)"
78  exec timeout --signal=KILL "${TIMEOUT}" qemu-system-x86_64 "${QEMU_ARGS[@]}"
79else
80  exec qemu-system-x86_64 "${QEMU_ARGS[@]}"
81fi