diff --git a/ai-box/bootstrap.sh b/ai-box/bootstrap.sh index 692ea9c..c87c66c 100755 --- a/ai-box/bootstrap.sh +++ b/ai-box/bootstrap.sh @@ -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"