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 1572Shell 203Rust 109Markdown 993728 Sutichaykuna

⎇ main scripts/kde/run-qemu-desktop.sh Shell · 87 siq'ikuna · 4.4 KB Ñawpa willay ch'uya

qemu: ACCEL/CPU parametrizables, con caída automática a TCG 698ca1da5 · 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
36# ACCEL/CPU parametrizables: sin /dev/kvm (p.ej. un vServer sin virtualizacion anidada) hay que
37# caer a TCG, y ahi `-cpu host` no existe. ACCEL=tcg CPU=max para emulacion pura.
38ACCEL="${ACCEL:-kvm}"; CPU="${CPU:-host}"
39if [ ! -w /dev/kvm ] && [ "$ACCEL" = kvm ]; then
40  echo "sin /dev/kvm: cayendo a TCG (emulacion pura, lento)" >&2; ACCEL=tcg; CPU=max
41fi
42QEMU_ARGS=(
43  -machine q35 -accel "$ACCEL" -cpu "$CPU"
44  -m "$MEM" -smp "$SMP"
45  -vga none    # virtio-gpu-pci (abajo) es el ÚNICO display: sin esto QEMU añade una VGA estándar por
46               # defecto y OVMF pinta el GOP ahí ⇒ simpledrm (card1) muestra el framebuffer EFI y kwin
47               # pinta en virtio-gpu (card0, otro device que no se ve) ⇒ pantalla congelada en TianoCore.
48               # Con -vga none, OVMF usa virtio-gpu ⇒ virtio-gpu-DRM expulsa simpledrm ⇒ un solo output.
49  -drive if=pflash,format=raw,unit=0,file="$OVMF_CODE",readonly=on
50  -drive if=pflash,format=raw,unit=1,file="$VARS"
51  -drive file="$IMG",format=raw,if=virtio
52  "${DISPLAY_ARGS[@]}"
53  -serial "file:$SERIAL"
54  -monitor "unix:${MON:-work/qemu-monitor.sock},server,nowait"
55  -no-reboot
56)
57
58# AUDIO=1 (default): darle a la VM una tarjeta de sonido EMULADA. No es para oír nada —el backend es
59# `none`, que descarta las muestras— sino para que HAYA UN DISPOSITIVO QUE ENUMERAR.
60#
61# Sin esto, `wpctl status` sale con «Devices:» vacío y un único sink `auto_null`, y ese resultado es
62# AMBIGUO: se lee igual si wireplumber funciona sobre una VM sin hardware que si wireplumber no
63# funciona. Con una ich9-intel-hda emulada, el árbol de /sys/class/sound existe y la respuesta
64# distingue las dos cosas. AUDIO=0 para volver al caso sin tarjeta.
65if [ "${AUDIO:-1}" = 1 ]; then
66  QEMU_ARGS+=(-audiodev none,id=snd0 -device ich9-intel-hda -device hda-duplex,audiodev=snd0)
67fi
68
69# NET=none (default): SIN tarjeta de red. No es sólo ahorro — QEMU añade una e1000 por defecto, y OVMF
70# la usa para crear entradas de arranque PXE/HTTP (IPv4 e IPv6). Cuando la entrada de disco que OVMF
71# tenía cacheada en sus VARS deja de coincidir —y basta AGREGAR UN DISPOSITIVO PCI, como la tarjeta de
72# sonido de arriba, para que las rutas se corran— la firmware cae al orden por defecto y se pasa un
73# par de minutos en timeouts de PXE antes de llegar al disco. Con un TIMEOUT corto eso se ve como
74# «la VM no arrancó», y el serial sólo muestra `PXE-E16: No valid offer received`. Pasó de verdad.
75# Este escritorio no necesita red; `NET=user` si algún día hace falta.
76if [ "${NET:-none}" = none ]; then
77  QEMU_ARGS+=(-nic none)
78fi
79
80echo "==> QEMU (DISP=$DISP, serial=$SERIAL)"
81echo "    imagen: $IMG"
82if [ -n "${TIMEOUT:-}" ]; then
83  echo "    TIMEOUT=${TIMEOUT}s (auto-kill)"
84  exec timeout --signal=KILL "${TIMEOUT}" qemu-system-x86_64 "${QEMU_ARGS[@]}"
85else
86  exec qemu-system-x86_64 "${QEMU_ARGS[@]}"
87fi