From f0d6ae63a0401cdfe63afe349d6f4391944226ba Mon Sep 17 00:00:00 2001 From: duffyduck Date: Mon, 19 Oct 2026 02:34:02 +0200 Subject: [PATCH] =?UTF-8?q?fix(xtts):=20Treiber-Upgrade=20liess=20die=20Bo?= =?UTF-8?q?x=20ohne=20GPU=20zurueck=20=E2=80=94=20Nachbereitung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nach "--upgrade-driver" + Reboot lud der freie nouveau-Treiber statt nvidia, nvidia-smi fehlte, und Docker startete keinen GPU-Container mehr ("failed to initialize NVML: Driver Not Loaded"). Zwei Stolperfallen, die in der apt-Simulation vorher nicht sichtbar waren: 1. NVIDIAs Paket "nvidia-smi" ist nur noch Doku. Das Programm — und Bibliotheken, die das Container-Toolkit braucht — steckt bei NVIDIA in "nvidia-driver-cuda". Jetzt in der Paketliste. 2. /etc/modprobe.d/nvidia.conf (sperrt nouveau) war ein Verweis ueber das Alternativen-System. Die entfernten Altpakete nehmen ihn mit, dpkg legt die neue Datei nur als nvidia.conf.dpkg-new ab. Jetzt: tote Verweise weg, .dpkg-new aktivieren (oder eigene Sperre schreiben), initramfs fuer alle Kernel neu bauen. nv_postfix laeuft nach der Installation UND, wenn der Treiber schon neu ist — ein erneuter --upgrade-driver-Lauf repariert also eine Box, die schon in diesem Zustand steckt. Idempotent; meldet nur Erfolg, wenn das Schreiben geklappt hat. Getestet gegen den nachgestellten Zustand der Box (erst Reparatur + Reboot-Hinweis, zweiter Lauf: nichts zu tun). Dazu: die DKMS-Pruefung las den Kernelnamen als Regex — "6.12.101+deb13" passte darum nie, die Warnung "nicht gebaut" war falsch. Jetzt -F, und fuer jeden installierten Kernel (apt hatte nebenbei 6.12.113 mitgebracht, der dann startete). Co-Authored-By: Claude Opus 5.5 --- xtts/bootstrap.sh | 80 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 7 deletions(-) diff --git a/xtts/bootstrap.sh b/xtts/bootstrap.sh index f20915f..50b9349 100755 --- a/xtts/bootstrap.sh +++ b/xtts/bootstrap.sh @@ -114,13 +114,62 @@ apt-get update -qq # immer neu einlesen, damit der Kandidat sicher da ist # NUR mit --upgrade-driver, damit ein laufendes Setup nicht ungewollt angefasst wird. NV_REPO="https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64" MIN_DRIVER_MAJOR=575 # CUDA 12.9 braucht mindestens Treiber 575 + +# Nachbereitung nach dem Wechsel auf NVIDIAs Pakete. Zwei Stolperfallen, die +# erst bei der echten Installation sichtbar wurden (nicht in apt -s): +# 1. NVIDIAs Paket "nvidia-smi" ist nur noch ein leeres Doku-Paket — das +# Programm (und Bibliotheken, die das Container-Toolkit braucht) steckt in +# "nvidia-driver-cuda". Ohne: kein nvidia-smi, Container ohne GPU. +# 2. /etc/modprobe.d/nvidia.conf (sperrt den freien nouveau-Treiber) war +# vorher ein Verweis ueber das Alternativen-System. Die entfernten +# Altpakete nehmen ihn mit, dpkg legt die neue Datei nur als .dpkg-new ab. +# Ohne Sperre laedt nach dem Reboot nouveau statt nvidia. +# Idempotent — repariert auch eine Box, die schon auf dem neuen Treiber ist. +nv_postfix() { + if ! command -v nvidia-smi >/dev/null 2>&1 && apt-cache show nvidia-driver-cuda >/dev/null 2>&1; then + warn "nvidia-smi fehlt — installiere nvidia-driver-cuda (enthaelt es)" + apt-get install -y nvidia-driver-cuda + fi + find /etc/modprobe.d -maxdepth 1 -name 'nvidia*.conf' -xtype l -print -delete 2>/dev/null \ + | sed 's/^/ toter Verweis entfernt: /' || true + if [[ ! -e /etc/modprobe.d/nvidia.conf && -e /etc/modprobe.d/nvidia.conf.dpkg-new ]]; then + mv /etc/modprobe.d/nvidia.conf.dpkg-new /etc/modprobe.d/nvidia.conf + ok "/etc/modprobe.d/nvidia.conf aktiviert (sperrt nouveau)" + NV_INITRAMFS=1 + fi + if ! grep -rqs "^blacklist nouveau" /etc/modprobe.d /usr/lib/modprobe.d /lib/modprobe.d; then + mkdir -p /etc/modprobe.d + if printf 'blacklist nouveau\nblacklist nova-core\n' > /etc/modprobe.d/aria-blacklist-nouveau.conf; then + ok "nouveau gesperrt (/etc/modprobe.d/aria-blacklist-nouveau.conf)" + NV_INITRAMFS=1 + else + warn "nouveau-Sperre konnte nicht geschrieben werden — nach dem Reboot laedt evtl. nouveau statt nvidia" + fi + fi + if [[ "${NV_INITRAMFS:-0}" -eq 1 ]] || lsmod | grep -q '^nouveau'; then + if update-initramfs -u -k all >/dev/null 2>&1; then + ok "initramfs neu gebaut (Sperre greift schon beim Booten)" + else + warn "update-initramfs fehlgeschlagen — bitte von Hand: update-initramfs -u -k all" + fi + NV_NEED_REBOOT=1 + fi +} if [[ "$DO_UPGRADE_DRIVER" -eq 1 ]]; then step "NVIDIA-Treiber-Upgrade (NVIDIAs Paketquelle fuer Debian 13)" CUR="$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | head -1 || true)" if [[ -z "$CUR" ]]; then CUR="$(dpkg-query -W -f='${Version}' nvidia-driver 2>/dev/null || true)"; fi CUR_MAJOR="${CUR%%.*}" if [[ "$CUR_MAJOR" =~ ^[0-9]+$ && "$CUR_MAJOR" -ge "$MIN_DRIVER_MAJOR" ]]; then - ok "Treiber ${CUR} ist neu genug (>= ${MIN_DRIVER_MAJOR}) — nichts zu tun" + ok "Treiber ${CUR} ist neu genug (>= ${MIN_DRIVER_MAJOR})" + nv_postfix + if lsmod | grep -q '^nouveau' || ! nvidia-smi >/dev/null 2>&1; then + echo + echo -e "${c_y}==> REBOOT noetig (nouveau ist noch geladen / Treiber noch nicht aktiv):${c_0}" + echo -e "${c_y} sudo reboot → danach: nvidia-smi und cd xtts && docker compose up -d${c_0}" + exit 0 + fi + ok "nvidia-smi laeuft, nouveau nicht geladen — alles in Ordnung" else ok "aktuell: ${CUR:-kein Treiber} — Ziel: >= ${MIN_DRIVER_MAJOR}" KEYRING_NEW=0 @@ -135,7 +184,14 @@ if [[ "$DO_UPGRADE_DRIVER" -eq 1 ]]; then apt-get install -y -qq linux-headers-amd64 >/dev/null 2>&1 || true apt-get install -y -qq "linux-headers-$(uname -r)" >/dev/null 2>&1 || true - NV_PKGS="nvidia-driver nvidia-kernel-dkms nvidia-smi libcuda1" + NV_PKGS="nvidia-driver nvidia-kernel-dkms libcuda1" + # Bei NVIDIA steckt nvidia-smi in nvidia-driver-cuda (das Paket "nvidia-smi" + # ist dort leer). Fallback fuer eine Quelle, die es anders schneidet. + if apt-cache show nvidia-driver-cuda >/dev/null 2>&1; then + NV_PKGS="$NV_PKGS nvidia-driver-cuda" + else + NV_PKGS="$NV_PKGS nvidia-smi" + fi for p in nvidia-persistenced nvidia-modprobe; do if dpkg -s "$p" >/dev/null 2>&1; then NV_PKGS="$NV_PKGS $p"; fi done @@ -168,14 +224,24 @@ if [[ "$DO_UPGRADE_DRIVER" -eq 1 ]]; then apt-get install -y $NV_PKGS dkms autoinstall >/dev/null 2>&1 || true + nv_postfix GOT="$(dpkg-query -W -f='${Version}' nvidia-driver 2>/dev/null || echo '?')" [[ "${GOT%%.*}" =~ ^[0-9]+$ && "${GOT%%.*}" -ge "$MIN_DRIVER_MAJOR" ]] \ || die "Installiert ist ${GOT} — erwartet >= ${MIN_DRIVER_MAJOR}. Bitte Ausgabe oben pruefen." - if dkms status 2>/dev/null | grep -q "$(uname -r).*installed"; then - ok "Kernelmodul fuer $(uname -r) gebaut" - else - warn "Kernelmodul fuer $(uname -r) nicht als gebaut gemeldet — nach dem Reboot 'nvidia-smi' pruefen" - fi + # -F: der Kernelname enthaelt "+" — als Regex gelesen passte er nie. + # Geprueft wird jeder installierte Kernel (apt kann gerade einen neueren + # mitgebracht haben, der beim Reboot startet). + for k in /lib/modules/*/; do + k="$(basename "$k")" + if [[ -d "/usr/src/linux-headers-$k" ]]; then + if dkms status 2>/dev/null | grep -F "$k" | grep -q installed; then + ok "Kernelmodul fuer $k gebaut" + else + warn "Kernelmodul fuer $k NICHT gebaut — vor dem Reboot: dkms autoinstall -k $k" + fi + fi + done + command -v nvidia-smi >/dev/null 2>&1 || warn "nvidia-smi fehlt nach der Installation — bitte melden" ok "nvidia-driver ${GOT} installiert" echo echo -e "${c_y}==> REBOOT noetig, damit der neue Treiber laedt:${c_0}"