Der Protokollauszug enthielt die entscheidende Zeile nicht bei der Shell, sondern
zwei Zeilen darunter:
! glxinfo lieferte nichts
! vulkaninfo lieferte nichts
Im Container gab es überhaupt kein OpenGL. Mein Denkfehler: Turnip liegt in
Termux' Verzeichnis, nicht im Debian-Rootfs. GALLIUM_DRIVER=zink im Container zu
setzen geht deshalb ins Leere — Zink bräuchte dort einen Vulkan-Treiber, und da
ist keiner.
Damit erklärt sich die ganze Kette: kein OpenGL, also kein QtQuick, also kann
plasmashell die MobileShell nicht laden und fällt wortlos auf die Voreinstellung
zurück. Das 'starting invalid corona' war das Symptom, nicht die Krankheit — und
der schwarze Bildschirm sah nach einem Compositor-Problem aus, obwohl KWin lief.
Richtig ist der Weg über virgl: der Server läuft in TERMUX und rendert dort über
Zink auf Turnip, der Container spricht nur virpipe mit ihm. Turnip bleibt also im
Spiel, nur eine Ebene tiefer als gedacht.
Der GPU-Nachweis im Container wertet jetzt aus statt nur zu drucken und sagt
ausdrücklich, dass ohne OpenGL die Shell nicht laden wird — damit dieselbe
Verwechslung nicht noch einmal Stunden kostet.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
232 lines
11 KiB
Bash
Executable File
232 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
# Läuft INNERHALB des Debian-Rootfs, aufgerufen von 01-s1-plasma-mobile.sh.
|
|
# Direkt aufrufen ergibt keinen Sinn — die Umgebung kommt vom äußeren Skript.
|
|
set -uo pipefail
|
|
|
|
GPU_PROFIL="${HPOS_GPU_PROFIL:-virgl}"
|
|
BREITE="${HPOS_BREITE:-1080}"
|
|
HOEHE="${HPOS_HOEHE:-2340}"
|
|
|
|
echo "── Debian-Seite: Plasma Mobile ──"
|
|
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
export DISPLAY=:0
|
|
export XDG_RUNTIME_DIR=/tmp/hpos-runtime
|
|
export PULSE_SERVER=127.0.0.1
|
|
export LANG=de_DE.UTF-8
|
|
mkdir -p "$XDG_RUNTIME_DIR" && chmod 700 "$XDG_RUNTIME_DIR"
|
|
|
|
# Plasma Mobile ist Touch-first: ohne diese Variablen kommt eine Desktop-Skalierung
|
|
# heraus, die auf einem Telefon unbedienbar ist.
|
|
export QT_QPA_PLATFORM=wayland
|
|
export QT_QUICK_CONTROLS_MOBILE=1
|
|
export PLASMA_PLATFORM=phone
|
|
export KDE_FULL_SESSION=true
|
|
# Ohne gesetztes Cursor-Thema meldet KWin 'Failed to load cursor theme "default"'
|
|
# und zeichnet gar keinen Mauszeiger.
|
|
export XCURSOR_THEME=breeze_cursors
|
|
export XCURSOR_SIZE=24
|
|
|
|
# Im Container immer virpipe, unabhängig vom Profil. Der Vulkan-Treiber liegt in
|
|
# Termux' Verzeichnis und ist hier drinnen nicht erreichbar — Zink hätte also
|
|
# nichts, worauf es aufsetzen könnte. Der schnelle Pfad (Zink auf Turnip) wird
|
|
# eine Ebene tiefer genutzt, vom virgl-Server auf der Termux-Seite.
|
|
export GALLIUM_DRIVER=virpipe
|
|
export MESA_GL_VERSION_OVERRIDE=4.3
|
|
export MESA_GLES_VERSION_OVERRIDE=3.2
|
|
echo " GPU-Profil: $GPU_PROFIL (im Container über virpipe)"
|
|
|
|
# ── Pakete ───────────────────────────────────────────────────────────────────
|
|
# Bewusst ohne empfohlene Pakete: sonst zieht Plasma Mobile eine komplette
|
|
# Desktop-Umgebung samt Drucksystem mit, was auf einem Telefon nur Platz kostet.
|
|
if ! command -v kwin_wayland >/dev/null 2>&1; then
|
|
echo "── Installiere Plasma Mobile (einmalig, gut 1 GB) ──"
|
|
apt-get update -qq
|
|
# Bewusst OHNE --no-install-recommends: bei KDE stecken die QML-Module
|
|
# traditionell in den Empfehlungen, nicht in den harten Abhängigkeiten.
|
|
# Ohne sie ist die Shell formal installiert, aber innen hohl — plasmashell
|
|
# lädt sie dann nicht und fällt wortlos auf die Voreinstellung zurück.
|
|
# Für einen Machbarkeitsbeweis ist ein paar hundert MB zu viel das kleinere
|
|
# Übel gegenüber einem Fehlschlag aus dem falschen Grund.
|
|
apt-get install -y \
|
|
plasma-mobile plasma-nano kwin-wayland plasma-workspace maliit-keyboard \
|
|
xdg-desktop-portal-kde qtwayland5 libqt5waylandclient5 \
|
|
|| echo " ! Paketinstallation unvollständig — Details oben"
|
|
fi
|
|
|
|
for b in kwin_wayland plasmashell; do
|
|
if command -v "$b" >/dev/null 2>&1; then echo " ✓ $b vorhanden"
|
|
else echo " ✗ $b fehlt"; fi
|
|
done
|
|
|
|
# ── Welche Shell? ────────────────────────────────────────────────────────────
|
|
# Ohne gültiges Shell-Paket startet plasmashell klaglos, meldet nur beiläufig
|
|
# "starting invalid corona" und zeichnet dann nichts. Von außen sieht das aus wie
|
|
# ein Fehlschlag des Compositors und ist keiner.
|
|
#
|
|
# In Debian liefert ausgerechnet 'plasma-mobile' KEINE Shell mit, sondern nur
|
|
# QML-Module und KWin-Skripte. Die Shell steckt in 'plasma-nano' und heißt
|
|
# org.kde.plasma.nano. Der Name org.kde.plasma.mobileshell aus den KDE-Quellen
|
|
# existiert in Debian nicht. Deshalb wird nachgesehen statt geraten.
|
|
shell_suchen() {
|
|
local kandidat
|
|
for kandidat in org.kde.plasma.mobileshell org.kde.plasma.phoneshell \
|
|
org.kde.plasma.nano org.kde.plasma.desktop; do
|
|
if [ -d "/usr/share/plasma/shells/$kandidat" ]; then
|
|
printf '%s' "$kandidat"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
echo "── Verfügbare Plasma-Shells ──"
|
|
if [ -d /usr/share/plasma/shells ]; then
|
|
ls -1 /usr/share/plasma/shells/ 2>/dev/null | sed 's/^/ /'
|
|
[ -z "$(ls -A /usr/share/plasma/shells/ 2>/dev/null)" ] && echo " (leer)"
|
|
else
|
|
echo " (Verzeichnis /usr/share/plasma/shells fehlt)"
|
|
fi
|
|
|
|
SHELL_PAKET="$(shell_suchen || true)"
|
|
|
|
if [ -z "$SHELL_PAKET" ]; then
|
|
echo " ! Keine Shell gefunden — versuche plasma-nano nachzuinstallieren."
|
|
apt-get install -y --no-install-recommends plasma-nano plasma-mobile 2>&1 \
|
|
| tail -5 | sed 's/^/ /'
|
|
SHELL_PAKET="$(shell_suchen || true)"
|
|
fi
|
|
|
|
if [ -n "$SHELL_PAKET" ]; then
|
|
echo " ✓ Shell: $SHELL_PAKET"
|
|
else
|
|
echo " ✗ Weiterhin keine Plasma-Shell — plasmashell hat nichts zu zeichnen."
|
|
echo " Prüfen: dpkg -L plasma-nano | grep shells"
|
|
echo " Ohne Shell ist Versuch A zum Scheitern verurteilt; XFCE zeigt dann,"
|
|
echo " ob wenigstens X-Server und GPU tragen."
|
|
fi
|
|
|
|
# ── GPU-Nachweis, bevor der Desktop startet ──────────────────────────────────
|
|
# Wenn hier schon nichts kommt, ist ein Fehlschlag von Plasma keine Aussage über
|
|
# Plasma, sondern über den GPU-Pfad. Deshalb vorher messen.
|
|
echo "── GPU-Nachweis ──"
|
|
# Das ist kein Nebenschauplatz: ohne funktionierendes OpenGL kann QtQuick keine
|
|
# Szene aufbauen, plasmashell lädt seine Shell nicht und fällt wortlos auf die
|
|
# Voreinstellung zurück. Ein schwarzer Bildschirm sieht dann nach einem
|
|
# Compositor-Problem aus, ist aber eines der Grafikanbindung.
|
|
GLXAUS=$(timeout 25 glxinfo -B 2>&1)
|
|
if printf '%s' "$GLXAUS" | grep -qi 'OpenGL renderer'; then
|
|
printf '%s\n' "$GLXAUS" | grep -Ei 'OpenGL (renderer|version)' | sed 's/^/ /'
|
|
echo " ✓ OpenGL steht"
|
|
else
|
|
echo " ✗ Kein OpenGL im Container:"
|
|
printf '%s\n' "$GLXAUS" | head -6 | sed 's/^/ /'
|
|
echo " Läuft virgl_test_server_android auf der Termux-Seite?"
|
|
echo " Ohne OpenGL wird plasmashell die Shell nicht laden können."
|
|
fi
|
|
|
|
# ── D-Bus ────────────────────────────────────────────────────────────────────
|
|
if [ ! -e /run/dbus/system_bus_socket ]; then
|
|
mkdir -p /run/dbus
|
|
dbus-daemon --system --fork 2>/dev/null && echo " ✓ System-D-Bus gestartet" \
|
|
|| echo " ! System-D-Bus nicht gestartet (ohne logind oft verschmerzbar)"
|
|
fi
|
|
|
|
# ── Versuch A: KWin genestet im X11-Backend ──────────────────────────────────
|
|
# Das ist die eigentliche Wette. In diesem Modus braucht KWin weder DRM noch Seat.
|
|
echo ""
|
|
echo "── Versuch A: kwin_wayland --x11-display ──"
|
|
LOGA=/tmp/hpos-s1-versuchA.log
|
|
dbus-run-session -- kwin_wayland \
|
|
--x11-display "$DISPLAY" \
|
|
--width "$BREITE" --height "$HOEHE" \
|
|
--xwayland \
|
|
-- plasmashell ${SHELL_PAKET:+-p "$SHELL_PAKET"} \
|
|
>"$LOGA" 2>&1 &
|
|
PID_A=$!
|
|
echo " gestartet (PID $PID_A), warte 25 s auf die Oberfläche …"
|
|
sleep 25
|
|
|
|
if kill -0 "$PID_A" 2>/dev/null; then
|
|
echo " ✓ Versuch A läuft noch — jetzt in die Termux:X11-App wechseln und schauen."
|
|
|
|
# 'invalid corona' heißt: plasmashell hat kein brauchbares Shell-Paket geladen
|
|
# und zeichnet folglich nichts. Steht dort die Voreinstellung
|
|
# org.kde.plasma.desktop, obwohl wir etwas anderes übergeben haben, ist das
|
|
# kein Tippfehler, sondern ein Rückfall — die gewünschte Shell ließ sich nicht
|
|
# laden. Der Unterschied entscheidet, wo man weitersucht.
|
|
if grep -q 'invalid corona' "$LOGA" 2>/dev/null; then
|
|
echo ""
|
|
echo " ✗ ACHTUNG: plasmashell meldet 'invalid corona' — es zeichnet nichts."
|
|
grep 'invalid corona' "$LOGA" | tail -2 | sed 's/^/ /'
|
|
if [ -n "$SHELL_PAKET" ]; then
|
|
echo " Übergeben wurde: -p $SHELL_PAKET"
|
|
case "$(grep -o 'invalid corona \"[^\"]*\"' "$LOGA" | tail -1)" in
|
|
*"$SHELL_PAKET"*)
|
|
echo " → Diese Shell selbst lässt sich nicht laden."
|
|
echo " Meist fehlen QML-Module. Nachsehen mit:"
|
|
echo " plasmashell -p $SHELL_PAKET (Fehler stehen auf stderr)"
|
|
;;
|
|
*)
|
|
echo " → plasmashell ist auf die Voreinstellung zurückgefallen,"
|
|
echo " die übergebene Shell kam also nicht an oder wurde verworfen."
|
|
;;
|
|
esac
|
|
else
|
|
echo " Es wurde gar keine Shell übergeben (keine gefunden)."
|
|
fi
|
|
echo " Ein schwarzes Bild ist damit erklärt — KWin läuft trotzdem."
|
|
fi
|
|
|
|
echo ""
|
|
echo " Beenden mit: pkill -f kwin_wayland"
|
|
echo " Protokoll: $LOGA"
|
|
tail -n 25 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
|
exit 0
|
|
fi
|
|
|
|
echo " ✗ Versuch A beendet. Letzte Zeilen:"
|
|
tail -n 40 "$LOGA" 2>/dev/null | sed 's/^/ /'
|
|
|
|
# ── Versuch B: die von Debian mitgelieferte Sitzung ──────────────────────────
|
|
# Startet KWin selbst und wählt sein Backend eigenständig. Weniger Kontrolle,
|
|
# aber manchmal weiß das Distributionsskript etwas, das wir nicht wissen.
|
|
echo ""
|
|
echo "── Versuch B: startplasmamobile ──"
|
|
if command -v startplasmamobile >/dev/null 2>&1; then
|
|
LOGB=/tmp/hpos-s1-versuchB.log
|
|
KWIN_COMPOSE=O2 dbus-run-session -- startplasmamobile >"$LOGB" 2>&1 &
|
|
PID_B=$!
|
|
sleep 25
|
|
if kill -0 "$PID_B" 2>/dev/null; then
|
|
echo " ✓ Versuch B läuft — in die Termux:X11-App wechseln."
|
|
tail -n 25 "$LOGB" 2>/dev/null | sed 's/^/ /'
|
|
exit 0
|
|
fi
|
|
echo " ✗ Versuch B beendet. Letzte Zeilen:"
|
|
tail -n 40 "$LOGB" 2>/dev/null | sed 's/^/ /'
|
|
else
|
|
echo " ! startplasmamobile nicht vorhanden"
|
|
fi
|
|
|
|
# ── Rückfallebene: XFCE, damit der Abend nicht umsonst war ───────────────────
|
|
# Beweist zumindest, dass X-Server und GPU-Pfad tragen. Damit ist ein Fehlschlag
|
|
# von S1 eindeutig Plasma zuzuordnen und nicht der Umgebung.
|
|
echo ""
|
|
echo "── Rückfallebene: XFCE zur Gegenprobe ──"
|
|
if ! command -v startxfce4 >/dev/null 2>&1; then
|
|
apt-get install -y --no-install-recommends xfce4 xfce4-terminal >/dev/null 2>&1 \
|
|
|| echo " ! XFCE-Installation fehlgeschlagen"
|
|
fi
|
|
if command -v startxfce4 >/dev/null 2>&1; then
|
|
dbus-run-session -- startxfce4 >/tmp/hpos-s1-xfce.log 2>&1 &
|
|
sleep 12
|
|
if pgrep -f xfwm4 >/dev/null 2>&1; then
|
|
echo " ✓ XFCE läuft. S1 ist gescheitert, aber X-Server und GPU-Pfad tragen."
|
|
echo " → Im Protokoll als 'S1 gescheitert, XFCE-Profil wird Hauptweg' vermerken."
|
|
else
|
|
echo " ✗ Auch XFCE startet nicht — dann liegt es an X-Server oder GPU, nicht an Plasma."
|
|
fi
|
|
fi
|
|
exit 1
|