fix(ai-box): robuste non-free-Aktivierung + Treiber-Kandidat-Check

add_component ersetzt durch add_components: ergaenzt contrib/non-free/non-free-firmware in JEDER Components:-Zeile aller .sources-Dateien (ganze-Wort-Adressen, idempotent), verifiziert die Aenderung per md5sum statt sie nur zu melden. Vor dem nvidia-driver-Install wird der apt-Kandidat geprueft — bei fehlendem non-free klare Fehlermeldung + Anzeige der aktiven Quellen statt kryptischem 'kein Installationskandidat'.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-08-15 01:31:08 +02:00
co-authored by Claude Opus 4.8
parent c340b9d683
commit 49f6b26ab8
+33 -25
View File
@@ -60,36 +60,35 @@ apt-get update -qq
apt-get install -y -qq ca-certificates curl gnupg git lsb-release >/dev/null apt-get install -y -qq ca-certificates curl gnupg git lsb-release >/dev/null
ok "ca-certificates, curl, gnupg, git" ok "ca-certificates, curl, gnupg, git"
# ── 2. non-free Repos aktivieren (Trixie: deb822-Format) ── # ── 2. non-free Repos aktivieren (Trixie deb822 + Legacy) ──
step "APT-Komponenten (contrib non-free non-free-firmware)" step "APT-Komponenten (contrib non-free non-free-firmware)"
add_component() { # Ergaenzt die drei Komponenten in JEDER Components:-Zeile einer deb822-Datei —
local file="$1" comp="$2" # pro Zeile nur was fehlt, reihenfolge-robust, idempotent. Die Adressen pruefen
# nur in Components:-Zeilen, und nur wenn das Wort noch nicht (als ganzes) da ist # ganze Woerter (non-free-firmware zaehlt NICHT als non-free).
if ! grep -qE "^Components:.*[[:space:]]${comp}([[:space:]]|\$)" "$file"; then add_components() {
sed -i -E "s/^(Components:.*)\$/\1 ${comp}/" "$file" sed -i -E '/^[Cc]omponents:/{
return 0 /(^|[[:space:]])contrib([[:space:]]|$)/!s/$/ contrib/
fi /(^|[[:space:]])non-free([[:space:]]|$)/!s/$/ non-free/
return 1 /(^|[[:space:]])non-free-firmware([[:space:]]|$)/!s/$/ non-free-firmware/
}' "$1"
} }
CHANGED=0 ENABLED_ANY=0
DEB822="/etc/apt/sources.list.d/debian.sources" shopt -s nullglob
if [[ -f "$DEB822" ]]; then for f in /etc/apt/sources.list.d/*.sources; do
for comp in contrib non-free non-free-firmware; do grep -qE '^[Cc]omponents:' "$f" || continue
if add_component "$DEB822" "$comp"; then CHANGED=1; ok "hinzugefuegt: $comp"; fi b="$(md5sum "$f")"; add_components "$f"; a="$(md5sum "$f")"
done if [[ "$b" != "$a" ]]; then ENABLED_ANY=1; ok "aktualisiert: $(basename "$f")"; fi
[[ $CHANGED -eq 0 ]] && ok "bereits aktiv (debian.sources)" done
elif [[ -f /etc/apt/sources.list ]]; then shopt -u nullglob
# Legacy-Format: an die deb-Zeilen anhaengen falls noetig # Legacy /etc/apt/sources.list (deb-Zeilen)
if ! grep -qE "non-free-firmware" /etc/apt/sources.list; then if [[ -f /etc/apt/sources.list ]] && grep -qE '^deb ' /etc/apt/sources.list; then
if ! grep -qE '^deb .*[[:space:]]non-free([[:space:]]|$)' /etc/apt/sources.list; then
sed -i -E '/^deb .*debian/ s/$/ contrib non-free non-free-firmware/' /etc/apt/sources.list sed -i -E '/^deb .*debian/ s/$/ contrib non-free non-free-firmware/' /etc/apt/sources.list
CHANGED=1; ok "hinzugefuegt (sources.list)" ENABLED_ANY=1; ok "aktualisiert: sources.list"
else
ok "bereits aktiv (sources.list)"
fi fi
else
warn "Keine APT-Sources gefunden — non-free ggf. manuell aktivieren."
fi fi
[[ $CHANGED -eq 1 ]] && apt-get update -qq [[ $ENABLED_ANY -eq 0 ]] && ok "non-free schon aktiv"
apt-get update -qq # immer neu einlesen, damit der Kandidat sicher da ist
# ── 3. NVIDIA-Treiber ── # ── 3. NVIDIA-Treiber ──
step "NVIDIA-Treiber" step "NVIDIA-Treiber"
@@ -101,6 +100,15 @@ else
warn "Treiber installiert, aber nvidia-smi antwortet nicht → REBOOT noetig." warn "Treiber installiert, aber nvidia-smi antwortet nicht → REBOOT noetig."
DRIVER_ACTIVE=0 DRIVER_ACTIVE=0
else else
# Vor dem Install pruefen ob's ueberhaupt einen Kandidaten gibt (non-free aktiv?)
if ! apt-cache policy nvidia-driver 2>/dev/null | grep -qE '(Candidate|Installationskandidat): [0-9]'; then
echo
warn "nvidia-driver hat KEINEN Installationskandidaten — 'non-free' ist nicht aktiv."
warn "Aktive Components-/deb-Zeilen:"
grep -rhE '^[Cc]omponents:' /etc/apt/sources.list.d/*.sources 2>/dev/null | sed 's/^/ /' || true
grep -E '^deb ' /etc/apt/sources.list 2>/dev/null | sed 's/^/ /' || true
die "non-free in den APT-Quellen aktivieren (s.o.), dann Script erneut ausfuehren."
fi
warn "Installiere nvidia-driver (zieht Kernel-Modul via DKMS, dauert)…" warn "Installiere nvidia-driver (zieht Kernel-Modul via DKMS, dauert)…"
apt-get install -y -qq nvidia-driver firmware-misc-nonfree >/dev/null apt-get install -y -qq nvidia-driver firmware-misc-nonfree >/dev/null
ok "nvidia-driver installiert" ok "nvidia-driver installiert"