Fedora et pilotes Nvidia

Rédigé par Alexandre le 2024-11-20

#pilotes #linux #fedora #notes

En préambule de cet article, non, je n'ai pas basculé chez les verts (couleur de Nvidia) ni chez les bleus (couleur d'Intel). J'ai rédigé cet article pour mon poste de travail professionnel qui est un PC portable Dell Inc. XPS 15 9520 équipé d'un processeur Intel et d'une carte graphique secondaire Nvidia.

Je n'aime pas ces deux entreprises depuis de nombreuses années. Nvidia à cause de nombreuse mauvaise expérience passée sous Linux et pour son aversion pour l'open-source, même si cela change doucement aujourd'hui. Intel pour sa position dominante qui est resté tellement longtemps sur ces positions qu'ils ont raté le virage de l'embarqué (l'architecture ARM a avalé le marché) et s'être mangé une baffe quand son seul concurrent sur le AMD64, AMD, a su sortir une nouvelle génération de processeur moins cher et pratiquement aussi performante.

Voilà pour le préambule, place à la documentation !

Installer le pilote

L'installation se fait simplement via la commande suivante (source) :

$ sudo dnf install akmod-nvidia

La documentation de Fedora concernant Nvidia semble dire que le paramètre nvidia-drm.modeset peut être retiré des options du noyau :

$ sudo grubby --update-kernel=ALL --remove-args='nvidia-drm.modeset=1'

Pour ma part, cela provoque de gros soucis sur mon poste de travail, donc j'ajoute/m'assure que le paramètre est en place :

$ sudo grubby --update-kernel=ALL --args='nvidia-drm.modeset=1'

Ajouter la prise en charge des API avancées :

$ sudo dnf install vulkan libva-vdpau-driver libva-utils

Utiliser la version open-source :

$ sudo sh -c 'echo "%_with_kmod_nvidia_open 1" > /etc/rpm/macros.nvidia-kmod'
$ sudo akmods --kernels $(uname -r) --rebuild

Supprimer Xorg

Sur Fedora 41, seul Wayland est utilisé pour Gnome comme il est possible de le lire ici. Du coup, il est possible de faire un bon coup de ménage si vous venez d'une version précédente de Fedora (source) :

$ sudo dnf remove xorg-x11-server-Xorg

Redémarrer pour utiliser les nouveaux pilotes.

Les applications Gnome ne fonctionnent plus

A la sortie de Fedora 41, un bug était présent lié à la version des pilotes Nvidia. Cela semble corrigé via la version 565.

Vérifier la version des pilotes Nvidia :

$ nvidia-smi --version
NVIDIA-SMI version  : 560.35.03
NVML version        : 560.35
DRIVER version      : 560.35.03
CUDA Version        : 12.6

N'étant pas en version 565, j'applique la correction suivante :

$ sudo tee --append /etc/environment <<EOF
# https://discussion.fedoraproject.org/t/fedora-41-beta-upgrade-gnome-settings-and-many-default-apps-wont-open/131549/23
GSK_RENDERER=ngl
EOF

Redémarrer pour appliquer.

Vérifications

Vérifier l'utilisation du pilote open-source (source) :

$ modinfo -l nvidia
Dual MIT/GPL

Vérifier le status des cartes graphiques :

$ cat /sys/bus/pci/devices/0000:{00:02.0,01:00.0}/power/runtime_status
active
active

Oui, ici j'en ai deux parce que ma station de travail est équipée d'un processeur Intel embarquant une carte graphique (iGPU).

Vérifier la prise en charge de VDPAU :

$ sudo dnf install vdpauinfo; vdpauinfo
display: :0   screen: 0
API version: 1
Information string: NVIDIA VDPAU Driver Shared Library  560.35.03  Fri Aug 16 21:20:14 UTC 2024
[...]

Vérifier la prise ne charge de VAAPI :

$ vainfo
Trying display: wayland
libva info: VA-API version 1.22.0
libva info: Trying to open /usr/lib64/dri-nonfree/iHD_drv_video.so
libva info: Trying to open /usr/lib64/dri-freeworld/iHD_drv_video.so
libva info: Trying to open /usr/lib64/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_22
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.22 (libva 2.22.0)
vainfo: Driver version: Intel iHD driver for Intel(R) Gen Graphics - 24.3.4 ()
[...]

