Installer les pilotes nvidia sous Linux Debian

mamiemando Messages postés 33160 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 24 juin 2024 - Modifié le 29 sept. 2023 à 15:33

Installer le pilote propriétaire nvidia

Tests

En cas de problème

Alternative : Installer sur le pilote libre (nouveau)

Liens utiles

Installer le pilote propriétaire nvidia

Ce tutoriel présente comment installer les drivers propriétaires nvidia sous Debian. De nos jours il existe deux grandes méthodes :

  • Méthode 1 : via les paquets debian : c'est la méthode la plus simple et la plus propre. Le pilote est mis à jour avec le reste du système. C'est donc naturellement l'approche recommandée.
  • Méthode 2 : via le script d'installation nvidia. Cette méthode permet parfois d'avoir un driver plus récent, mais doit être refaite chaque fois que le noyau (paquet linux-image) est mis à jour.
  • Méthodes obsolètes : dans des temps reculés on pouvait utiliser envy, module-assistant, make-kpkg. Toutes ces méthodes sont aujourd'hui obsolètes.

Méthode 1 (recommandée) : via les paquets debian

1) Par défaut, debian ne propose que des paquets libres. Or le pilote nvidia est propriétaire, donc pas disponible par défaut. Pour remédier à ce problème il faut activer les dépôts contrib et non-free. Comme expliqué ici, pour les debian bookworm (debian 12) et plus récentes, un nouveau dépôt, non-free-firmware est apparu, et il faudra également l'ajouter aux dépôts.

Pour corriger les dépôts Debian utilisés par APT, on corrige le fichier /etc/apt/sources.list par exemple avec gedit :

sudo gedit /etc/apt/sources.list &

Ajouter à côté de main les mots-clés contrib, non-free, et éventuellement non-free-firmware.

Exemple :

deb http://ftp.fr.debian.org/debian/ testing main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security/ testing/updates main contrib non-free non-free-firmware
deb http://ftp.fr.debian.org/debian/ testing-updates main contrib non-free non-free-firmware


2) Installer le paquet xserver-xorg-video-nvidia :

sudo apt update
sudo apt upgrade
sudo apt install xserver-xorg-video-nvidia

3) Redémarrer.

sudo reboot

Méthode 2 (déconseillée) : Installation avec le script nvidia

1) Installer les paquets nécessaires :

sudo apt install linux-headers-$(uname -r) build-essential

2) Télécharger le script nvidia, par exemple dans /tmp (si vous choisissez un autre dossier, pensez à adapter les commandes suivantes en conséquence).

