Compare commits

...
9 Commits
Author SHA1 Message Date
StefanandClaude Opus 5 ab847cc46f S1: vorhandene Shells der Reihe nach durchprobieren
KWIN_COMPOSE=Q hat gegriffen — die Meldung 'Configured compositor not supported
by Platform' ist verschwunden, KWin compositet jetzt sauber in Software. Die
Grafik ist als Ursache damit ausgeschieden.

Bleibt, dass plasmashell die Shell verwirft. Statt weiter einen Namen zu raten,
werden die tatsächlich vorhandenen Shells nacheinander gestartet, bis eine ohne
'invalid corona' durchläuft. Das ist das brauchbare Abbruchkriterium: es sagt,
dass nichts gezeichnet wird, ohne dass man hinschauen muss.

Dabei die lange Optionsform --shell-plugin statt -p. Kurze Formen ändern sich
zwischen Plasma-Fassungen leichter, und eine unbekannte Kurzoption wird still
ignoriert statt bemängelt — genau der Verdacht.

Trägt keine Shell, wird das Ergebnis als Teilerfolg benannt statt als Fehlschlag:
der Compositor ist der schwierige Teil und bewiesen, die Shell der austauschbare.
Der doppelte Auswertungsblock nach der Schleife ist raus.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 23:02:20 +02:00
StefanandClaude Opus 5 a3a6d7216b S1: Software-Pfad auch dann setzen, wenn gar kein GL nachweisbar ist
Ein Fehler in meiner Verzweigung: schlugen beide GL-Prüfungen fehl, wurden
LIBGL_ALWAYS_SOFTWARE, KWIN_COMPOSE und QT_QUICK_BACKEND NICHT gesetzt —
ausgerechnet dann nicht, wenn sie am nötigsten sind. Der Software-Pfad wurde
dadurch nie ausprobiert.

Dazu ein Denkfehler dahinter: glxinfo taugt hier nicht als Richter. Unter
Termux-X11 scheitert es mit 'BadMatch bei X_GetImage', weil es Pixel zurücklesen
will — das sagt etwas über glxinfo, nichts über OpenGL. Die Prüfungen laufen
jetzt nur noch zur Information; im Zweifel wird immer der Software-Pfad gewählt.

Der virgl-Fehlschlag ist unterdessen als Zeitüberschreitung erkennbar
(Rückgabewert 124): der Client hängt, statt einen Fehler zu melden. Deshalb wird
jetzt vorab geprüft, ob der Socket im Container überhaupt sichtbar ist — das
trennt 'Server läuft nicht' von 'Container sieht ihn nicht'.

Vor Versuch A wird die tatsächlich gesetzte Umgebung ausgegeben, damit man nicht
raten muss, womit gestartet wurde. Beide Zweige durchgespielt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:57:47 +02:00
StefanandClaude Opus 5 1caaeedef1 S1: Reste vom Vorlauf selbst aufräumen, ohne sich dabei abzuschießen
Auf Wunsch räumt das Skript jetzt zu Beginn selbst auf — und zwar mehr als nur
kwin_wayland: auch plasmashell und xdg-desktop-portal bleiben hängen, dazu
verwaiste Wayland-Sockets. Bleiben die liegen, startet KWin auf wayland-1 statt
wayland-0, während plasmashell auf wayland-0 sucht.

Bewusst nicht mit 'pkill -f': das durchsucht die gesamte Kommandozeile und trifft
dabei auch den eigenen Aufruf oder eine Eltern-Shell, wenn das Muster darin
vorkommt. Beim Entwickeln dieses Blocks hat sich der Test zweimal selbst
abgeschossen — erst reichte 355477 nicht, dann auch 3136466 nicht, weil der Treffer
weiter oben in der Kette lag.

Jetzt wird die vollständige Ahnenkette über /proc/PID/stat gesammelt und
verschont. Geprüft: zwei Opfer beendet, ein Vorfahre verschont, Skript überlebt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:54:05 +02:00
StefanandClaude Opus 5 f3ef48fd10 S1: GL-Prüfung mit Rückgabewert, Software-Rendering als Rückfallebene
Die GPU-Prüfung lieferte auf dem Gerät nicht einmal eine Fehlermeldung — die
Ausgabe war leer. Ursache: stürzt glxinfo ab, kommt die Meldung von der Shell und
nicht vom Programm, und geht in einer Kommandoersetzung verloren. Ein Absturz sah
dadurch aus wie 'kein Treiber gefunden'. Jetzt wird der Rückgabewert ausgewertet
und ein Wert über 128 ausdrücklich als Absturz benannt. Gegen Erfolg, Absturz und
stillen Fehlschlag geprüft.

