From 723f3ead331eb2799c27053a8e92f8a85bfd9dee Mon Sep 17 00:00:00 2001 From: sergio Date: Wed, 29 Jul 2026 18:05:20 -0400 Subject: [PATCH] =?UTF-8?q?gnome:=20=F0=9F=8F=94=F0=9F=8F=94=20EL=20ESCRIT?= =?UTF-8?q?ORIO=20PINTA=20=E2=80=94=20Overview=20de=20GNOME=20desde=20fuen?= =?UTF-8?q?te,=20con=20captura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit docs/evidencia/gnome-shell-qemu-2026-07-29.png: el conmutador de espacios de trabajo, el reloj en el panel, la miniatura del escritorio, el dash, y la notificación estándar de GNOME por sesión de root. Todo construido desde fuente sobre el kernel de hammer, arje-zero como PID1 y musl. **EL MURO NO ERA DE KMS.** El diagnóstico anterior culpaba al plano primario de virtio-gpu («no advertised formats», sólo `Queue mode set`, ningún page flip). Era correlación. Se probó quitando MUTTER_DEBUG_FORCE_KMS_MODE=simple —el log pasó a decir `using atomic mode setting`, o sea que el cambio SÍ tomó efecto— y la pantalla siguió con exactamente 2 colores. Refutada. Mutter no tenía un frame que presentar; no es que no supiera presentarlo. La causa estaba en el stack trace, en el log, desde el principio: la excepción por el gschema `org.gnome.settings-daemon.peripherals.touchscreen` ocurre DENTRO de `Main.start()`, construyendo los quick settings ⇒ el panel nunca se arma. Proceso vivo, compositor con DRM master, nada que pintar. Receta `gsd-schemas`: los gschemas de gnome-settings-daemon SIN g-s-d, que sigue aparcada por GTK3/X11. **Tercera vez que aparece la misma lección** (tras la política D-Bus de login1 y el `org.gnome.login-screen` de libgdm): un gschema no es un fichero de datos del demonio, es una interfaz publicada que consume otro programa. Dos trampas de diagnóstico, las dos ahora blindadas: - **`glib-compile-schemas` sale con 0 aunque RECHACE un esquema.** Instalé los once XML, el log dijo `esquemas OK` y el shell seguía diciendo `not found`: faltaba `org.gnome.settings-daemon.enums.xml`, que meson genera con glib-mkenums y no es uno de los `.in`. Sin los ``, glib descarta el esquema entero, avisa por stderr y sigue. `gnome-start` ahora vuelca ese stderr SIEMPRE, no sólo al fallar. - El log serial persiste entre arranques y me hizo leer dos veces un `STATUS +30s` de una VM ya muerta. Truncarlo antes de arrancar; `Failed to get "write" lock` avisa de que hay otro QEMU con el disco tomado. Y queda escrito cómo validar CON PANTALLA sin humano delante: screendump por el monitor de QEMU, con una métrica barata previa a mirar — contar colores distintos. Negro = 2; pintando = 582, con el azul GNOME (2,60,136) al frente. Lo que falta son detalles, ninguno impide el escritorio: lanzar upowerd desde gnome-start, un tema de cursor, el setuid de colord y gnome-control-center. Co-Authored-By: Claude Opus 5 (1M context) --- .../evidencia/gnome-shell-qemu-2026-07-29.png | Bin 0 -> 21630 bytes docs/runbooks/gnome-qemu-desktop.md | 98 +++++++++++------- recipes/incoming-gnome/gsd-schemas.toml | 82 +++++++++++++++ scripts/gnome/gnome-start-qemu.sh | 29 +++++- scripts/gnome/hydrate-gnome.sh | 4 + scripts/gnome/qemu-desktop-image.sh | 7 ++ 6 files changed, 179 insertions(+), 41 deletions(-) create mode 100644 docs/evidencia/gnome-shell-qemu-2026-07-29.png create mode 100644 recipes/incoming-gnome/gsd-schemas.toml diff --git a/docs/evidencia/gnome-shell-qemu-2026-07-29.png b/docs/evidencia/gnome-shell-qemu-2026-07-29.png new file mode 100644 index 0000000000000000000000000000000000000000..30e05aa41ad7d726f5400c333d7764dc4de02076 GIT binary patch literal 21630 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 Zg;Ty-@J{t~0+mEAoV|P|OUL@r{{XSA7n}e9 literal 0 HcmV?d00001 diff --git a/docs/runbooks/gnome-qemu-desktop.md b/docs/runbooks/gnome-qemu-desktop.md index 57bdf0ee..734811d8 100644 --- a/docs/runbooks/gnome-qemu-desktop.md +++ b/docs/runbooks/gnome-qemu-desktop.md @@ -1,20 +1,16 @@ -# Runbook — arrancar gnome-shell en QEMU (y dónde está el muro hoy) +# Runbook — GNOME en QEMU: el escritorio PINTA -Estado al 2026-07-29: **el compositor SUBE ENTERO sobre DRM real.** gnome-shell toma el DRM master -y los tres dispositivos de input por logind, realiza el stage `MetaStageNative`, asigna los planos -primario y de cursor, y expone `wayland-0`: +Estado al 2026-07-29: **cerrado.** gnome-shell arranca desde fuente sobre el kernel de hammer, toma +el DRM master y los tres dispositivos de input por logind, expone `wayland-0`, y **dibuja el Overview +de GNOME**. Cinco muros caídos, cada uno por medición y no por conjetura: -``` -BACKEND: Opening and taking control of device file '/dev/input/event0' ← y event2, y event1 -BACKEND: Realizing stage 'MetaStageNative' -KMS: Plane 33 … primary for CRTC 37 · Plane 34 … cursor -Using Wayland display name 'wayland-0' -== gnome-qemu :: compositor OK (wayland-0) — el shell ES el display server -``` - -**Y la capa JS también está cerrada**: gnome-shell corre cinco minutos seguidos sin una sola -`JS ERROR`. Lo que falta es que PINTE — la pantalla sigue en negro. Ni cuelgues ni SIGSEGV: los -cuatro muros anteriores están cerrados, cada uno por medición y no por conjetura. +| muro | causa real | cómo se midió | +|---|---|---| +| SIGSEGV en `get_seat_proxy` | object path de la Session mal escapado (`_1` en vez de `_31`) | el cliente calcula el path solo y no pregunta | +| cuelgue de la hebra de input | el fd de `TakeDevice` sin `O_NONBLOCK` | `wchan=evdev_read` en `/proc`, no el core | +| `Requiring ` en bucle | 7 typelibs de runtime + 2 capas más abajo | `js/misc/dependencies.js` + cierre de `` | +| pantalla negra | `Main.start()` abortaba por un gschema de g-s-d | el stack trace, que estaba en el log desde el principio | +| (descartado) KMS legacy | NO era la causa | atomic tomó efecto y la pantalla siguió con 2 colores | Hermano de [`kde-qemu-desktop.md`](kde-qemu-desktop.md), del que reusa el andamiaje: la base `work/metal-rootfs`, la inyección de mesa-llvmpipe/LLVM/musl, el truco del console-getty y el propio @@ -48,43 +44,69 @@ gdb -batch -q -ex "set sysroot $PWD/work/gnome-qemu-rootfs" \ -ex "core-file /tmp/core.gnome-shell" -ex "bt 25" work/gnome-qemu-rootfs/usr/bin/gnome-shell ``` -## EL MURO DE HOY — la sesión VIVE pero la pantalla está NEGRA +## 🏔 GNOME PINTA (2026-07-29) -``` -== gnome-qemu :: compositor OK (wayland-0) — el shell ES el display server -== gnome-qemu :: STATUS +15s … +315s: gnome-shell=2 ← cinco minutos, sin una sola JS ERROR -``` +![gnome-shell en QEMU](../evidencia/gnome-shell-qemu-2026-07-29.png) -La capa JS está cerrada: gnome-shell arranca entero y se queda corriendo. Pero la captura del -framebuffer (`screendump` por el monitor de QEMU) muestra **la consola del kernel, en negro** — el -último `[ 0.813456] arje-zero:` del boot. O sea que mutter nunca presentó un frame al CRTC. +El Overview de GNOME Shell, construido entero desde fuente sobre el kernel de hammer, arje-zero como +PID1 y musl: el conmutador de espacios de trabajo arriba a la izquierda, el reloj en el panel, la +miniatura del escritorio, el dash abajo, y la notificación estándar de GNOME por sesión de root +(«Logged in as a privileged user»). -**Validar con captura, no con serial.** Es la regla heredada de KDE ([[metal-dual-desktop-en-curso]]) -y acá se cumple sin humano delante: +**Cómo se validó, y es la parte reusable**: `screendump` por el monitor de QEMU, sin humano delante. ```sh printf 'screendump /tmp/gnome.ppm\n' | socat - UNIX-CONNECT:work/gnome-monitor.sock python3 -c "from PIL import Image; Image.open('/tmp/gnome.ppm').save('/tmp/gnome.png')" ``` -La pista está en el log de KMS, y es concreta: +Métrica barata para saber si pinta antes de mirar: **contar colores distintos**. Con la pantalla +negra eran **2** (negro + el gris de la consola del kernel); pintando son **582**, con el azul GNOME +`(2,60,136)` y los grises del shell `(34,34,38)` al frente. + +### El muro que parecía de KMS y era de GSettings + +El diagnóstico anterior de este runbook culpaba al KMS: «el plano primario de virtio-gpu no publica +formatos, sólo hay `Queue mode set` y ningún page flip». **Era una correlación, no la causa.** Se +probó quitando `MUTTER_DEBUG_FORCE_KMS_MODE=simple` —el log pasó a decir `using atomic mode setting`, +o sea que el cambio SÍ tomó efecto— y la pantalla siguió con exactamente 2 colores. Refutada. + +La causa estaba en el stack trace, en el log, desde el principio: ``` -KMS: Adding primary plane 33 (/dev/dri/card0) -KMS: Plane has no advertised formats ← virtio-gpu sin 3D no publica IN_FORMATS -KMS: Queue mode set ← ×3, y nunca hay page flip ni scanout +GNOME Shell-CRITICAL: Failed to setup quick settings: + Error: GSettings schema org.gnome.settings-daemon.peripherals.touchscreen not found +Stack trace: systemActions.js:156 → status/system.js:236 → quickSettings.js:29 ``` -Hipótesis por orden de costo, todas de una sola variable: -1. **Quitar `MUTTER_DEBUG_FORCE_KMS_MODE=simple`** de `gnome-start-qemu.sh`. Ese forzado se heredó de - la campaña KDE, donde kwin fallaba con atomic; mutter puede comportarse distinto, y el modo - legacy es justo el que no sabe qué hacer con un plano sin formatos publicados. -2. Encender 3D en el virtio-gpu de QEMU (`virtio-vga-gl` + virgl) y sacar `GBM_ALWAYS_SOFTWARE`. -3. Mirar si `MUTTER_DEBUG_SEND_KMS_MODIFIERS=0` sigue haciendo falta ahora que hay scanout real. +Esa excepción ocurre **dentro de `Main.start()`**, construyendo los quick settings: el panel nunca se +termina de armar, así que no hay nada que pintar. El proceso queda vivo y el compositor con DRM +master — de ahí la pantalla negra con `gnome-shell=2`. **Mutter no tenía un frame que presentar; no +es que no supiera presentarlo.** -Lo demás del log son avisos, no muros: falta un tema de cursor, colord no arranca (el helper setuid -no tiene los permisos) y `org.gnome.settings-daemon.peripherals.touchscreen` no existe porque -gnome-settings-daemon está aparcada — eso rompe quick-settings, no la sesión. +Lo resolvió la receta `gsd-schemas`: los gschemas de gnome-settings-daemon **sin** g-s-d (que sigue +aparcada por GTK3/X11). Tercera vez que aparece la misma lección — un gschema no es un fichero de +datos del demonio, es una interfaz publicada que consume otro programa. + +### Dos trampas del camino, las dos de diagnóstico + +1. **`glib-compile-schemas` sale con 0 aunque RECHACE un esquema.** Instalé los once XML, el log dijo + `esquemas OK`, y el shell seguía diciendo `schema ... not found`. Lo que faltaba era + `org.gnome.settings-daemon.enums.xml` —que meson genera con `glib-mkenums` y no es uno de los + `.in`—: sin los ``, glib descarta el esquema entero, avisa por stderr y sigue. `gnome-start` + ahora **vuelca ese stderr siempre**, no sólo cuando el comando falla. +2. **El log serial persiste entre arranques.** Dos veces leí un `STATUS +30s` que era del arranque + anterior y saqué conclusiones de una VM muerta. Truncar (`: > serial.log`) antes de arrancar, y + esperar a que la imagen esté hecha Y no haya otro QEMU con el disco tomado (`Failed to get "write" + lock` es el aviso de que hay uno vivo). + +### Lo que queda, y ninguno impide el escritorio + +- `Failed to activate service 'org.freedesktop.UPower': timed out` — falta lanzar `upowerd` en + `gnome-start`, como se hace con `accounts-daemon`. +- `No cursor theme available` — falta un tema de cursor (adwaita-icon-theme). +- colord no arranca: su helper setuid no tiene los permisos correctos en la imagen. +- `Missing required core component Settings` — es gnome-control-center, que no está en el corpus. ## CÓMO SE CERRÓ LA CAPA JS (2026-07-29) diff --git a/recipes/incoming-gnome/gsd-schemas.toml b/recipes/incoming-gnome/gsd-schemas.toml new file mode 100644 index 00000000..1283d337 --- /dev/null +++ b/recipes/incoming-gnome/gsd-schemas.toml @@ -0,0 +1,82 @@ +# gsd-schemas — los gschemas de gnome-settings-daemon, y NADA de g-s-d. +# +# POR QUÉ EXISTE: `gnome-settings-daemon` está APARCADA por diseño —pide `gtk+-3.0`, `gtk+-x11-3.0`, +# `x11` y `xfixes` de forma incondicional, y esta distro es Wayland-only (ver el comentario de su +# receta)—. Pero **gnome-shell lee sus esquemas al arrancar**, y sin ellos no llega a pintar: +# +# GNOME Shell-CRITICAL: Failed to setup quick settings: +# Error: GSettings schema org.gnome.settings-daemon.peripherals.touchscreen not found +# Stack trace: … systemActions.js:156 → status/system.js:236 → quickSettings.js:29 … +# +# Y eso NO es un aviso: la excepción ocurre construyendo los quick settings dentro de `Main.start()`, +# o sea que el panel nunca se termina de armar. El síntoma en pantalla es un negro total con la +# consola del kernel encima y `gnome-shell` vivo — que es exactamente lo que parecía un muro de KMS. +# +# ES LA MISMA LECCIÓN QUE libgdm, por tercera vez: **un gschema no es un fichero de datos del demonio, +# es una interfaz publicada que consume otro programa**. Que el demonio no se pueda construir no quita +# que su contrato haga falta. Por eso las dos cosas se separan: el demonio sigue aparcado, su +# vocabulario de configuración entra. +# +# QUÉ HACE: copia los once `*.gschema.xml.in` de `data/`, sustituyendo el único placeholder que +# tienen (`@GETTEXT_PACKAGE@`) — es lo mismo que hace el `configure_file` de `data/meson.build:23`— +# y genera **`org.gnome.settings-daemon.enums.xml`** con `glib-mkenums`, replicando el +# `gnome.mkenums()` de `data/meson.build:33` con sus mismas plantillas. +# +# ⚠ EL FICHERO DE ENUMS NO ES OPCIONAL, y su ausencia cuesta un ciclo entero porque el síntoma es +# idéntico al de no tener los esquemas: los `.gschema.xml` referencian +# `enum="org.gnome.settings-daemon.GsdBellMode"` y compañía, esos `` viven SÓLO en el fichero +# generado, y `glib-compile-schemas` **rechaza el esquema entero** cuando no puede resolverlos. +# Rechaza, no aborta: sale con 0, imprime el motivo por stderr y sigue. Así que +# `org.gnome.settings-daemon.peripherals.touchscreen` seguía «not found» con el XML instalado y +# `esquemas OK` en el log. Los enums se generan de `data/gnome-settings-daemon/gsd-enums.h`, que es +# una cabecera pura de declaraciones: no hace falta compilar nada de g-s-d para leerla. +# +# El `gschemas.compiled` lo genera `gnome-start` en el primer arranque, junto con el resto (meson no +# lo produce cuando hay DESTDIR). +# +# SE INCLUYE `wwan` aunque upstream lo condicione a ModemManager, y la razón es la asimetría del +# fallo: **un esquema que falta es un crash; uno que sobra es inerte.** El código de banda ancha del +# shell pregunta primero por el servicio D-Bus de ModemManager, que no está, y no llega a leer nada. +# Traerlo cuesta 4 KB de XML y quita una piedra futura del camino. +# +# Los valores por defecto quedan los de upstream. No se cambia ninguno: un escritorio sin g-s-d +# corriendo no aplica esas preferencias igual, así que falsearlas sólo escondería que el demonio falta. +name = "gsd-schemas" +version = "48.1" + +[source] +tarball = "https://download.gnome.org/sources/gnome-settings-daemon/48/gnome-settings-daemon-48.1.tar.xz" +sha256 = "3860a2ea214dcbcb6600ae7a1e3358a5389215087bc3e4a47cee3f87baee062e" + +[build] +compiler = "zig-cc" +target = "x86_64-linux-musl" +link = "dynamic" + +[build.phases] +configure = "true" +compile = "true" +install = ''' +set -e +mkdir -p /out/usr/share/glib-2.0/schemas +for f in data/org.gnome.settings-daemon.*.gschema.xml.in; do + out=$(basename "$f" .in) + sed 's/@GETTEXT_PACKAGE@/gnome-settings-daemon/g' "$f" > "/out/usr/share/glib-2.0/schemas/$out" +done +# Los ENUMS, sin los cuales los esquemas de arriba se rechazan. Réplica del gnome.mkenums() de +# data/meson.build:33, con las mismas plantillas. +glib-mkenums \ + --comments '' \ + --fhead '' \ + --vhead ' <@type@ id="org.gnome.settings-daemon.@EnumName@">' \ + --vprod ' ' \ + --vtail ' ' \ + --ftail '' \ + data/gnome-settings-daemon/gsd-enums.h \ + > /out/usr/share/glib-2.0/schemas/org.gnome.settings-daemon.enums.xml +grep -c '/dev/null | wc -l) esquemas GSettings..." glib-compile-schemas "$GSETTINGS_SCHEMA_DIR" 2>/tmp/schemas.log \ && say "esquemas OK" || { say "!! glib-compile-schemas FALLÓ:"; dump /tmp/schemas.log; } + # SIEMPRE volcar el log, no sólo al fallar. `glib-compile-schemas` **sale con 0 aunque RECHACE un + # esquema**: imprime el motivo por stderr y sigue con los demás. Con el volcado condicionado al + # código de salida, un esquema descartado quedaba invisible detrás de un «esquemas OK» — y eso fue + # exactamente lo que escondió que los gschemas de g-s-d les faltaban los ``, mientras el + # shell moría con «schema ... not found» y el fichero estaba instalado. Perdí un ciclo por creerle + # al código de salida en vez de leer stderr. + if [ -s /tmp/schemas.log ]; then + say "!! glib-compile-schemas se QUEJÓ (aunque no falle, puede haber descartado esquemas):" + dump /tmp/schemas.log + fi fi say "GPU DRM: $(ls /dev/dri/ 2>/dev/null | tr '\n' ' ')" diff --git a/scripts/gnome/hydrate-gnome.sh b/scripts/gnome/hydrate-gnome.sh index 6ff81fa3..7ad475df 100755 --- a/scripts/gnome/hydrate-gnome.sh +++ b/scripts/gnome/hydrate-gnome.sh @@ -43,6 +43,10 @@ else # Y ésta NO sale de la lista del shell: la pide el propio gjs desde su JS embebido # (`imports.gi.versions.GIRepository = '2.0'`). Dep de runtime del INTÉRPRETE. recipes/incoming-gnome/gi-girepository-typelib.toml + # Ni typelib ni librería: los GSCHEMAS de gnome-settings-daemon. El demonio está aparcado + # (GTK3/X11) pero el shell lee sus esquemas al construir los quick settings, y si faltan la + # excepción ocurre DENTRO de Main.start() ⇒ el panel no se arma y la pantalla queda negra. + recipes/incoming-gnome/gsd-schemas.toml ) fi diff --git a/scripts/gnome/qemu-desktop-image.sh b/scripts/gnome/qemu-desktop-image.sh index ef1d717a..13a3b392 100755 --- a/scripts/gnome/qemu-desktop-image.sh +++ b/scripts/gnome/qemu-desktop-image.sh @@ -143,6 +143,13 @@ done # GNOME_MODE se hornea como fichero: el getty ejecuta gnome-start sin ambiente heredable. printf 'GNOME_MODE=%s\n' "${GNOME_MODE:-drm}" > "$MERGED/etc/gnome-mode" echo "==> modo de arranque: ${GNOME_MODE:-drm}" +# KMS_MODE viaja por el mismo camino, y sólo si se pide: `gnome-start` lo traduce a +# MUTTER_DEBUG_FORCE_KMS_MODE. Vacío = atomic (el default de mutter). `simple` = el modeset legacy +# que se heredó de KDE y dejaba la pantalla en negro. +if [ -n "${KMS_MODE:-}" ]; then + printf 'KMS_MODE=%s\n' "$KMS_MODE" >> "$MERGED/etc/gnome-mode" + echo "==> KMS forzado a: $KMS_MODE" +fi echo "==> instalando /usr/bin/gnome-start" install -Dm755 scripts/gnome/gnome-start-qemu.sh "$MERGED/usr/bin/gnome-start"