Files
linux-on-android-without-root/spike/01-s1-plasma-mobile.sh
T
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

154 lines
7.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Phase 0 · Beweis S1 — Läuft Plasma Mobile in proot?
#
# Der wackligste Beweis des ganzen Projekts, deshalb zuerst. Plasma Mobile will
# Wayland, und KWin will normalerweise DRM/KMS und logind — beides gibt es ohne Root
# nicht. Die Wette: KWins X11-Backend braucht weder DRM noch Seat, wenn es genestet
# in Termux-X11 läuft.
#
# Scheitert der Beweis, wird XFCE der Hauptweg. Das ist kein Weltuntergang, ändert aber
# Kamera-Portal, Bildschirmtastatur und Telefonie-Oberfläche — siehe docs/spike-protokoll.md.
#
# Ausführen IN TERMUX: bash spike/01-s1-plasma-mobile.sh
set -uo pipefail
source "$(dirname "$0")/lib.sh"
require_termux
DISTRO=debian
# Volle Panel-Auflösung wäre 3120x1440. Für einen Telefon-Desktop ist das zu viel
# Fläche — allein das Zeichnen frisst die Leistung. Überschreibbar per Umgebung.
BREITE="${HPOS_BREITE:-1080}"
HOEHE="${HPOS_HOEHE:-2340}"
[ -f "$OUT_DIR/gpu-profil.env" ] && source "$OUT_DIR/gpu-profil.env"
GPU_PROFIL="${HPOS_GPU_PROFIL:-virgl}"
log "HPOS Phase 0 · S1 — Plasma Mobile in proot"
log "Auflösung: ${BREITE}x${HOEHE} GPU-Profil: $GPU_PROFIL"
log "Protokoll: $LOG"
voraussetzungen_pruefen "$DISTRO" || {
log ""
fail "Abbruch: die Grundlage steht nicht. S1 wäre nicht aussagekräftig."
exit 1
}
# ── Alte Reste einsammeln ────────────────────────────────────────────────────
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
# ── X-Server ─────────────────────────────────────────────────────────────────
section "Termux-X11 starten"
if ! have termux-x11; then
fail "termux-x11 fehlt. Bitte 00-bootstrap-termux.sh laufen lassen."
exit 1
fi
# Das Termux-Paket und die Termux:X11-APP sind zwei verschiedene Dinge. Fehlt die
# App, startet der X-Server anstandslos — nur sieht man nichts.
#
# Zuverlässig prüfen lässt sich das aber nicht: seit Android 11 sieht eine App
# nur noch die Pakete, die sie in ihrem Manifest anmeldet oder die ihre UID teilen.
# 'pm list packages' liefert aus Termux heraus also eine gefilterte Liste, und ein
# Nichtfinden beweist gar nichts. Deshalb nur ein Hinweis, kein Abbruch — ein
# falscher Abbruch wäre schlimmer als ein überflüssiger Hinweis.
if pm list packages 2>/dev/null | tr -d '\r' | grep -q '^package:com\.termux\.x11$'; then
ok "Termux:X11-App gefunden"
else
warn "Termux:X11-App nicht in der Paketliste — sagt wenig aus."
hint "Android filtert diese Liste seit Version 11; die App kann trotzdem da sein."
hint "Bleibt der Bildschirm später leer, hier ansetzen:"
hint " Vom Rechner: ./provision/install-termux.sh"
hint " Von Hand: https://github.com/termux/termux-x11/releases"
fi
termux-x11 :0 >>"$LOG" 2>&1 &
X11_PID=$!
sleep 3
if kill -0 "$X11_PID" 2>/dev/null; then
ok "X-Server läuft (PID $X11_PID)"
else
fail "X-Server sofort beendet — siehe Protokoll"
exit 1
fi
# Die App muss im Vordergrund sein, sonst sieht man nichts und Android drosselt.
# Hier zeigt sich auch, ob sie überhaupt existiert: 'am start' meldet einen
# Fehler, wenn es die Aktivität nicht gibt — das ist die verlässliche Prüfung,
# anders als die gefilterte Paketliste weiter oben.
log " Hole die Termux:X11-App in den Vordergrund …"
if am start --user 0 -n com.termux.x11/com.termux.x11.MainActivity >>"$LOG" 2>&1; then
ok "Termux:X11-App gestartet"
else
fail "Termux:X11-App ließ sich nicht starten — sie fehlt vermutlich."
tail -n 5 "$LOG" | sed 's/^/ /'
hint "Installieren: ./provision/install-termux.sh (vom Rechner)"
exit 1
fi
sleep 2
log " In der App sollte jetzt nicht mehr 'not connected' stehen."
hint "Steht es weiterhin dort, hat der X-Server keine Verbindung bekommen."
# ── GPU-Server ───────────────────────────────────────────────────────────────
section "GPU-Pfad vorbereiten ($GPU_PROFIL)"
# 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
try pulseaudio --start --exit-idle-time=-1 \
--load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" \
&& ok "PulseAudio läuft" || warn "PulseAudio nicht gestartet — für S1 nicht kritisch"
# ── Übergabe an Debian ───────────────────────────────────────────────────────
section "Plasma Mobile starten"
log " Ab hier läuft alles im Debian-Rootfs. Erster Lauf lädt gut 1 GB Pakete."
log " Auf dem Telefon in die Termux:X11-App wechseln, um das Ergebnis zu sehen."
log ""
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" "Was zeigt die Termux:X11-App?
[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 "Aufräumen: pkill -f termux-x11 ; pkill -f virgl_test_server"