Davor steht jetzt ein xdpyinfo: ist schon der X-Server aus dem Container nicht
erreichbar, sagt jeder GL-Test darunter nichts aus.

Der wichtigere Punkt ist aber ein Denkfehler im Aufbau: S1 fragt, OB Plasma
Mobile in proot läuft — nicht, wie schnell. Die GPU zur Voraussetzung zu machen
verwechselt Machbarkeit mit Leistung. Schlägt virgl fehl, wird deshalb auf
Software-Rendering ausgewichen und weitergemacht: KWin mit QPainter-Compositor,
QtQuick mit Software-Renderer. Beide umgehen die GL-Ebene ganz und sind für eine
Oberfläche ohne Animationen brauchbarer als llvmpipe.

Damit lässt sich S1 auch dann beantworten, wenn die GPU-Anbindung noch klemmt —
und die wird zu dem, was sie ist: ein eigenes, nachgelagertes Problem.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:51:02 +02:00
StefanandClaude Opus 5 c2b602dcb4 S1: GPU im Container über virgl statt Zink — die eigentliche Ursache
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>
2026-08-10 22:46:31 +02:00
StefanandClaude Opus 5 d4a6b59f81 S1: Rückfall der Shell erkennen, Empfehlungen mitinstallieren
Die Übergabe an plasmashell ist nachweislich korrekt — geprüft, dass
${SHELL_PAKET:+-p "$SHELL_PAKET"} zu drei getrennten Wörtern expandiert. Und
beide Shells liegen auf dem Gerät: org.kde.plasma.mobileshell und
org.kde.plasma.nano. Trotzdem meldet plasmashell die Voreinstellung
org.kde.plasma.desktop als 'invalid corona'.

Das ist kein Rate-, sondern ein Ladefehler: plasmashell bekam -p, konnte die
MobileShell nicht laden und fiel zurück. Verdacht ist --no-install-recommends —
bei KDE stecken die QML-Module traditionell in den Empfehlungen, nicht in den
harten Abhängigkeiten. Die Shell ist dann formal da, aber innen hohl. Für einen
Machbarkeitsbeweis sind ein paar hundert MB zu viel das kleinere Übel gegenüber
einem Fehlschlag aus dem falschen Grund.

Zusätzlich wertet das Skript den Rückfall jetzt selbst aus und unterscheidet die
beiden Fälle: meldet plasmashell die ÜBERGEBENE Shell als ungültig, liegt es an
ihr; meldet es die Voreinstellung, ist es ein Rückfall. Davon hängt ab, wo man
weitersucht — bisher sah beides gleich aus.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:44:11 +02:00
StefanandClaude Opus 5 3643cbd5cb S1: fehlende Plasma-Shell nachinstallieren statt nur melden
In Debian liefert ausgerechnet 'plasma-mobile' keine Shell mit — nur QML-Module
und KWin-Skripte. Die Shell steckt in 'plasma-nano' und heißt org.kde.plasma.nano.
Der aus den KDE-Quellen bekannte Name org.kde.plasma.mobileshell existiert in
Debian nicht.

Auf dem Gerät kam weiterhin 'starting invalid corona org.kde.plasma.desktop' —
das ist plasmashells Standardwert, wenn kein -p übergeben wird. Die Suche fand
also nichts: das Verzeichnis /usr/share/plasma/shells ist leer oder fehlt.

Das Skript gibt sich damit nicht mehr zufrieden, sondern installiert plasma-nano
nach und sucht erneut. Bleibt es dabei, wird der Prüfbefehl genannt und klar
gesagt, dass Versuch A ohne Shell zum Scheitern verurteilt ist — dann zeigt erst
die XFCE-Gegenprobe, ob X-Server und GPU tragen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:42:20 +02:00
StefanandClaude Opus 5 ec76b785b3 README: Rückfallebene dokumentieren, wenn git pull scheitert
Der Befehl stand bisher nur in den Antworten im Chat, nicht im Repo — genau die
Sorte Wissen, die verloren geht.

