Zusammenfassung
Dieser Artikel beschreibt den kompletten Prozess zur Installation der proprietären NVIDIA-Treiber auf einem Debian-Server und deren Konfiguration für die Nutzung innerhalb eines LXC-Containers. Dabei werden alle notwendigen Schritte von der Vorbereitung des Hostsystems über die Installation der Treiber bis hin zur Konfiguration des Containers inklusive der benötigten UDEV-Regeln und Zugriffskonfiguration detailliert erläutert.
Einleitung
In modernen Machine-Learning- und GPU-basierten Anwendungen ist die Nutzung spezialisierter Hardware wie NVIDIA-Grafikkarten unerlässlich. Um solche Ressourcen effizient nutzen zu können, ist es notwendig, die korrekten Treiber auf dem Hostsystem zu installieren und diese auch im Container-Umfeld verfügbar zu machen.
Die Verwendung von LXC-Containern erlaubt es, isolierte Umgebungen zu schaffen, in denen GPU-Ressourcen genutzt werden können. Jedoch erfordert dies eine sorgfältige Konfiguration, um sicherzustellen, dass die Treiber korrekt geladen werden und die Container Zugriff auf die benötigten Geräte haben.
Hintergrund
NVIDIA-Treiber sind proprietäre Softwarekomponenten, die für die Kommunikation zwischen dem Betriebssystem und der NVIDIA-GPU sorgen. Sie sind notwendig, um Hardwarebeschleunigung für Anwendungen wie Deep Learning, Rendering oder GPU-basierte Berechnungen zu ermöglichen.
Die Installation von NVIDIA-Treibern auf Linux-Systemen erfordert einige Vorbereitungsschritte, um Konflikte mit anderen Treibern wie nouveau zu vermeiden. Zudem müssen spezielle UDEV-Regeln und Kernel-Module konfiguriert werden, um den Zugriff auf die Hardware korrekt zu steuern.
Installation auf LXC Host
1. Vorbereitung des Hostsystems
Zunächst müssen die erforderlichen Pakete installiert werden, um die Treiber kompilieren und installieren zu können.
sudo apt-get update
sudo apt-get install gcc make linux-headers-amd64 build-essential
2. Blockierung des nouveau-Treiber
Um Konflikte mit dem offenen nouveau-Treiber zu vermeiden, wird dieser in der Datei /etc/modprobe.d/nvidia-installer-disable-nouveau.conf blockiert:
sudo tee /etc/modprobe.d/nvidia-installer-disable-nouveau.conf << EOF
blacklist nouveau
options nouveau modeset=0
EOF
3. Laden der NVIDIA-Module beim Boot
Um sicherzustellen, dass die NVIDIA-Module beim Systemstart geladen werden, wird folgende Zeile in /etc/modules-load.d/modules.conf hinzugefügt:
echo nvidia | sudo tee -a /etc/modules-load.d/modules.conf > /dev/null
echo nvidia_uvm | sudo tee -a /etc/modules-load.d/modules.conf > /dev/null
4. UDEV-Regeln für NVIDIA-Geräte
Um korrekte Berechtigungen für die NVIDIA-Geräte zu gewährleisten, werden folgende UDEV-Regeln erstellt:
sudo tee /etc/udev/rules.d/70-nvidia.rules << EOF
# /etc/udev/rules.d/70-nvidia.rules
# Create /nvidia0, /dev/nvidia1 … and /nvidiactl when nvidia module is loaded
KERNEL=="nvidia", RUN+="/bin/bash -c '/usr/bin/nvidia-smi -L && /bin/chmod 666 /dev/nvidia*'"
# Create the CUDA node when nvidia_uvm CUDA module is loaded
KERNEL=="nvidia_uvm", RUN+="/bin/bash -c '/usr/bin/nvidia-modprobe -c0 -u && /bin/chmod 0666 /dev/nvidia-uvm*'"
EOF
5. Download und Installation des NVIDIA-Treibers
Der Treiber wird von der offiziellen NVIDIA-Website heruntergeladen. Die aktuelle und passende Version findet man auf https://www.nvidia.com/en-us/drivers/unix/. In diesem Beispiel wird Version 580.95.05 verwendet:
wget https://download.nvidia.com/XFree86/Linux-x86_64/580.95.05/NVIDIA-Linux-x86_64-580.95.05.run
chmod +x ./NVIDIA-Linux-x86_64-580.95.05.run
sudo ./NVIDIA-Linux-x86_64-580.95.05.run
Nach der Installation wird das initramfs aktualisiert:
sudo update-initramfs -u
6. Prüfung der Treiberinstallation
Bevor der Container konfiguriert wird, sollte überprüft werden, ob die Treiber korrekt installiert wurden. Nach einem Neustart des Systems sollte die Grafikkarte korrekt erkannt werden:
$ nvidia-smi
Sat Jan 31 14:35:13 2026
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05 Driver Version: 580.95.05 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 5060 Ti Off | 00000000:61:00.0 Off | N/A |
| 0% 25C P8 6W / 180W | 15406MiB / 16311MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 2280861 C /usr/bin/ollama 15398MiB |
+-----------------------------------------------------------------------------------------+
Konfiguration des LXC Containers
Nachdem der Treiber erfolgreich installiert wurde, geht es nun an die Konfiguration eines (vorhandenen) LXC Containers.
1. Bestimmen der Geräte-IDs
Zunächst müssen die Geräte-IDs bestimmt werden, die später im Container benötigt werden:
$ ls /dev/nvidia* -l
crw-rw-rw- 1 root root 195, 0 Oct 24 07:55 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Oct 24 07:55 /dev/nvidiactl
crw-rw-rw- 1 root root 511, 255 Jan 3 18:02 /dev/nvidia-nvswitchctl
crw-rw-rw- 1 root root 510, 0 Oct 24 07:55 /dev/nvidia-uvm
crw-rw-rw- 1 root root 510, 1 Oct 24 07:55 /dev/nvidia-uvm-tools
/dev/nvidia-caps:
total 0
cr-------- 1 root root 235, 1 Oct 24 07:55 nvidia-cap1
cr--r--r-- 1 root root 235, 2 Oct 24 07:55 nvidia-cap2
Wichtig sind nun die sogenannten Major/Minor-IDs der Geräte, die jeweils zwischen Gruppenname („root“) und Datum angezeigt werden. Für diese IDs müssen wir im LXC Container die entsprechenden Berechtigungen erteilen.
2. Konfiguration des LXC Containers
Wir müssen nun die Datei /var/lib/lxc/<container-id>/config editieren, und um die folgenden Zeilen erweitern:
lxc.cgroup2.devices.allow = c 195:* rwm
lxc.cgroup2.devices.allow = c 510:* rwm
lxc.cgroup2.devices.allow = c 235:* rwm
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
#lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-caps/nvidia-cap1 dev/nvidia-caps/nvidia-cap1 none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-caps/nvidia-cap2 dev/nvidia-caps/nvidia-cap2 none bind,optional,create=file
Die Zahlen 195,510 und 235 müssen natürlich durch die entsprechenden Major-IDs von oben ersetzt werden. Nach der Anpassung der Konfiguration müssen wir den Container neu starten:
lxc-stop -n <container-id>
lxc-start -d -n <container-id>
Achtung! Nach einer Neuinstallation des NVidia-Treibers können sich diese IDs durchaus verändern, womit dann die Konfigurationsdatei angepasst werden muss.
3. Installation des gleichen Treibers im LXC Container
Der gleiche NVIDIA-Treiber muss im Container installiert werden, um korrekt zu funktionieren. D.h. wir können uns z.B. mittels lxc-attach -n <container-id> mit dem Container verbinden, und dort dann wieder den NVIDIA-Treiber installieren.
wget https://download.nvidia.com/XFree86/Linux-x86_64/580.95.05/NVIDIA-Linux-x86_64-580.95.05.run
chmod +x ./NVIDIA-Linux-x86_64-580.95.05.run
sudo ./NVIDIA-Linux-x86_64-580.95.05.run --no-nvidia-modprobe --no-kernel-modules --no-dkms
Hinweis: Da der Container ja keinen eigenen Kernel verwendet, können wir auch die Installation des Kernel modules auslassen.
4. Prüfung der Treiberinstallation
Nach erfolgreicher Konfiguration und Neustart des Containers kann nvidia-smi im Container ausgeführt werden. Es sollte eine ähnliche Ausgabe wie auf dem Host erscheinen:
$ nvidia-smi
Sat Jan 31 15:41:11
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.95.05 Driver Version: 580.95.05 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 5060 Ti Off | 00000000:61:00.0 Off | N/A |
| 0% 25C P8 6W / 180W | 15406MiB / 16311MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 2280861 C /usr/bin/ollama 15398MiB |
+-----------------------------------------------------------------------------------------+
Fazit
Die Konfiguration von NVIDIA-Treibern in LXC-Containern erfordert sorgfältige Vorbereitung sowohl auf dem Host als auch im Container. Die korrekte Zuweisung der Geräte-IDs und die Installation des gleichen Treibers in beiden Umgebungen sind entscheidend für die Funktionalität. Diese Schritte stellen sicher, dass GPU-Ressourcen im Container korrekt genutzt werden können.



