Files
hammer/scripts/kde/plasma-start-metal-sw.sh
sergioandClaude Opus 4.8 746d2dedd1 kde/metal: andamiaje escritorio dual-GPU (Intel i915 + NVIDIA nouveau) por software
Objetivo: USB "live" que arranca el escritorio KDE en metal y aguanta ambas máquinas
(TigerLake/iris y Pascal/nouveau), render por software (mesa-llvmpipe soberano) sobre
el KMS del kernel — uniforme en cualquier GPU, reusa los fixes validados en QEMU.

- recipes/linux-metal-dual.toml: = linux-generic (dual-GPU i915+nouveau+radeon) + el
  CMDLINE de pivote de linux-metal (initrd=/initramfs.cpio.gz rdinit=/init) para bootear
  por EFI-stub directo desde el ESP (root en disco, no RAM). Ni linux-generic (sin pivote)
  ni linux-metal (nouveau OFF) servían solos.
- scripts/kde/metal-desktop-image-dual.sh: arma la imagen — base metal + KDE + inyección
  mesa-llvmpipe/libLLVM/musl + firmware nvidia gp106 (nouveau modeset Pascal) + kernel
  linux-metal-dual.
- scripts/kde/plasma-start-metal-sw.sh: launcher software-GL para metal, detección de GPU
  real (i915/nouveau/amd), lanzamiento MANUAL (bringup seguro), con los fixes de la sesión
  QEMU (GBM_ALWAYS_SOFTWARE, USE_MODIFIERS=0, KWIN_COMPOSE=Q, FORCE_SW_CURSOR, cursor/iconos
  breeze, D-Bus sesión+sistema).

Pendiente: build del kernel (~60min, en curso) → rebuild imagen → validar OVMF → quemar USB.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-20 16:32:46 -04:00

116 lines
4.9 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
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