Aufgenommen mit dem Grund dahinter: 'fatal: early EOF' beim Klonen ist ein
serverseitiges Problem, upload-pack stirbt beim Schnüren des Pakets, während die
Objekte heil sind. Erkennbar daran, dass sich ein Archiv weiterhin erzeugen lässt
— und genau darauf weicht init-phone.sh aus.

Ausdrücklich dabei: das Ergebnis ist ein Abzug ohne .git. 'git pull' geht damit
nicht mehr, und derselbe Befehl stellt später auch die Arbeitskopie wieder her,
sobald der Server sich erholt hat.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:37:31 +02:00
StefanandClaude Opus 5 985f48177d S1: Plasma-Shell nachsehen statt raten, Beurteilungsfrage gestaffelt
Aus dem Gerätelauf, entscheidende Zeile:

    starting invalid corona "org.kde.plasma.desktop"

Der Paketname der Mobile-Shell hat sich mit Plasma 6 geändert: aus
org.kde.plasma.phoneshell wurde org.kde.plasma.mobileshell. Der falsche Name
fällt nicht auf — plasmashell startet klaglos, meldet nur beiläufig 'invalid
corona' und zeichnet dann nichts. Von außen sieht das aus wie ein Fehlschlag von
KWin, ist aber keiner: der genestete Compositor lief.

Statt einen Namen fest einzutragen, wird jetzt nachgesehen, welche Shells unter
/usr/share/plasma/shells/ tatsächlich liegen, und in der Reihenfolge
mobileshell, phoneshell, nano, desktop gewählt. Die gefundene Liste wird
protokolliert — beim nächsten Umbenennen sieht man sofort, woran es liegt.

Dazu XCURSOR_THEME gesetzt: ohne das meldet KWin 'Failed to load cursor theme'
und zeichnet gar keinen Zeiger.