3) Passer en mode texte (ctrl alt f2, s'identifier en root) et stopper gestionnaire de connexion (typiquement lightdm, sddm, etc.) :

sudo /etc/init.d/*dm stop

4) Lancer le script d'installation :

sudo sh /tmp/NVIDIA-Linux-*.run

5) Redémarrer :

sudo reboot

Tests

Test 1 : vérifier que le module nvidia est chargé

Vérifier que le module est chargé avec la commande :

lsmod | grep nvidia

Exemple :

(mando@aldur) (~) $ lsmod | grep nvidia
nvidia_drm             53248  2
nvidia_modeset       1118208  2 nvidia_drm
nvidia              20508672  90 nvidia_modeset
ipmi_msghandler        73728  2 ipmi_devintf,nvidia
drm_kms_helper        233472  2 nvidia_drm,i915
drm                   585728  17 drm_kms_helper,nvidia_drm,i915

Test 2 : vérifier que les utilitaires nvidia fonctionnent

1) Installer le paquet nvidia-smi :

sudo apt install nvidia-smi

2) Vérifier que la carte est bien reconnue avec la commande suivante :

nvidia-smi

Exemple :

(mando@aldur) (~) $ nvidia-smi
Mon May  4 22:38:46 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.82       Driver Version: 440.82       CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce MX150       On   | 00000000:02:00.0 Off |                  N/A |
| N/A   49C    P8    N/A /  N/A |     14MiB /  2002MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0       750      G   /usr/lib/xorg/Xorg                            14MiB |
+-----------------------------------------------------------------------------+

En cas de problème

De manière générale, il faut commencer par regarder les erreurs reportées par les commandes suivantes :

lsmod | grep nvidia
grep EE /var/log/Xorg.0.log
  • La première liste les modules nvidia chargés (s'ils sont chargés). S'ils ne le sont pas il faut comprendre pourquoi. Les explications sont généralement
    • Le module nvidia n'est pas signé, mais le secure boot est activé
    • Le module nvidia n'a pas été recompilé/réinstallé pour la version de noyau actuelle.
  • La seconde liste les éventuelles erreurs au lancement du mode graphique (= serveur graphique = serveur X).

Le module nvidia n'est pas chargé

1) Vérifier la présence que le module nvidia est bien installé pour le noyau sur la machine a démarré avec la commande suivante :

ls /lib/modules/$(uname -r)/updates/dkms

Exemple : ici les modules sont bien présents

(mando@aldur) (~) $ ls /lib/modules/$(uname -r)/updates/dkms
nvidia-current-drm.ko
nvidia-current.ko
nvidia-current-modeset.ko
nvidia-current-uvm.ko

S'ils ne le sont pas, réinstaller les pilotes nvidia.

2) Tenter de charger le module nvidia à la main.

cd /lib/modules/$(uname -r)/updates/dkms
sudo modprobe nvidia

Si une l'erreur suivante apparaît :

"modprobe: ERROR: could not insert 'nvidia': Operation not permitted"

... c'est que la machine est protégée par un secure boot qui empêche à ce stade de charger le module nvidia.

Pour résoudre ce problème, deux méthodes sont possibles.

Le module nvidia n'est pas signé

Ceci ne concerne que les installations secure boot (voir section précédente) et se fait en deux étapes :

  • création de la paire de clé (une seule fois)
  • signature du pilote (à chaque mise à jour du noyau)

Création de la paire de clés

Cette étape crée deux clés(une clé privée MOK.priv et une clé publique MOK.der). Elles respectivement sont utilisées pour signer et charger le pilote nvidia. Les clés n'ont pas besoin d'être renouvelées tant qu'elle n'expirent pas. Les commandes suivantes leur donne une validité de 100 ans. Lors de la création des clés, attention à bien retenir le mot de passe. En outre, assurez-vous que vous savez le retaper avec un clavier qwerty, car votre BIOS vous demandera ce mot de passe et fonctionnera potentiellement en qwerty.

cd /root
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -days 36500 -subj "/CN=My Name/" -nodes
mokutil --import MOK.der
mokutil --list-new

Au redémarrage, une écran bleu apparaîtra donnant l'opportunité de référencer (enroll) ces clés.

  • Choisir enroll MOK puis appuyer sur entrée,
  • Choisir continue puis appuyer sur entrée,
  • Choisir confirm puis appuyer sur entrée,
  • Taper le mot de passe (selon un clavier qwerty), puis entrée
  • Puis choisir reboot et entrée.

Une fois linux démarré, on peut vérifier que le certificat X509 que l'on vient de générer est bien chargé avec la commande

dmesg | grep cert

 Il sera alors possible de signer des modules.

Signature du module

Cette étape doit être refaite à chaque mise à jour du noyau (paquet linux-image-*). Comme que vous serez amené à refaire cette étape régulièrement, on peut créer un script nommé /root/sigh.sh pour faciliter la signature :

sudo gedit /root/sign.sh &

On suppose dans le script suivant que les clés sont /root/MOK.der et /root/MOK.priv

#!/bin/bash
PRIV=/root/MOK.priv
DER=/root/MOK.der

for filename in $PRIV $DER
do
  (test -f $filename && echo "$filename found :-)") || (echo "$filename not found" && exit 1)
done

KBUILD_VER=$(uname -r | cut -d"." -f1,2)
echo "Kbuild version $KBUILD_VER"
cd /lib/modules/$(uname -r)/updates/dkms
for ko in $(ls -1 *.ko)
do
  echo "Signing $ko"
  /usr/lib/linux-kbuild-$KBUILD_VER/scripts/sign-file sha256 $PRIV $DER $ko
done

exit 0

Ensuite, on donne les droits en exécution à ce fichier et on l'exécute :

chmod a+x /root/sign.sh
/root/sign.sh

On peut vérifier que le module se charge désormais correctement :

sudo modprobe nvidia
sudo dmesg | tail
lsmod | grep nvidia

nvidia-smi et nvidia-settings ne se lancent pas

Il peut arriver que, bien que le module nvidia soit chargé (voir section précédente), mais que malgré tout, les utilitaires nvidia ne marchent pas.

1) Dans ce cas, lancer la commande :

grep EE /var/log/Xorg.0.log

2) Si ce genre d'erreur apparaît :

[   324.584] (EE) Failed to load module "nv" (module does not exist, 0)
[   324.670] (EE) NVIDIA(G0): GPU screens are not yet supported by the NVIDIA driver
[   324.670] (EE) NVIDIA(G0): Failing initialization of X screen

... comme indiqué dans cette discussion, il faut alors créer le fichier /etc/X11/xorg.conf.d/nvidia.conf :

pkexec gedit /etc/X11/xorg.conf.d/nvidia.conf &

... et copier coller dans ce fichier le contenu suivant :

Section "ServerLayout"
    Identifier "layout"
    Option "AllowNVIDIAGPUScreens"
EndSection

3) Relancer le serveur graphique

sudo /etc/init.d/*dm restart

(ou redémarrer l'ordinateur).

Écran noir

Deux explications sont possibles. Dans les deux cas, il faudra la résoudre en passant en mode texte (ctrl alt f2):

  • le module nvidia est absent (voir cas A)
  • le PC a plusieurs cartes graphiques et la carte nvidia n'est pas activée (voir cas B)

Cas A : le module nvidia est absent

  • Solution 1 : réinstaller le pilote propriétaire nvidia (se reporter à la section "Installer le pilote propriétaire nvidia")
  • Solution 2 : Installer le pilote libre nouveau (se reporter à la section "Alternative : installer le pilote libre nouveau")

Cas B : le PC a plusieurs cartes graphiques et la carte nvidia n'est pas activée.

1) Vérifier si la carte est activée de deux façons.

  • Méthode 1 : la carte nvidia est sensée apparaître dans les résultats de la commande :
lspci

Vérifier que la carte est toujours active une fois le mode graphique démarré :

grep EE /var/log/Xorg.0.log

Si l'erreur suivante apparaît :

Cannot access secondary GPU - error: [XORG] (EE) /dev/dri/card0: failed to set DRM interface version 1.4: Permission denied

.... la carte 3D est sans doute désactivée dans le BIOS.

  • Méthode 2 : installer le pilote via le script nvidia. Si ce dernier ne trouve pas la carte, alors peut-être que la carte est probablement désactivée au niveau du BIOS.

Solution : Redémarrer le PC, entrer dans le BIOS, et vérifier que la carte nvidia est bien activée (quitte à réinitialiser le BIOS avec les paramètres d'usine en cas de doute), puis réinstaller le pilote.

Écran noir au démarrage, mais pas quand on relance le mode graphique

Il peut arriver qu'au lancement de la machine, tout se charge correctement (le module nvidia, le mode graphique commence à se lancer) mais planter car il démarre trop lentement (typiquement plus de 20s). Or si on relance le mode graphique, celui-ci se lance correctement :

sudo /etc/init.d/*dm restart


Dans ce cas, l'erreur est inscrite dans /var/log/syslog (et non dans /var/log/Xorg.0.log). Elle a lieu si le serveur graphique a abandonné, car le chargement du pilote nvidia était trop long. Cela peut arriver sur des ordinateurs anciens. Il suffit alors d'augmenter ce délai dans le fichier de configuration de votre gestionnaire de connexion graphique (e.g., sddm ou lightdm)/ La commande suivante permet de voir quel gestionnaire de connexion est utilisé (il suffit alors de se référer à la documentation dudit gestionnaire de connexion pour paramétrer le délai de chargement)

ls /etc/init.d/*dm

Le mode graphique se charge, puis l'ordinateur reste bloqué

Si la machine ne réagit même pas à des raccourcis comme ctrl+alt+suppr ou un ctrl+alt+f1 alors c'est peut être une erreur noyau. Dans ce cas deux solutions sont possibles :

  • soit installer une version plus récente du pilote nvidia
  • soit désinstaller le pilote propriétaire nvidia et installer le pilote libre nouveau à la place. Désinstaller le pilote nvidia est nécessaire, car si les deux pilotes sont installés, ce sera le pilote nvidia qui prendra le pas.

Alternative : Installer sur le pilote libre (nouveau)

1) Installer le pilote nouveau

sudo apt update
sudo apt upgrade
sudo apt install xerver-xorg-video-nouveau

2) Purger le pilote nvidia

  • S'il a été installé via apt :
sudo apt purge $(dpkg -l | grep ^ii | cut -d" " -f3 | grep ^nvidia)
  • S'il a été installé par le script nvidia
sudo /tmp/NVIDIA-Linux-*.run --uninstall

3) Renommer l'éventuel fichier /etc/X11/xorg.conf afin qu'il ne soit plus pris en compte et que le mode graphique démarre avec les paramètres par défaut :

sudo mv /etc/X11/xorg.conf /etc/X11/xorg.conf.old

4) Redémarrer :

sudo reboot

Liens utiles