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:
+73
-7
@@ -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}"
|
||||
|
||||
Reference in New Issue
Block a user