Arrancando la imagen KDE recién regenerada, el serial dijo:
"applications.menu" not found in QList("/etc/xdg/menus")
y el escritorio pintó perfecto igual: fondo, panel, reloj, bandeja. Ése es justo el modo de fallo
que este repo persigue — nada falla, simplemente el menú de aplicaciones no tiene qué mostrar.
⚠ Y EL DIAGNÓSTICO OBVIO ERA EL EQUIVOCADO. Lo primero que anoté fue «falta el fichero, hay que
empaquetarlo». **No falta**: `plasma-workspace` instala `/etc/xdg/menus/plasma-applications.menu`
—verificado en el store Y en el rootfs de la imagen, 9904 bytes—. Lo que faltaba es el PREFIJO:
Plasma construye el nombre como `${XDG_MENU_PREFIX}applications.menu`, y sin la variable busca
`applications.menu` a secas, que no existe con ese nombre en NINGUNA distro con Plasma. El error
nombra un fichero que nunca tuvo ese nombre. La etiqueta contra el hecho, otra vez.
El arreglo es una línea. Lo que no era una línea es DÓNDE: los cinco lanzadores de Plasma exportan
`XDG_DATA_DIRS` y ninguno exportaba éste —comprobado uno por uno—, así que arreglar sólo el de QEMU
habría dejado la misma trampa en metal, metal-sw, el anidado y el headless. Es el cable que este
repo ya vio caer cinco veces en `cosecha-cron.sh` y en la frontera del sembrador: arreglar el caso
y dejar la trampa. Van los cinco.
plasma-start-qemu.sh · plasma-start-metal.sh · plasma-start-metal-sw.sh export
nested-plasma.sh · run-plasma-headless.sh --setenv (arman con bwrap)
VERIFICADO, y digo exactamente qué: que el nombre que Plasma construirá con el prefijo EXISTE en la
ruta donde lo busca (`/etc/xdg/menus/plasma-applications.menu` está en el rootfs de la imagen). Lo
que NO está verificado es el menú renderizado — eso pide reconstruir la imagen y arrancarla otra
vez. El `plasma-start` horneado en el rootfs fundido ya se refrescó con el script corregido, así que
la imagen queda a un rebuild de distancia.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LCt3ettR4Z7b6wPCBmbvEV
124 lines
5.5 KiB
Bash
Executable File
124 lines
5.5 KiB
Bash
Executable File
#!/bin/sh
|
|
# plasma-start-metal-sw.sh — arranca Plasma en METAL con render por SOFTWARE (llvmpipe/kms_swrast) sobre
|
|
# el DRM real de la máquina (i915 en Intel, nouveau en NVIDIA Pascal). Instalado como /usr/bin/plasma-start.
|
|
#
|
|
# Camino "aguanta ambas": el kernel linux-generic da KMS por i915 Y nouveau; encima corre el mesa-llvmpipe
|
|
# soberano (mismo software GL que validamos en QEMU) ⇒ funciona idéntico en cualquier GPU sin drivers HW.
|
|
# Trae los mismos fixes que la sesión QEMU (ver [[kde-metal-qemu-desktop]]): GBM_ALWAYS_SOFTWARE (init),
|
|
# KWIN_DRM_USE_MODIFIERS=0 (FB), KWIN_COMPOSE=Q (rasterizador), KWIN_FORCE_SW_CURSOR (cursor), + cursor/iconos
|
|
# breeze, D-Bus sesión+sistema, fontdir.
|
|
#
|
|
# NO se autoarranca: en un bringup de hardware nuevo, si Plasma falla querés el shell de la consola para
|
|
# leer los logs, no una pantalla negra. Se corre a mano: `plasma-start`. Logs: /tmp/{kwin,plasmashell,kamd}.log
|
|
set -u
|
|
export PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
|
say() { echo "== plasma-metal :: $*" | tee -a /dev/console 2>/dev/null; }
|
|
dump() { echo "---- $1 ----"; cat "$1" 2>/dev/null; }
|
|
|
|
export LD_LIBRARY_PATH=/usr/lib64:/usr/lib/qt6:/usr/lib:/lib
|
|
export QT_PLUGIN_PATH=/usr/lib64/qt6/plugins:/usr/lib/qt6/plugins
|
|
export QML2_IMPORT_PATH=/usr/lib64/qt6/qml:/usr/lib/qt6/qml
|
|
export QML_IMPORT_PATH=$QML2_IMPORT_PATH
|
|
export XDG_DATA_DIRS=/usr/share
|
|
# ⚠ XDG_MENU_PREFIX: sin esto el MENÚ DE APLICACIONES sale VACÍO, y el fallo no se ve al arrancar.
|
|
# Medido el 2026-09-09 arrancando la imagen KDE: el serial dice
|
|
# "applications.menu" not found in QList("/etc/xdg/menus")
|
|
# y el escritorio pinta perfecto igual. **No falta el fichero**: `plasma-workspace` instala
|
|
# `/etc/xdg/menus/plasma-applications.menu`. Lo que falta es el PREFIJO que le dice a Plasma que
|
|
# busque ese nombre y no `applications.menu` a secas. Es la etiqueta contra el hecho: el error
|
|
# nombra un fichero que nunca existió con ese nombre en ninguna distro con Plasma.
|
|
export XDG_MENU_PREFIX=plasma-
|
|
export XDG_RUNTIME_DIR=/run/user/0
|
|
export XDG_CONFIG_HOME=/root/.config
|
|
export XDG_CACHE_HOME=/root/.cache
|
|
export HOME=/root
|
|
|
|
# --- render por software sobre el DRM real (i915 o nouveau, según la máquina) ---
|
|
export LIBGL_ALWAYS_SOFTWARE=1
|
|
export GALLIUM_DRIVER=llvmpipe
|
|
export GBM_ALWAYS_SOFTWARE=1 # fuerza gbm->software (si no, trata la GPU real como HW y no hay driver HW)
|
|
export MESA_LOADER_DRIVER_OVERRIDE=kms_swrast
|
|
export LIBGL_DRIVERS_PATH=/usr/lib/dri
|
|
export QT_QUICK_BACKEND=software
|
|
export LP_NUM_THREADS=1
|
|
export KWIN_COMPOSE=Q # QPainter: esquiva el segfault del rasterizador llvmpipe
|
|
export KWIN_DRM_USE_MODIFIERS=0 # varios KMS rechazan AddFB2WithModifiers con render software
|
|
export KWIN_FORCE_SW_CURSOR=1 # cursor por software (el plano HW no se presenta con sw render)
|
|
export QT_QPA_PLATFORM=wayland
|
|
export QT_QPA_PLATFORMTHEME=kde
|
|
export QT_QPA_FONTDIR=/usr/share/fonts/dejavu
|
|
export XCURSOR_THEME=breeze_cursors
|
|
export XCURSOR_PATH=/usr/share/icons:/usr/share/pixmaps
|
|
export XCURSOR_SIZE=24
|
|
|
|
mkdir -p "$XDG_RUNTIME_DIR" "$XDG_CONFIG_HOME" "$XDG_CACHE_HOME" /run/dbus /var/lib/dbus /root
|
|
chmod 700 "$XDG_RUNTIME_DIR"
|
|
[ -s /etc/machine-id ] || cat /proc/sys/kernel/random/uuid 2>/dev/null | tr -d - > /etc/machine-id
|
|
cp -f /etc/machine-id /var/lib/dbus/machine-id 2>/dev/null || true
|
|
|
|
cat > "$XDG_CONFIG_HOME/kdeglobals" <<EOF
|
|
[Icons]
|
|
Theme=breeze
|
|
|
|
[General]
|
|
ColorScheme=BreezeLight
|
|
widgetStyle=Breeze
|
|
|
|
[KDE]
|
|
widgetStyle=Breeze
|
|
EOF
|
|
cat > "$XDG_CONFIG_HOME/kcminputrc" <<EOF
|
|
[Mouse]
|
|
cursorTheme=breeze_cursors
|
|
cursorSize=24
|
|
EOF
|
|
|
|
# --- detectar la GPU real y decirle a kwin que use SÓLO ese card (ignora efifb/simpledrm) ---
|
|
say "GPUs DRM: $(ls /dev/dri/ 2>/dev/null | tr '\n' ' ')"
|
|
REAL_CARD=
|
|
for c in /dev/dri/card*; do
|
|
[ -e "$c" ] || continue
|
|
n=$(basename "$c")
|
|
drv=$(readlink -f "/sys/class/drm/$n/device/driver" 2>/dev/null)
|
|
case "$drv" in
|
|
*i915*|*nouveau*|*amdgpu*|*radeon*|*xe*) REAL_CARD="$c"; say "GPU real: $n ($(basename "$drv"))"; break;;
|
|
esac
|
|
done
|
|
[ -n "$REAL_CARD" ] && export KWIN_DRM_DEVICES="$REAL_CARD" || say "!! no hallé GPU real (i915/nouveau/amd) — kwin verá todos los DRM"
|
|
|
|
# --- D-Bus de sistema (udisks/solid/powerdevil) y de sesión ---
|
|
if [ ! -S /run/dbus/system_bus_socket ]; then
|
|
dbus-daemon --system --fork 2>/dev/null && say "system bus ON" || say "system bus NO arrancó"
|
|
fi
|
|
if [ -z "${DBUS_SESSION_BUS_ADDRESS:-}" ]; then
|
|
DBUS_SESSION_BUS_ADDRESS=$(dbus-daemon --session --fork --print-address 2>/dev/null)
|
|
export DBUS_SESSION_BUS_ADDRESS
|
|
fi
|
|
say "dbus sesión: ${DBUS_SESSION_BUS_ADDRESS:-NO ARRANCÓ}"
|
|
|
|
# --- compositor sobre el DRM real ---
|
|
say "lanzando kwin_wayland (DRM real, software GL)…"
|
|
/usr/bin/kwin_wayland --drm >/tmp/kwin.log 2>&1 &
|
|
KWIN=$!
|
|
i=0
|
|
while [ $i -lt 60 ]; do
|
|
[ -S "$XDG_RUNTIME_DIR/wayland-0" ] && break
|
|
kill -0 $KWIN 2>/dev/null || { say "!! kwin murió:"; dump /tmp/kwin.log; exec /bin/sh; }
|
|
i=$((i+1)); sleep 0.5
|
|
done
|
|
[ -S "$XDG_RUNTIME_DIR/wayland-0" ] || { say "!! kwin no expuso wayland-0:"; dump /tmp/kwin.log; exec /bin/sh; }
|
|
say "compositor OK (wayland-0)"
|
|
export WAYLAND_DISPLAY=wayland-0
|
|
|
|
KAMD=$(ls /usr/lib*/libexec/kactivitymanagerd 2>/dev/null | head -1)
|
|
[ -n "$KAMD" ] && { "$KAMD" >/tmp/kamd.log 2>&1 & sleep 2; say "kactivitymanagerd lanzado"; }
|
|
|
|
say "lanzando plasmashell…"
|
|
/usr/bin/plasmashell >/tmp/plasmashell.log 2>&1 &
|
|
sleep 8
|
|
say "procesos: $(ps axo comm 2>/dev/null | grep -E 'kwin|plasma' | sort -u | tr '\n' ' ')"
|
|
say "escritorio arriba. Ctrl-C termina la sesión. Logs: /tmp/{kwin,plasmashell,kamd}.log"
|
|
wait $KWIN
|
|
say "kwin salió (código $?)"; dump /tmp/kwin.log
|
|
exec /bin/sh
|