Compare commits

...
4 Commits
Author SHA1 Message Date
StefanandClaude Opus 5 ab4432cf84 Dateikonflikte beim Upgrade gezielt auflösen
Auf dem Gerät scheiterte das Upgrade an libmagic:

  trying to overwrite '.../include/magic.h', which is also in package file 5.47

Termux hat libmagic aus dem Paket file herausgelöst. Beide bringen dieselbe Datei
mit, und dpkg verweigert grundsätzlich, wenn zwei Pakete um eine Datei streiten.
Das ist kein Defekt, sondern der normale Zwischenzustand einer Paketaufteilung —
und er blockiert danach jede weitere Installation.

Beide Skripte erkennen den Konflikt jetzt an der Meldung und wiederholen mit
--force-overwrite. Bewusst erst dann und nicht von vornherein: pauschal
mitgegeben würde die Option jede künftige Dateikollision stillschweigend
übergehen, auch eine, die auf ein echtes Problem hinweist. Die betroffene Zeile
wird vorher angezeigt, damit nachvollziehbar bleibt, was übergangen wird.

Gegen die tatsächliche Ausgabe vom Gerät geprüft: Konflikt wird erkannt, und nach
dem Rauschfilter bleiben genau die zwei Zeilen übrig, auf die es ankommt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 21:52:20 +02:00
StefanandClaude Opus 5 7d0063278c Upgrade-Abbrüche abfangen und das Rauschen filtern
Beim Wechsel der Python-Version wirft dpkg dutzende Zeilen 'unable to delete old
directory ... Directory not empty'. Das sind Warnungen — in site-packages liegen
noch .pyc-Dateien oder selbst installierte Module. Sie verdecken aber die eine
Zeile, auf die es ankommt, und werden deshalb gefiltert.

Bricht das Upgrade ab, steckt dpkg meist halb fertig fest und blockiert jede
weitere Installation. Beide Skripte versuchen jetzt 'dpkg --configure -a' und
'apt-get -f install', dann das Upgrade erneut, bevor sie aufgeben. Scheitert es
weiterhin, nennen sie den Befehl, der den echten Fehler ohne Rauschen zeigt.

Dazu eine Platzprüfung im Bootstrap gegen $PREFIX statt gegen /. In Termux zeigt
'df -h' als / die Systempartition mit oft nur zweistelligen MB — die aber nichts
mit dem Platz zu tun hat, der Termux zur Verfügung steht. Wer danach geht,
diagnostiziert am falschen Datenträger.

Der Vulkan-Treiber ist geklärt: mesa-vulkan-icd-freedreno ist verfügbar und steht
in der Kandidatenliste bereits an erster Stelle.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 21:50:18 +02:00
StefanandClaude Opus 5 488851101e Vollupgrade vor alle Paketinstallationen ziehen
Termux verträgt keine Teilupgrades: die Pakete werden gegeneinander gebaut, und
ein einzeln nachinstalliertes trifft sonst auf veraltete Abhängigkeiten. Genau
daran ist proot-distro gescheitert — es trug die Shebang-Zeile python3.13,
während eine andere Fassung installiert war.

'pkg update && pkg upgrade -y' läuft deshalb jetzt an beiden Einstiegspunkten,
jeweils vor der ersten Einzelinstallation: in init-phone.sh gleich zu Beginn, und
in 00-bootstrap-termux.sh für alle, die ohne init-phone einsteigen.

--force-confold, damit die Rückfrage nach Konfigurationsdateien den Lauf nicht
mitten in der Nacht anhält. Überspringbar mit HPOS_OHNE_UPGRADE=1 für knappes
Datenvolumen; ein Fehlschlag bricht nicht ab, wird aber deutlich als erste
Stelle zum Nachsehen benannt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 21:48:04 +02:00
StefanandClaude Opus 5 603ad38fc3 Bootstrap: proot-distro-Reparatur und Vulkan-Treiber mit Alternativen
Aus dem Gerätelauf: proot-distro trägt die Shebang-Zeile python3.13, und dieser
Interpreter fehlt. proot-distro ist inzwischen ein Python-Programm — der
klassische Termux-Teilupgrade-Fehler, bei dem ein Paket gegen eine Fassung gebaut
wurde und eine andere installiert ist.

Die Reparatur läuft in drei Stufen, von der saubersten zur unsaubersten:
python nachziehen, dann Vollupgrade (die eigentliche Lösung, denn Termux verträgt
keine Teilupgrades), und erst als Notnagel ein Verweis der fehlenden auf eine
vorhandene Python-Fassung. Der Notnagel gilt ausdrücklich nur für Python und nur
weil proot-distro reines Python ohne kompilierte Erweiterungen ist; bei anderen
Interpretern wäre das grob fahrlässig. Bleibt es defekt, nennt das Skript die
Handgriffe einzeln, statt nur aufzugeben.

