#!/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" < "$XDG_CONFIG_HOME/kcminputrc" </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