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>
192 lines
8.9 KiB
Bash
Executable File
192 lines
8.9 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 ────────────────────────────────────────────────────
|
|
# 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"
|
|
|
|
# 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"
|
|
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 "Alles beenden: pkill -f 'kwin_wayland|plasmashell|termux-x11|virgl_test_server'"
|
|
log "(Das Skript macht das beim nächsten Start ohnehin von selbst.)"
|