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.

Kaya Kupferschmidt

Author Kaya Kupferschmidt

Kaya Kupferschmidt ist ein erfahrener freiberuflicher Data Architect, Data Engineer und Data Scientist. Seit 2005 beschäftigt er sich mit Daten und hat einen Doktortitel in Mathematik. Seine Expertise liegt in der Entwicklung und Implementierung robuster Datenlösungen, wobei er sich besonders für Big Data, Machine Learning und KI begeistert. Kaya verfügt über breites technologisches Wissen und setzt dabei bevorzugt auf Open-Source-Technologien.

Mehr Artikel von Kaya Kupferschmidt

Hinterlasse einen Kommentar