Forcer le GPU utilisé par une application

Grace à l'utilisation du pilote Nvidia en mode open-source, nous disposons d'un outil fort pratique qui fournit les variables d'environnements à utiliser pour lancer une application sur le GPU de notre choix.

Lister les GPU :

$ switcherooctl list
Device: 0
  Name:        Intel Corporation Alder Lake-P GT2 [Iris Xe Graphics]
  Default:     yes
  Environment: DRI_PRIME=pci-0000_00_02_0

Device: 1
  Name:        NVIDIA Corporation GA107M [GeForce RTX 3050 Ti Mobile]
  Default:     no
  Environment: __GLX_VENDOR_LIBRARY_NAME=nvidia __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only

Utiliser l'outil pour lancer une commande avec le GPU dédié (Device 1dans mon cas) :

$ switcherooctl launch -g 1 glmark2
=======================================================
    glmark2 2023.01
=======================================================
    OpenGL Information
    GL_VENDOR:      NVIDIA Corporation
    GL_RENDERER:    NVIDIA GeForce RTX 3050 Ti Laptop GPU/PCIe/SSE2
    GL_VERSION:     4.6.0 NVIDIA 560.35.03
    Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0
    Surface Size:   800x600 windowed
=======================================================
[build] use-vbo=false: FPS: 3908 FrameTime: 0.256 ms
[build] use-vbo=true: FPS: 4856 FrameTime: 0.206 ms
=======================================================
                                  glmark2 Score: 4381 
=======================================================

NB : installer glmark2 avec la commandesudo dnf install glmark2

En comparaison, sans utiliser switcherooctl :

$ glmark2
=======================================================
    glmark2 2023.01
=======================================================
    OpenGL Information
    GL_VENDOR:      Intel
    GL_RENDERER:    Mesa Intel(R) Graphics (ADL GT2)
    GL_VERSION:     4.6 (Compatibility Profile) Mesa 24.2.7
    Surface Config: buf=32 r=8 g=8 b=8 a=8 depth=24 stencil=0 samples=0
    Surface Size:   800x600 windowed
=======================================================
[build] use-vbo=false: FPS: 6128 FrameTime: 0.163 ms
=======================================================
                                  glmark2 Score: 6127 
=======================================================

Utiliser la commande switcherooctl via un terminal n'est pas très pratique, du coup dans la suite je modifie les lanceurs d'applications pour utiliser les variables d'environnement fournies par switcherooctl list.

Lanceur d'application

Copier le lanceur d'application dans l'espace utilisateur :

$ cp /usr/share/applications/glmark2.desktop ~/.local/share/applications/

Ajouter simplement les variables d'environnement fournies par switcherooctl list :

$ sed -i "s#Exec=#Exec=/usr/bin/env __GLX_VENDOR_LIBRARY_NAME=nvidia __NV_PRIME_RENDER_OFFLOAD=1 __VK_LAYER_NV_optimus=NVIDIA_only #g" ~/.local/share/applications/glmark2.desktop

NB : Utiliser les variables d'environnement correspondant au GPU que vous voulez utiliser fourni à la ligne Environment de la sortie de la commande switcherooctl list.

Mettre à jour la base de données des lanceurs :

$ update-desktop-database ~/.local/share/applications/

Dès lors, à chaque fois que vous lancerez Firefox via son lanceur (icône Gnome), il utilisera le GPU dédié.

Flatpak

J'utilise un certain nombre d'applications provenant de Flatpak.

Ici je modifie les options pour Microsoft Teams :

$ sudo flatpak override \
--env="__GLX_VENDOR_LIBRARY_NAME=nvidia" \
--env="__NV_PRIME_RENDER_OFFLOAD=1" \
--env="__VK_LAYER_NV_optimus=NVIDIA_only" \
com.github.IsmaelMartinez.teams_for_linux

Il suffit de redémarrer l'application pour que les options soient prises en charge.

Vérifier quel GPU est utilisé

Un peu flemmard sur les bords, j'utilise Resources, un visualiseur d'utilisation des ressources, dont les cartes graphiques. Du coup, une fois ouvert, il suffit d'identifier quelle carte graphique (GPU 0 ou 1) est la carte dédiée (Nvidia), puis de lancer l'application dont nous avons changé les paramètres. Une courbe d'utilisation devrait apparaître.