fix(xtts): Treiber-Upgrade liess die Box ohne GPU zurueck — Nachbereitung

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 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 02:34:02 +02:00
co-authored by Claude Opus 5.5
parent 9be14eef5e
commit f0d6ae63a0
+73 -7
View File
@@ -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. # 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" NV_REPO="https://developer.download.nvidia.com/compute/cuda/repos/debian13/x86_64"
MIN_DRIVER_MAJOR=575 # CUDA 12.9 braucht mindestens Treiber 575 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 if [[ "$DO_UPGRADE_DRIVER" -eq 1 ]]; then
step "NVIDIA-Treiber-Upgrade (NVIDIAs Paketquelle fuer Debian 13)" 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)" 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 if [[ -z "$CUR" ]]; then CUR="$(dpkg-query -W -f='${Version}' nvidia-driver 2>/dev/null || true)"; fi
CUR_MAJOR="${CUR%%.*}" CUR_MAJOR="${CUR%%.*}"
if [[ "$CUR_MAJOR" =~ ^[0-9]+$ && "$CUR_MAJOR" -ge "$MIN_DRIVER_MAJOR" ]]; then 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 else
ok "aktuell: ${CUR:-kein Treiber} — Ziel: >= ${MIN_DRIVER_MAJOR}" ok "aktuell: ${CUR:-kein Treiber} — Ziel: >= ${MIN_DRIVER_MAJOR}"
KEYRING_NEW=0 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-amd64 >/dev/null 2>&1 || true
apt-get install -y -qq "linux-headers-$(uname -r)" >/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 for p in nvidia-persistenced nvidia-modprobe; do
if dpkg -s "$p" >/dev/null 2>&1; then NV_PKGS="$NV_PKGS $p"; fi if dpkg -s "$p" >/dev/null 2>&1; then NV_PKGS="$NV_PKGS $p"; fi
done done
@@ -168,14 +224,24 @@ if [[ "$DO_UPGRADE_DRIVER" -eq 1 ]]; then
apt-get install -y $NV_PKGS apt-get install -y $NV_PKGS
dkms autoinstall >/dev/null 2>&1 || true dkms autoinstall >/dev/null 2>&1 || true
nv_postfix
GOT="$(dpkg-query -W -f='${Version}' nvidia-driver 2>/dev/null || echo '?')" GOT="$(dpkg-query -W -f='${Version}' nvidia-driver 2>/dev/null || echo '?')"
[[ "${GOT%%.*}" =~ ^[0-9]+$ && "${GOT%%.*}" -ge "$MIN_DRIVER_MAJOR" ]] \ [[ "${GOT%%.*}" =~ ^[0-9]+$ && "${GOT%%.*}" -ge "$MIN_DRIVER_MAJOR" ]] \
|| die "Installiert ist ${GOT} — erwartet >= ${MIN_DRIVER_MAJOR}. Bitte Ausgabe oben pruefen." || die "Installiert ist ${GOT} — erwartet >= ${MIN_DRIVER_MAJOR}. Bitte Ausgabe oben pruefen."
if dkms status 2>/dev/null | grep -q "$(uname -r).*installed"; then # -F: der Kernelname enthaelt "+" — als Regex gelesen passte er nie.
ok "Kernelmodul fuer $(uname -r) gebaut" # Geprueft wird jeder installierte Kernel (apt kann gerade einen neueren
else # mitgebracht haben, der beim Reboot startet).
warn "Kernelmodul fuer $(uname -r) nicht als gebaut gemeldet — nach dem Reboot 'nvidia-smi' pruefen" for k in /lib/modules/*/; do
fi 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" ok "nvidia-driver ${GOT} installiert"
echo echo
echo -e "${c_y}==> REBOOT noetig, damit der neue Treiber laedt:${c_0}" echo -e "${c_y}==> REBOOT noetig, damit der neue Treiber laedt:${c_0}"