gnome: 🏔🏔 EL ESCRITORIO PINTA — Overview de GNOME desde fuente, con captura
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 `<enum>`, 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) <noreply@anthropic.com>
This commit is contained in:
@@ -52,10 +52,23 @@ export MESA_LOADER_DRIVER_OVERRIDE=kms_swrast
|
||||
export LIBGL_DRIVERS_PATH=/usr/lib/dri
|
||||
# llvmpipe SINCRÓNICO: su JIT multi-thread segfaultea al componer la 1ra superficie en esta VM.
|
||||
export LP_NUM_THREADS=1
|
||||
# Análogos mutter de dos fixes de kwin: cursor por software (el plano de cursor por HW no se presenta
|
||||
# en virtio-gpu con render software ⇒ cursor invisible) y modeset simple en vez de atomic.
|
||||
# Análogo mutter de un fix de kwin: cursor por software (el plano de cursor por HW no se presenta en
|
||||
# virtio-gpu con render software ⇒ cursor invisible).
|
||||
export MUTTER_DEBUG_DISABLE_HW_CURSORS=1
|
||||
export MUTTER_DEBUG_FORCE_KMS_MODE=simple
|
||||
# MUTTER_DEBUG_FORCE_KMS_MODE — perilla EXPERIMENTAL, apagada por defecto desde 2026-07-29.
|
||||
#
|
||||
# Estuvo en `simple` (modeset legacy en vez de atomic), copiado de la campaña KDE. Pero ahí el que
|
||||
# fallaba con atomic era KWIN, no mutter: se heredó por analogía, no por medición. Y el síntoma que
|
||||
# dejó es exactamente el que el modo legacy explica — la sesión sube entera, `gnome-shell` corre
|
||||
# cinco minutos sin un solo error, y la PANTALLA SIGUE NEGRA con la consola del kernel encima. En el
|
||||
# log de KMS: `Plane has no advertised formats` para el plano primario de virtio-gpu (sin 3D no
|
||||
# publica IN_FORMATS) y sólo `Queue mode set` — ningún page flip, ningún scanout.
|
||||
#
|
||||
# Con atomic, mutter negocia formatos y planos por la ruta moderna, que es la que sabe qué hacer
|
||||
# cuando el driver no publica IN_FORMATS. Se deja la variable como perilla para volver a probar el
|
||||
# camino legacy sin editar el script: `KMS_MODE=simple bash scripts/gnome/qemu-desktop-image.sh`,
|
||||
# que lo hornea en /etc/gnome-mode (el getty no hereda ambiente, igual que GNOME_MODE).
|
||||
[ -n "${KMS_MODE:-}" ] && export MUTTER_DEBUG_FORCE_KMS_MODE="$KMS_MODE"
|
||||
# MUTTER_DEBUG_KMS_THREAD_TYPE=user: mutter corre su hebra KMS con prioridad de TIEMPO REAL por
|
||||
# defecto. En esta VM no hay privilegios de RT scheduling, y el síntoma es exactamente el que dio el
|
||||
# diagnóstico — hilo principal dormido en `futex_do_wait` con la "KMS thread" viva pero sin avanzar,
|
||||
@@ -90,6 +103,16 @@ if [ ! -f "$GSETTINGS_SCHEMA_DIR/gschemas.compiled" ]; then
|
||||
say "compilando $(ls $GSETTINGS_SCHEMA_DIR/*.xml 2>/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 `<enum>`, 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' ' ')"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user