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
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)"
add_component() {
local file="$1" comp="$2"
# nur in Components:-Zeilen, und nur wenn das Wort noch nicht (als ganzes) da ist
if ! grep -qE "^Components:.*[[:space:]]${comp}([[:space:]]|\$)" "$file"; then
sed -i -E "s/^(Components:.*)\$/\1 ${comp}/" "$file"
return 0
fi
return 1
# Ergaenzt die drei Komponenten in JEDER Components:-Zeile einer deb822-Datei —
# pro Zeile nur was fehlt, reihenfolge-robust, idempotent. Die Adressen pruefen
# ganze Woerter (non-free-firmware zaehlt NICHT als non-free).
add_components() {
sed -i -E '/^[Cc]omponents:/{
/(^|[[:space:]])contrib([[:space:]]|$)/!s/$/ contrib/
/(^|[[:space:]])non-free([[:space:]]|$)/!s/$/ non-free/
/(^|[[:space:]])non-free-firmware([[:space:]]|$)/!s/$/ non-free-firmware/
}' "$1"
}
CHANGED=0
DEB822="/etc/apt/sources.list.d/debian.sources"
if [[ -f "$DEB822" ]]; then
for comp in contrib non-free non-free-firmware; do
if add_component "$DEB822" "$comp"; then CHANGED=1; ok "hinzugefuegt: $comp"; fi
done
[[ $CHANGED -eq 0 ]] && ok "bereits aktiv (debian.sources)"
elif [[ -f /etc/apt/sources.list ]]; then
# Legacy-Format: an die deb-Zeilen anhaengen falls noetig
if ! grep -qE "non-free-firmware" /etc/apt/sources.list; then
ENABLED_ANY=0
shopt -s nullglob
for f in /etc/apt/sources.list.d/*.sources; do
grep -qE '^[Cc]omponents:' "$f" || continue
b="$(md5sum "$f")"; add_components "$f"; a="$(md5sum "$f")"
if [[ "$b" != "$a" ]]; then ENABLED_ANY=1; ok "aktualisiert: $(basename "$f")"; fi
done
shopt -u nullglob
# Legacy /etc/apt/sources.list (deb-Zeilen)
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
CHANGED=1; ok "hinzugefuegt (sources.list)"
else
ok "bereits aktiv (sources.list)"
ENABLED_ANY=1; ok "aktualisiert: sources.list"
fi
else
warn "Keine APT-Sources gefunden — non-free ggf. manuell aktivieren."
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 ──
step "NVIDIA-Treiber"
@@ -101,6 +100,15 @@ else
warn "Treiber installiert, aber nvidia-smi antwortet nicht → REBOOT noetig."
DRIVER_ACTIVE=0
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)…"
apt-get install -y -qq nvidia-driver firmware-misc-nonfree >/dev/null
ok "nvidia-driver installiert"