Compare commits
4
Commits
3c41623e52
...
ab4432cf84
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab4432cf84 | ||
|
|
7d0063278c | ||
|
|
488851101e | ||
|
|
603ad38fc3 |
+74
-1
@@ -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
|
||||
|
||||
@@ -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" \
|
||||
|
||||
Reference in New Issue
Block a user