Die Beurteilungsfrage fragte nach der Bildschirmtastatur in einem Eingabefeld —
in dem Zustand, in dem sie gestellt wird, gibt es aber gar keine Felder. Sie ist
jetzt nach dem gestaffelt, was tatsächlich zu sehen ist, mit dem X-Cursor auf
schwarzem Grund als eigener Zwischenstand: X11 verbunden, aber nichts zeichnet
darauf. Genau dieser Fall lag hier vor und hatte vorher keine passende Antwort.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 22:35:55 +02:00
4 changed files with 323 additions and 47 deletions
+26
View File
@@ -79,6 +79,32 @@ Dadurch liegt dort eine echte Arbeitskopie — spätere Änderungen brauchen kei
cd ~/hpos && git pull
```
**Wenn `git pull` scheitert:**
```bash
rm -rf ~/hpos && bash /sdcard/hpos-init.sh
```
Das Startskript versucht zuerst wieder einen Klon und weicht, falls der Server keine
Pakete ausliefert, auf den Archiv-Endpunkt aus (`/archive/main.tar.gz`). Der geht
nicht über `git upload-pack` und funktioniert deshalb auch dann noch.
Das Ergebnis ist dann allerdings **ein Abzug, keine Arbeitskopie**`git pull` geht
damit nicht mehr, jede Aktualisierung braucht denselben Befehl erneut. Sobald der
Server wieder Pakete liefert, stellt genau dieser Befehl auch die Arbeitskopie
wieder her.
Typische Meldung, wenn es so weit ist:
```
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
```
Das ist ein serverseitiges Problem — `upload-pack` stirbt beim Schnüren des Pakets,
während die Objekte selbst heil sind. Erkennbar daran, dass sich ein Archiv weiterhin
erzeugen lässt.
Details, Stellschrauben und was bei Fehlschlägen zu tun ist:
[`spike/README.md`](spike/README.md).
+80 -14
View File
@@ -34,10 +34,47 @@ voraussetzungen_pruefen "$DISTRO" || {
}
# ── Alte Reste einsammeln ────────────────────────────────────────────────────
# Läufe hinterlassen Prozesse, die den nächsten stören: ein zweiter KWin findet
# den Wayland-Socket belegt, ein alter virgl-Server hält seinen Socket, und
# plasmashell hängt sich an die falsche Sitzung. Die proot-Prozesse liegen im
# selben PID-Raum wie Termux und sind von hier aus erreichbar.
#
# Bewusst NICHT mit 'pkill -f': das durchsucht die gesamte Kommandozeile und
# trifft dabei auch den eigenen Aufruf, wenn das Muster darin vorkommt. Beim
# Entwickeln dieses Blocks hat sich der Test genau so selbst abgeschossen.
# Deshalb über pgrep, mit eigener PID und Elternprozess ausgenommen.
section "Aufräumen"
pkill -f termux-x11 2>/dev/null && ok "alten X-Server beendet" || hint "kein alter X-Server"
pkill -f virgl_test_server 2>/dev/null && ok "alten virgl-Server beendet" || true
sleep 1
# Die eigene Ahnenkette. Nicht nur $$ und $PPID: wird das Skript aus einer Shell
# gestartet, deren Kommandozeile eines der Muster enthält, trifft pgrep diese
# Shell — und das Skript beendet seinen eigenen Großelternprozess. Genau das ist
# beim Entwickeln dieses Blocks passiert.
AHNEN=" "
_p=$$
while [ -n "$_p" ] && [ "$_p" != "0" ] && [ "$_p" != "1" ]; do
AHNEN="$AHNEN$_p "
_p=$(awk '{print $4}' "/proc/$_p/stat" 2>/dev/null)
done
beenden() {
local muster="$1" pid anzahl=0
for pid in $(pgrep -f "$muster" 2>/dev/null); do
case "$AHNEN" in *" $pid "*) continue ;; esac
kill "$pid" 2>/dev/null && anzahl=$((anzahl + 1))
done
if [ "$anzahl" -gt 0 ]; then ok "beendet: $muster ($anzahl)"
else hint "nichts zu beenden: $muster"; fi
}
for muster in kwin_wayland plasmashell xdg-desktop-portal \
termux-x11 virgl_test_server; do
beenden "$muster"
done
# Verwaiste Wayland-Sockets aus abgebrochenen Läufen. Bleiben sie liegen, startet
# KWin auf wayland-1 statt wayland-0 — und plasmashell sucht auf wayland-0.
rm -f /tmp/hpos-runtime/wayland-* 2>/dev/null || true
sleep 2
# ── X-Server ─────────────────────────────────────────────────────────────────
section "Termux-X11 starten"
@@ -92,16 +129,35 @@ hint "Steht es weiterhin dort, hat der X-Server keine Verbindung bekommen."
# ── GPU-Server ───────────────────────────────────────────────────────────────
section "GPU-Pfad vorbereiten ($GPU_PROFIL)"
if [ "$GPU_PROFIL" = "virgl" ] && have virgl_test_server_android; then
virgl_test_server_android >>"$LOG" 2>&1 &
sleep 1
ok "virgl-Server gestartet"
elif [ "$GPU_PROFIL" = "turnip" ]; then
ok "Turnip greift direkt auf KGSL zu — kein Proxy nötig"
else
warn "Kein GPU-Server aktiv, Software-Rendering wahrscheinlich"
# Wichtige Korrektur gegenüber der ersten Fassung: Turnip lebt in Termux'
# Verzeichnis, nicht im Debian-Rootfs. Im Container GALLIUM_DRIVER=zink zu setzen
# geht deshalb ins Leere — Zink bräuchte dort einen Vulkan-Treiber, und da ist
# keiner. Ergebnis war gar kein OpenGL, und ohne das kann QtQuick nichts zeichnen.
#
# Der tragfähige Weg führt über virgl: der Server läuft in TERMUX und nutzt dort
# den schnellen Pfad (Zink auf Turnip), der Container spricht nur virpipe mit ihm.
# Turnip bleibt also im Spiel — nur eine Ebene tiefer als gedacht.
if ! have virgl_test_server_android; then
fail "virgl_test_server_android fehlt — ohne ihn gibt es im Container kein OpenGL."
hint "Nachinstallieren: pkg install -y virglrenderer-android"
exit 1
fi
pkill -f virgl_test_server 2>/dev/null; sleep 1
if [ "$GPU_PROFIL" = "turnip" ]; then
# Der Server selbst rendert über Zink auf Turnip — dort ist der Treiber ja.
GALLIUM_DRIVER=zink MESA_LOADER_DRIVER_OVERRIDE=zink \
virgl_test_server_android >>"$LOG" 2>&1 &
ok "virgl-Server gestartet, rendert über Zink auf Turnip"
else
virgl_test_server_android >>"$LOG" 2>&1 &
ok "virgl-Server gestartet"
fi
VIRGL_PID=$!
sleep 2
kill -0 "$VIRGL_PID" 2>/dev/null && ok "läuft (PID $VIRGL_PID)" \
|| warn "virgl-Server sofort beendet — siehe Protokoll"
# ── Audio, damit der Desktop nicht schon daran scheitert ─────────────────────
section "PulseAudio"
pulseaudio --kill 2>/dev/null || true
@@ -119,7 +175,17 @@ HPOS_GPU_PROFIL="$GPU_PROFIL" HPOS_BREITE="$BREITE" HPOS_HOEHE="$HOEHE" \
proot-distro login "$DISTRO" --shared-tmp --bind "$REPO_ROOT:/hpos" -- \
bash /hpos/spike/inner/s1-plasma.sh 2>&1 | tee -a "$LOG"
verdict "S1" "Zeigt die Termux:X11-App eine bedienbare Plasma-Mobile-Oberfläche?
Prüfe: reagiert Touch, erscheint die Maliit-Tastatur beim Tippen in ein Feld?"
verdict "S1" "Was zeigt die Termux:X11-App?
log "Aufräumen: pkill -f termux-x11 ; pkill -f virgl_test_server"
[n] Nichts, oder nur 'not connected' — der X-Server kam nicht durch.
[t] Schwarze Fläche mit kleinem X-Cursor oben links.
Das heißt: X11 ist verbunden und der Server läuft, aber es zeichnet
nichts darauf. KWin oder die Plasma-Shell fehlen — halber Erfolg.
[j] Eine Plasma-Mobile-Oberfläche mit Hintergrund und Bedienelementen.
Nur bei [j] weiter prüfen: reagiert Touch auf Wischen und Tippen?
Die Bildschirmtastatur erst dort testen, wo es ein Eingabefeld gibt —
etwa in den Plasma-Einstellungen. Vorher gibt es nichts zu tippen."
log "Alles beenden: pkill -f 'kwin_wayland|plasmashell|termux-x11|virgl_test_server'"
log "(Das Skript macht das beim nächsten Start ohnehin von selbst.)"
+8
View File
@@ -94,11 +94,19 @@ bash spike/04-s4-intent-handoff.sh
```bash
cd ~/hpos && git pull
# Falls das scheitert (Server liefert keine Pakete aus):
rm -rf ~/hpos && bash /sdcard/hpos-init.sh
```
Per adb kommt bewusst nur das Startskript aufs Telefon, nicht das Repo selbst.
Dadurch liegt dort eine echte Arbeitskopie statt einer Kopie.
Der zweite Befehl weicht auf den Archiv-Endpunkt aus, wenn `git clone` am Server
scheitert. Das Ergebnis ist dann ein Abzug ohne `.git``git pull` geht damit nicht
mehr, und jede Aktualisierung braucht denselben Befehl erneut. Sobald der Server
wieder Pakete liefert, stellt er auch die Arbeitskopie wieder her.
Jedes Skript fragt am Ende nach deiner Beurteilung und schreibt sie nach
`spike/out/ergebnisse.tsv`. Rohprotokolle liegen daneben in `spike/out/*.log`.
+209 -33
View File
@@ -22,21 +22,19 @@ 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
case "$GPU_PROFIL" in
turnip)
# Zink übersetzt OpenGL auf Vulkan, Turnip liefert Vulkan direkt aus dem
# Adreno-Treiber — zusammen der schnellste Weg ohne Root.
export MESA_LOADER_DRIVER_OVERRIDE=zink
export GALLIUM_DRIVER=zink
export TU_DEBUG=noconform
;;
virgl)
export GALLIUM_DRIVER=virpipe
export MESA_GL_VERSION_OVERRIDE=4.3
;;
esac
echo " GPU-Profil: $GPU_PROFIL"
# 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
@@ -44,8 +42,14 @@ echo " GPU-Profil: $GPU_PROFIL"
if ! command -v kwin_wayland >/dev/null 2>&1; then
echo "── Installiere Plasma Mobile (einmalig, gut 1 GB) ──"
apt-get update -qq
apt-get install -y --no-install-recommends \
plasma-mobile kwin-wayland plasma-workspace maliit-keyboard \
# 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
@@ -55,12 +59,124 @@ for b in kwin_wayland plasmashell; do
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 ──"
timeout 20 glxinfo -B 2>&1 | grep -Ei 'OpenGL (renderer|version)|Device' || echo " ! glxinfo lieferte nichts"
timeout 20 vulkaninfo --summary 2>&1 | grep -Ei 'driverName|deviceName' || echo " ! vulkaninfo lieferte nichts"
echo "── Anzeige und GPU prüfen ──"
# Erst der X-Server. Wenn schon der nicht erreichbar ist, sagt jeder GL-Test
# darunter nichts aus.
if timeout 15 xdpyinfo >/tmp/hpos-xdpy.txt 2>&1; then
grep -E '^(name of display|version number|dimensions)' /tmp/hpos-xdpy.txt \
| head -3 | sed 's/^/ /'
echo " ✓ X-Server erreichbar"
else
echo " ✗ X-Server NICHT erreichbar — das wäre die Wurzel allen Übels:"
head -3 /tmp/hpos-xdpy.txt | sed 's/^/ /'
fi
# Jeden GL-Weg einzeln und mit Rückgabewert prüfen. Stürzt glxinfo ab, kommt die
# Meldung von der Shell und nicht vom Programm — sie ginge in einer
# Kommandoersetzung verloren, und die Ausgabe wäre einfach leer. Genau das ist
# vorher passiert und sah aus wie 'kein Treiber gefunden'.
gl_test() {
local name="$1"; shift
local aus rc
aus=$(env "$@" timeout 25 glxinfo -B 2>&1); rc=$?
if printf '%s' "$aus" | grep -qi 'OpenGL renderer'; then
printf '%s\n' "$aus" | grep -Ei 'OpenGL (renderer|version)' | sed 's/^/ /'
echo "$name"
return 0
fi
echo "$name — Rückgabewert $rc$([ "$rc" -gt 128 ] && echo ' (abgestürzt oder abgebrochen)')"
if [ -n "$aus" ]; then
printf '%s\n' "$aus" | head -4 | sed 's/^/ /'
else
echo " (keine Ausgabe)"
fi
return 1
}
# Ist der virgl-Socket überhaupt da? Fehlt er, hängt der Client bis zum Zeitlimit
# (Rückgabewert 124) statt eine Fehlermeldung zu liefern.
if ls /tmp/.virgl_test* >/dev/null 2>&1; then
echo " ✓ virgl-Socket sichtbar: $(ls /tmp/.virgl_test* 2>/dev/null | tr '\n' ' ')"
else
echo " ! Kein virgl-Socket unter /tmp — der Container sieht den Server nicht."
echo " (Termux legt ihn in sein tmp; proot-distro bindet das über --shared-tmp.)"
fi
if gl_test "OpenGL über virgl" GALLIUM_DRIVER=virpipe; then
GL_WEG=virgl
export GALLIUM_DRIVER=virpipe
else
# Hier war ein Denkfehler: schlugen beide Prüfungen fehl, wurde der
# Software-Pfad NICHT gesetzt — ausgerechnet dann nicht, wenn er am nötigsten
# ist. Und glxinfo taugt ohnehin nicht als Richter: unter Termux-X11
# scheitert es an X_GetImage mit BadMatch, weil es Pixel zurücklesen will.
# Das sagt etwas über glxinfo, nichts über OpenGL.
#
# Deshalb: Prüfungen nur zur Information, und im Zweifel immer den
# Software-Pfad. KWin und QtQuick haben je einen, der die GL-Ebene ganz umgeht.
gl_test "OpenGL in Software (llvmpipe)" LIBGL_ALWAYS_SOFTWARE=1 || true
GL_WEG=software
unset GALLIUM_DRIVER
export LIBGL_ALWAYS_SOFTWARE=1
export KWIN_COMPOSE=Q # KWin: QPainter statt OpenGL
export QT_QUICK_BACKEND=software
export QMLSCENE_DEVICE=softwarecontext
echo " → Weiter mit Software-Rendering (KWin QPainter, QtQuick software)."
echo " Träge, aber für S1 ausreichend: die Frage ist, OB es läuft."
echo " Ein scheiterndes glxinfo schließt das nicht aus — es prüft anders."
fi
echo " Verwendeter Weg: $GL_WEG"
# ── D-Bus ────────────────────────────────────────────────────────────────────
if [ ! -e /run/dbus/system_bus_socket ]; then
@@ -73,23 +189,83 @@ fi
# Das ist die eigentliche Wette. In diesem Modus braucht KWin weder DRM noch Seat.
echo ""
echo "── Versuch A: kwin_wayland --x11-display ──"
echo " Umgebung: GL_WEG=$GL_WEG KWIN_COMPOSE=${KWIN_COMPOSE:-nicht gesetzt}"
echo " QT_QUICK_BACKEND=${QT_QUICK_BACKEND:-nicht gesetzt}"
LOGA=/tmp/hpos-s1-versuchA.log
dbus-run-session -- kwin_wayland \
--x11-display "$DISPLAY" \
--width "$BREITE" --height "$HOEHE" \
--xwayland \
-- plasmashell -p org.kde.plasma.phoneshell \
>"$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."
# Die lange Optionsform statt '-p': kurze Formen ändern sich zwischen den
# Plasma-Fassungen leichter als lange, und eine unbekannte Kurzoption wird still
# ignoriert statt bemängelt. Genau das ist der Verdacht.
#
# Und statt einen Namen zu raten, werden die vorhandenen Shells der Reihe nach
# ausprobiert. 'invalid corona' im Protokoll ist das Abbruchkriterium — es sagt,
# dass plasmashell nichts zeichnen wird, ohne dass man hinschauen muss.
beenden_versuch() {
[ -n "${PID_A:-}" ] && kill "$PID_A" 2>/dev/null
pkill -x kwin_wayland 2>/dev/null
pkill -x plasmashell 2>/dev/null
sleep 3
}
starte_mit_shell() {
local shell="$1"
: >"$LOGA"
dbus-run-session -- kwin_wayland \
--x11-display "$DISPLAY" \
--width "$BREITE" --height "$HOEHE" \
--xwayland \
-- plasmashell ${shell:+--shell-plugin "$shell"} \
>"$LOGA" 2>&1 &
PID_A=$!
sleep 25
kill -0 "$PID_A" 2>/dev/null || return 1
grep -q 'invalid corona' "$LOGA" && return 2
return 0
}
KANDIDATEN="$SHELL_PAKET"
for w in org.kde.plasma.mobileshell org.kde.plasma.nano; do
case " $KANDIDATEN " in *" $w "*) ;; *) KANDIDATEN="$KANDIDATEN $w" ;; esac
done
ERFOLG=0
for shell in $KANDIDATEN; do
[ -d "/usr/share/plasma/shells/$shell" ] || continue
echo ""
echo " Beenden mit: pkill -f kwin_wayland"
echo " Protokoll: $LOGA"
tail -n 25 "$LOGA" 2>/dev/null | sed 's/^/ /'
echo " → Versuche Shell: $shell"
starte_mit_shell "$shell"
case $? in
0) echo " ✓ läuft, und plasmashell meldet keine ungültige Shell."
ERFOLG=1; break ;;
2) echo " ✗ 'invalid corona' — diese Shell trägt nicht."
grep 'invalid corona' "$LOGA" | tail -1 | sed 's/^/ /'
beenden_versuch ;;
*) echo " ✗ Prozess sofort beendet."
tail -n 15 "$LOGA" | sed 's/^/ /' ;;
esac
done
if [ "$ERFOLG" = 1 ] && kill -0 "$PID_A" 2>/dev/null; then
echo ""
echo " ✓ Versuch A läuft — jetzt in die Termux:X11-App wechseln und schauen."
echo " Verwendete Shell: $shell"
echo " Beenden mit: pkill -x kwin_wayland"
echo " Protokoll: $LOGA"
tail -n 20 "$LOGA" 2>/dev/null | sed 's/^/ /'
exit 0
fi
if kill -0 "${PID_A:-0}" 2>/dev/null; then
# Läuft noch, aber keine Shell hat getragen: KWin steht, plasmashell zeichnet
# nichts. Das ist ein Teilerfolg und soll auch so benannt werden — der
# Compositor ist der schwierige Teil, die Shell der austauschbare.
echo ""
echo " ! KWin läuft, aber keine der vorhandenen Shells ließ sich laden."
echo " Der Compositor ist damit bewiesen, die Shell nicht."
echo " Nächster Schritt von Hand, zeigt die eigentliche Ursache:"
echo " plasmashell --shell-plugin org.kde.plasma.mobileshell"
echo " Protokoll: $LOGA"
tail -n 20 "$LOGA" 2>/dev/null | sed 's/^/ /'
exit 0
fi