Ebenfalls aus dem Lauf: mesa-vulkan-icd-wrapper gibt es unter dem Namen nicht
mehr. Die Paketnamen haben in Termux mehrfach gewechselt, deshalb werden jetzt
mehrere Kandidaten der Reihe nach probiert. Greift keiner, wird das klar benannt:
ohne Vulkan-Treiber bleibt Software-Rendering, S1 wird träge, ist aber weiterhin
aussagekräftig.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 21:42:52 +02:00
2 changed files with 205 additions and 8 deletions
+74 -1
View File
@@ -46,12 +46,85 @@ kopf "HPOS — Ersteinrichtung auf dem Telefon"
hinweis "Repo: $REPO"
[ "$ANONYM" = 1 ] && hinweis "(Benutzername entfernt — gelesen wird anonym)"
# ── Vollupgrade ──────────────────────────────────────────────────────────────
# Muss VOR jedem anderen Paket laufen. Termux verträgt keine Teilupgrades: die
# Pakete werden gegeneinander gebaut, und ein einzeln nachinstalliertes trifft
# sonst auf veraltete Abhängigkeiten. Genau daran ist proot-distro gescheitert —
# es trug die Shebang-Zeile python3.13, während eine andere Fassung installiert war.
#
# Überspringbar mit HPOS_OHNE_UPGRADE=1, etwa bei knappem Datenvolumen.
kopf "Termux auf einen Stand bringen"
if [ "${HPOS_OHNE_UPGRADE:-0}" = 1 ]; then
warn "Übersprungen (HPOS_OHNE_UPGRADE=1)"
hinweis "Bei Problemen mit proot-distro ist das die erste Stelle zum Nachsehen."
else
hinweis "Das dauert und lädt einiges. Es erspart aber genau die Fehler,"
hinweis "die sonst erst Stunden später als kaputtes proot-distro auffallen."
export DEBIAN_FRONTEND=noninteractive
# Beim Wechsel der Python-Version wirft dpkg dutzende Zeilen
# "unable to delete old directory ... Directory not empty". Das sind
# Warnungen, keine Fehler: in site-packages liegen noch .pyc-Dateien oder
# selbst installierte Module. Sie herauszufiltern ist kein Verstecken —
# sie verdecken sonst die eine Zeile, auf die es ankommt.
rauschfilter() { grep -viE 'unable to delete old directory|^(Unpacking|Preparing|Selecting) '; }
# --force-confold: vorhandene Konfiguration behalten, statt mitten im Lauf
# eine Rückfrage zu stellen, die niemand beantwortet.
AUSGABE=$(mktemp)
pkg update -y >"$AUSGABE" 2>&1; rauschfilter <"$AUSGABE"
upgrade_lauf() {
pkg upgrade -y -o Dpkg::Options::=--force-confold "$@" >"$AUSGABE" 2>&1
local rc=$?
rauschfilter <"$AUSGABE"
return $rc
}
if upgrade_lauf; then
ok "Termux ist aktuell"
else
# Dateikonflikt gezielt behandeln. Er entsteht, wenn ein Paket aufgeteilt
# wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux
# etwa libmagic, herausgelöst aus file. dpkg verweigert dann grundsätzlich.
#
# --force-overwrite wird bewusst NUR hier gesetzt, nachdem der Konflikt in
# der Ausgabe nachgewiesen ist. Pauschal mitzugeben hieße, jede künftige
# Dateikollision stillschweigend zu übergehen.
if grep -q 'which is also in package' "$AUSGABE"; then
warn "Dateikonflikt zwischen zwei Paketen — typisch bei einer Paketaufteilung."
grep 'trying to overwrite' "$AUSGABE" | head -3 | sed 's/^/ /'
hinweis "Wiederhole gezielt mit --force-overwrite."
if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then
ok "Konflikt aufgelöst, Upgrade durchgelaufen"
rm -f "$AUSGABE"
AUSGABE=""
fi
fi
if [ -n "$AUSGABE" ] && ! upgrade_lauf; then
warn "Upgrade weiterhin unvollständig — versuche dpkg zu entwirren."
# Nach einem Abbruch steckt dpkg halb fertig fest und blockiert alles.
dpkg --configure -a >>"$AUSGABE" 2>&1
apt-get -f install -y >>"$AUSGABE" 2>&1
if upgrade_lauf -o Dpkg::Options::=--force-overwrite; then
ok "Nach der Reparatur durchgelaufen"
else
warn "Bleibt unvollständig."
hinweis "Speicherplatz prüfen: df -h \$PREFIX (nicht / — das ist die Systempartition)"
hinweis "Fehler ohne Rauschen: pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20"
hinweis "Weiter geht es trotzdem — aber hier ansetzen, falls später etwas klemmt."
fi
fi
fi
rm -f "$AUSGABE" 2>/dev/null || true
fi
# ── git ──────────────────────────────────────────────────────────────────────
kopf "git"
if command -v git >/dev/null 2>&1; then
ok "bereits vorhanden ($(git --version))"
else
pkg update -y >/dev/null 2>&1
if pkg install -y git; then ok "installiert"
else fehl "Installation von git fehlgeschlagen"; exit 1; fi
fi
+131 -7
View File
@@ -23,6 +23,58 @@ try pkg update -y
try pkg install -y x11-repo tur-repo
try pkg update -y
# Vollupgrade vor allen Einzelinstallationen. Termux verträgt keine Teilupgrades:
# die Pakete werden gegeneinander gebaut, und ein einzeln nachinstalliertes trifft
# sonst auf veraltete Abhängigkeiten. Genau daran ist proot-distro gescheitert.
# init-phone.sh macht das schon; wer direkt hier einsteigt, bekommt es hier.
section "Termux auf einen Stand bringen"
if [ "${HPOS_OHNE_UPGRADE:-0}" = 1 ]; then
warn "Übersprungen (HPOS_OHNE_UPGRADE=1)"
else
export DEBIAN_FRONTEND=noninteractive
# --force-confold: vorhandene Konfiguration behalten, statt mitten im Lauf
# eine Rückfrage zu stellen, die niemand beantwortet.
if try pkg upgrade -y -o Dpkg::Options::=--force-confold; then
ok "Termux ist aktuell"
else
warn "Upgrade brach ab — versuche zu reparieren."
# Dateikonflikt gezielt behandeln: entsteht, wenn ein Paket aufgeteilt
# wurde und beide Teile kurzzeitig dieselbe Datei mitbringen — bei Termux
# etwa libmagic, herausgelöst aus file. --force-overwrite wird bewusst nur
# dann gesetzt, wenn der Konflikt im Protokoll nachgewiesen ist; pauschal
# hieße es, jede künftige Dateikollision stillschweigend zu übergehen.
if grep -q 'which is also in package' "$LOG" 2>/dev/null; then
warn "Dateikonflikt zwischen zwei Paketen erkannt:"
grep 'trying to overwrite' "$LOG" | tail -3 | sed 's/^/ /' | tee -a "$LOG"
hint "Typisch bei einer Paketaufteilung. Wiederhole mit --force-overwrite."
try pkg upgrade -y -o Dpkg::Options::=--force-confold \
-o Dpkg::Options::=--force-overwrite
fi
# Meist scheitert ein einzelnes Paket beim Auspacken, danach steckt dpkg
# halb fertig fest und blockiert jede weitere Installation.
try dpkg --configure -a
try apt-get -f install -y
if try pkg upgrade -y -o Dpkg::Options::=--force-confold \
-o Dpkg::Options::=--force-overwrite; then
ok "Nach der Reparatur durchgelaufen"
else
warn "Bleibt unvollständig."
hint "Speicherplatz: df -h \$PREFIX"
hint "Freier Platz unter etwa 1 GB ist die häufigste Ursache."
hint "Fehler ohne Rauschen: pkg upgrade -y 2>&1 | grep -viE 'unable to delete' | tail -20"
hint "Die vielen 'unable to delete old directory' sind Warnungen, keine Fehler."
fi
fi
# Platz prüfen, solange es noch nicht weh tut: das Debian-Rootfs samt Plasma
# Mobile braucht mehrere GB, und ein Abbruch mitten im Entpacken ist ärgerlicher
# als eine Warnung vorher.
FREI_KB=$(df -Pk "$PREFIX" 2>/dev/null | awk 'NR==2 {print $4}')
if [ -n "$FREI_KB" ]; then
log " Freier Speicher: $((FREI_KB / 1024)) MB"
[ "$FREI_KB" -lt 2000000 ] && warn "Unter 2 GB frei — für Debian plus Plasma Mobile knapp."
fi
fi
# ── Basispakete ──────────────────────────────────────────────────────────────
# Einzeln installiert und einzeln protokolliert: Paketnamen wandern in Termux
# gelegentlich, und wir wollen wissen, WELCHES Paket fehlt, statt nur dass etwas fehlt.
@@ -38,11 +90,33 @@ done
# zur Laufzeit; das Ergebnis landet im GPU-Profil.
section "GPU-Pakete"
GPU_PKGS=(virglrenderer-android vulkan-loader-android vulkan-tools angle-android
mesa-vulkan-icd-wrapper mesa-zink virglrenderer-mesa-zink)
mesa-zink virglrenderer-mesa-zink)
for p in "${GPU_PKGS[@]}"; do
if try pkg install -y "$p"; then ok "$p"; else warn "$p nicht verfügbar — kein Beinbruch"; fi
done
# Der Vulkan-Treiber ist der einzige GPU-Teil, der wirklich zählt: ohne ihn bleibt
# nur Software-Rendering. Die Paketnamen haben sich in Termux mehrfach geändert,
# deshalb werden mehrere Kandidaten probiert, bis einer greift.
section "Vulkan-Treiber (Turnip)"
ICD_KANDIDATEN=(mesa-vulkan-icd-freedreno mesa-vulkan-icd-wrapper
mesa-vulkan-icd-wrapper-android mesa-vulkan-icd-swrast)
ICD_GEFUNDEN=""
for p in "${ICD_KANDIDATEN[@]}"; do
if pkg install -y "$p" >>"$LOG" 2>&1; then
ICD_GEFUNDEN="$p"
ok "$p installiert"
break
fi
hint "$p — nicht verfügbar"
done
if [ -z "$ICD_GEFUNDEN" ]; then
warn "Kein Vulkan-Treiber installierbar."
hint "Ohne ihn läuft der Desktop im Software-Rendering — S1 wird träge,"
hint "sagt aber trotzdem etwas über die Machbarkeit aus."
hint "Verfügbare Kandidaten prüfen: pkg search mesa-vulkan"
fi
section "GPU erkennen"
PLATFORM="$(getprop ro.board.platform 2>/dev/null)"
HARDWARE="$(getprop ro.hardware 2>/dev/null)"
@@ -124,16 +198,66 @@ section "Debian-Rootfs"
if ! proot-distro list >/dev/null 2>&1; then
fail "proot-distro ist installiert, lässt sich aber nicht ausführen"
PD="$(command -v proot-distro)"
log " Datei: $PD"
log " Shebang: $(head -1 "$PD" 2>/dev/null)"
hint "Meist fehlt der Interpreter aus der Shebang-Zeile, nicht das Programm."
hint "Reparaturversuch:"
try pkg install -y bash coreutils proot proot-distro
SHEBANG="$(head -1 "$PD" 2>/dev/null)"
INTERPRETER="$(printf '%s' "$SHEBANG" | sed 's|^#!||; s| .*||')"
log " Datei: $PD"
log " Shebang: $SHEBANG"
log " Interpreter: ${INTERPRETER:-keiner}"
if [ -n "$INTERPRETER" ] && [ ! -x "$INTERPRETER" ]; then
fail "Der Interpreter fehlt — nicht proot-distro selbst."
log ""
log " Das ist der klassische Termux-Teilupgrade-Fehler: das Paket wurde gegen"
log " eine Fassung gebaut, installiert ist eine andere. Termux verträgt keine"
log " Teilupgrades — hier hilft nur, alles auf denselben Stand zu bringen."
# Schritt 1: fehlendes Paket nachziehen. Bei python3.x heißt es schlicht python.
case "$(basename "$INTERPRETER")" in
python3*|python) try pkg install -y python ;;
bash) try pkg install -y bash ;;
*) try pkg install -y "$(basename "$INTERPRETER")" ;;
esac
# Schritt 2: Vollupgrade. Das ist die eigentliche Reparatur.
if [ ! -x "$INTERPRETER" ]; then
log ""
warn "Reicht nicht — jetzt das Vollupgrade. Das dauert und lädt einiges."
try pkg update -y
try pkg upgrade -y
try pkg install -y proot proot-distro
fi
# Schritt 3: Notnagel. Nur für Python, und nur weil proot-distro reines
# Python ohne kompilierte Erweiterungen ist — sonst wäre eine Version
# überzustülpen grob fahrlässig.
if [ ! -x "$INTERPRETER" ]; then
case "$(basename "$INTERPRETER")" in
python3.*)
VORHANDEN="$(ls "$PREFIX/bin"/python3.* 2>/dev/null | grep -v config | head -1)"
if [ -n "$VORHANDEN" ]; then
log ""
warn "Notnagel: verweise $(basename "$INTERPRETER") auf $(basename "$VORHANDEN")"
hint "Vertretbar, weil proot-distro reines Python ist."
hint "Sauber wird es erst mit einem vollständigen 'pkg upgrade'."
ln -sf "$VORHANDEN" "$INTERPRETER" && ok "Verweis angelegt"
fi
;;
esac
fi
else
try pkg install -y bash coreutils proot proot-distro
fi
if ! proot-distro list >/dev/null 2>&1; then
fail "Bleibt defekt — ohne proot-distro geht es nicht weiter."
log ""
log " Von Hand versuchen, in dieser Reihenfolge:"
log " pkg update && pkg upgrade -y # Vollupgrade, keine Teilschritte"
log " pkg install -y python proot proot-distro"
log " termux-change-repo # falls der Spiegel unstimmig ist"
exit 1
fi
ok "Nach der Neuinstallation läuft proot-distro"
ok "proot-distro läuft wieder"
fi
if proot-distro list --installed 2>/dev/null | grep -q "^$DISTRO\b" \