Nvidia Optimus Bumblebee

Article publié, le et modifié le
17 minute(s) de lecture

Cet article contient 3559 mots.
Source brute de l'article : MD

Présentation

Info

Nvidia a créé une technologie hybride, appelée Optimus. Cette technologie a pour but d’utiliser la puce graphique intégrée, généralement de marque Intel, ainsi que le processeur graphique, couplée à la première puce, de marque Nvidia. Cela permet de faire fonctionner le GPU Nvidia, à la demande, lors de nécessités de fonctions 3D poussées (vidéos, jeux…), et de “rendre la main” à l’IGP Intel, soulageant ainsi la batterie, pour le reste.

Un développeur a créé un projet, nommé Bumblebee, qui nous apporte une certaine gestion de cette technologie. Elle n’est pas complètement gérée, mais est fonctionnelle !
Néanmoins, la gestion HDMI n’est pas accessible…

Informations

Danger

Nativement sous Linux, cette technologie n’est pas pleinement supportée.
Officiellement, depuis la version 319.12, Nvidia apporte son support, en phase bêta - cela nécessite de pouvoir connecter l’écran au GPU Nvidia ; cette option est modifiable par certains BIOS récents.
Si votre pilote est plus ancien, ou que vous n’êtes pas dans ce cas de configuration matérielle, cette page est vraiment faite pour vous.

Attention

Vérifications

Vérification matérielle

Si vous voulez être sûr d’avoir une telle technologie, entrez la commande suivante dans votre terminal préféré :
lspci | egrep "VGA|3D|Display"

Si le système vous répond, ainsi, avec deux lignes, telles que :
$ lspci | egrep "VGA|3D|Display"
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [GeForce GT 540M] (rev ff)
Alors, c’est votre cas !

Explications

  • la première information ‘01:00.0’ est relative à l’option BusID - elle peut-être différente selon votre configuration matérielle.
Info

Vérification modules kernel

Vérifiez que vous n’avez aucun des deux modules suivants installés et/ou chargés :
$ lsmod | egrep -i "nouveau|vga_switcheroo"

Si c’est le cas, il faudra les décharger, à l’aide de la commande : # modprobe -r nom-du-module

Attention

Pré-requis

Vérifier que vous avez bien les binaires, ci-dessous, installés :

  • Pour architecture 32bits :
    # apt install gcc make linux-headers-i586 dkms bbswitch-dkms
  • Pour architecture 32bits (Stretch Backports) :
    # apt install -t stretch-backports gcc make linux-headers-i686 dkms bbswitch-dkms
  • Pour architecture 64bits :
    # apt install gcc make linux-headers-amd64 dkms bbswitch-dkms

Puis, assurez-vous que le module bbswitch fonctionne bien :
# modprobe bbswitch load_state=0

Dernières vérifications

Vérifiez que vous n’avez pas de fichier de configuration /etc/X11/xorg.conf, ni de répertoire /etc/X11/xorg.conf.d/ - si c’est le cas, supprimez-le avec vos droits administrateur !


Installation

Gestion des dépôts

La page wiki du projet Debian nous informe que les utilisateurs de Jessie, et Sid peuvent installer Bumblebee à partir des dépôts officiels Debian.

Depuis le 26.05.2013, cela semble aussi le cas pour les utilisateurs des dépôts Wheezy-Backports !

Info

Ajout support architecture 32 bits

Architecture 64 bits : Pensez à ajouter la gestion de l’architecture i386, et installez en plus le package primus-libs-ia32 - anciennement primus-libs:i386 - si vous voulez faire fonctionner un binaire 32 bits.

Choisir le pilote

Mettez-à-jour votre système, et installez les binaires :

pilote nouveau

# apt update && apt install bumblebee mesa-utils

Ainsi que le fait remarquer le changelog, il est suggéré d’installer à-partir de la version 1.0.15-2 du serveur X nouveau le firmware firmware-misc-nonfree.
Si vous exécutez Buster, ou supérieure, faites-le !

pilote nvidia

# apt update && apt install bumblebee-nvidia primus nvidia-kernel-dkms nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver mesa-utils xserver-xorg-video-nvidia linux-headers-$(uname -r)

Préférez la version des backports si elle est disponible !

(En 2015, vous auriez pu subir ce bogue 735049 …)

Info

Configuration

Ajout groupe Bumblebee

Attention

Avec les droits administrateur, il vous faut ensuite ajouter votre utilisateur au groupe bumblebee :
# adduser ID_USER bumblebee

Pensez à redémarrer votre session, voire votre machine !

Configurations supplémentaires

Les configurations ci-dessous ne sont normalement pas nécessaires !

Ces informations sont utiles au cas où se pose un souci relatif à l’ utilisation .

Configuration pilote nvidia

Il peut être utile d’informer Bumblebee d’utiliser le module nvidia, au lieu du module nouveau. Par défaut, il utilise le pilote nouveau.

Avec des droits administrateur, il faut d’abord modifier le fichier /etc/bumblebee/bumblebee.conf pour configurer la ligne DRIVER=, telle que :
DRIVER=nvidia

Astuce

Pensez à redémarrer le service !

Liste noire : module nouveau

Cela peut être intéressant de “blacklister” le module nouveau, si et seulement si, vous voulez n’utiliser que le pilote privatif Nvidia.
(afin d’être sûr que ce ne sera pas ce module qui gérera la carte Nvidia, mais bien le pilote Nvidia !)

Créez, avec vos droits administrateur, le fichier /etc/modprobe.d/nouveau-blacklist.conf, et ajoutez ces écritures :
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

upgrade

Si le système ne le fait pas tout seul, comme un grand, pensez à faire courir à nouveau le module pour votre kernel, avec vos droits administrateur !

Avec la commande dkms, telle que :
# dpkg-reconfigure nvidia-kernel-dkms

Gestion de la batterie

Pour gérer correctement l’énergie de la batterie lors de l’usage de la carte Nvidia, il peut être nécessaire de créer le fichier /etc/modprobe.d/bbswitch.conf et d’y ajouter ceci - normalement le projet Bumblebee installe le paquet bbswitch et le gère correctement - :
options bbswitch load_state=0 unload_state=0

Ensuite, il vous faut modifier le fichier /etc/bumblebee/bumblebee.conf et configurer les lignes PMMethod ainsi :
PMMethod=bbswitch

Pensez à redémarrer le service !

Ensuite, testez le bon fonctionnement de la gestion de la batterie.

Steam

  1. Ajoutez la variable d’environnement OPTIMUS_PREFIX
    # sh -c 'echo OPTIMUS_PREFIX=\"primusrun\" >> /etc/environment'
  2. Déloguez-vous de votre session pour vous reconnectez !
  3. Puis, pour chaque jeu, dont vous voulez profiter d’optirun, il faut modifier les propriétés de lancement de celui-ci.
    Exécutez Steam, allez dans votre librairie de jeux, sélectionnez le jeu en question, puis faites un clic droit dessus, et choisissez le menu “Properties”.
    Ensuite, cliquez sur le bouton [SET LAUNCH OPTIONS] et spécifiez dans le champ l’information qui suit :
    $OPTIMUS_PREFIX %command%
    Une solution plus simple est d’éditer les propriétés de lancement et d’ajouter directement :
    primusrun %command%

Utilisation

Toutes les étapes précédentes de vérifications , d’ installations et de configurations , ayant été faites, vous pouvez être sûr que Bumblebee fonctionne grâce au binaire optirun.
Donc, pour activer la gestion du GPU Nvidia, il faut faire précéder toute commande par l’usage de la commande optirun.

$ optirun [optirun-options] <application> [application-parameters]

Pour trouver la liste des options de optirun, vous pouvez, soit :

  • lire la page du manuel avec la commande man optirun,
  • exécuter : $ optirun --help

Test

Le premier test que vous pouvez faire est :
$ optirun glxgears -info

Panel Nvidia

Ne cherchez pas à l’utiliser en cliquant sur l’icône correspondante, dans votre menu, cela ne fonctionnera pas.

Il vous faut le lancer ainsi - c’est le seul moyen ! - :
$ optirun nvidia-settings -c :8

Redémarrage du service bumblebeed

Selon votre version de debian :

  • Si initd : /etc/init.d/bumblebeed restart
  • Si service : service bumblebeed restart
  • Si systemd : systemctl restart bumblebeed

Dépannage

Info

Bogue 735049

ATTENTION : Depuis Janvier 2014, lors de l’installation du package bumblebee-nvidia, il est possible que vous ayez droit à un fenêtre d’avertissement vous demandant de créer le fichier xorg.conf !

  • NE LE FAITES PAS !
  • NE LAISSEZ PAS l’outil debconf créer le fichier pour vous !
  • N’EXÉCUTEZ PAS l’outil nvidia-xconfig !

Bogue 735049 qui semble être résolu depuis octobre 2015 !

[ERROR]Cannot access secondary GPU - error: Could not enable discrete graphics card

Vérifiez le journal de dmesg pour savoir si vous trouvez la référence suivante :
Refused to change power state, currently in D3

Cela semble être dû à un problème de gestion de l’ACPI (souvent retrouvés dans des portables de marque Dell) avec le noyau 4.8 et plus récent.

PMMethod=none

Éditez /etc/bumblebee/bumblebee.conf pour paramétrez PMMethod=none.

pcie_port_pm=off

Si vous utilisez le pilote nvidia, il peut être utile de modifier le fichier /etc/default/grub pour ajouter la désactivation suivante : pcie_port_pm=off

Mettez-à-jour votre grub et redémarrez votre ordinateur :
# update-grub
# shutdown -r now

source

[ERROR]Cannot access secondary GPU - error: Could not load GPU driver

Info

Modification de “Driver”

Ouvrez le fichier /etc/bumblebee/bumblebee.conf, avec les droits administrateur, et modifiez la ligne Driver= par Driver=nvidia.

Modification de “KernelDriver”

Ouvrez le fichier /etc/bumblebee/bumblebee.conf, avec les droits administrateur, et dans la section [Driver-nvidia], vérifiez la ligne KernelDriver= qu’elle soit bien ainsi KernelDriver=nvidia-current.

Pour vérifier le nom du module nvidia, exécutez les deux commandes suivantes :
# modinfo nvidia
# modinfo nvidia-current

Normalement vous devriez avoir ces retours :

# modinfo nvidia
modinfo: ERROR: Module nvidia not found.

ou, par exemple :
# modinfo nvidia-current
filename: /lib/modules/3.16.0-4-amd64/updates/dkms/nvidia-current.ko
alias: char-major-195-*
version: 340.96
supported: external
license: NVIDIA
(…)

Si jamais, vous avez un résultat sur modinfo nvidia, modifiez la ligne KernelDriver= ainsi KernelDriver=nvidia <= ce qui ne devrait pas avoir lieu !

Si aucune des deux commandes ne retourne rien, vous avez eu un souci lors de l’installation <= ce n’est pas normal ; cherchez la raison !

Bogue 717687

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

Info

Vérification xserver-xorg-video-nvidia

Vérifiez l’installation du paquet “xserver-xorg-video-nvidia” - s’il n’est pas installé, faites-le !

Modification fichier xorg.conf.nvidia

Ouvrez le fichier /etc/bumblebee/xorg.conf.nvidia, et ajoutez les informations suivantes :

Section "Screen"
Identifier "Default Screen"
Device "DiscreteNvidia"
EndSection

Bogue 756522 qui touche Debian Jessie, à-propos des Bumblebee versions : 3.2.1-5, 3.2.1-7 et nvidia versions : 340.*,

Vérification prise en charge par nouveau

  • Si vous avez installé Bumblebee pour fonctionner avec le pilote libre ‘nouveau’, vérifiez le support de votre GPU nvidia par le pilote.
  • Si votre version de GPU est bien prise en charge par le pilote ‘nouveau’, vérifiez l’écriture de l’ identifiant de Bus PCI , tel que ci-dessous.
  • S’il n’est pas pris-en-charge, installez la version “ Bumblebee+nvidia ”.

Erreur Identifiant BusPCI

Profitez-en pour vérifier l’écriture de l’identifiant du Bus PCI relatif à votre carte graphique Nvidia.

Attention

Incompatibilité Xorg >= 1.18

Si le serveur X est >= 1.18 et que votre Debian est une Testing, ou une Sid, il semble exister une incompatibilité entre le projet Bumblebee et le paquet xserver-xorg-legacy, donc virez ce dernier, s’il est installé !

source

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) Failed to load module “mouse” (module does not exist, 0)

Info

Vérifier xserver-xorg-input-mouse

Vérifiez l’installation du paquet xserver-xorg-input-mouse, si ce n’est pas le cas, faites-le !

Vérifier le fichier xorg.conf.nvidia

Vérifiez le fichier /etc/bumblebee/xorg.conf.nvidia.

Vérifier votre identifiant PCI

Vérifiez que votre identifiant de Bus PCI soit correctement écrit !

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) No devices detected

Ouvrez le fichier /etc/bumblebee/xorg.conf.nvidia, et modifiez l’option BusID. Vous trouverez cette information par l’usage de la commande lsusb

voir le chapitre Vérification !

[ERROR]Cannot access secondary GPU - error: [XORG] (EE) Problem parsing the config file

Vérifiez le fichier de configuration que vous venez de modifier !!!

Que ce soit /etc/bumblebee/xorg.config.nvidia ou /etc/bumblebee/xorg.config.nouveau, vous avez créé/modifié une section, et oublié/supprimé par erreur, de fermer correctement la section, voire une section est mal écrite !

[ERROR]Could not connect to bumblebee daemon - is it running?

Vérifiez que le service Bumblebee soit fonctionnel !

[ERROR]Unknown accel/display bridge:

Le “pont” (‘bridge’ en anglais) que vous cherchez à utiliser avec l’option -b d’optirun n’existe pas. Modifiez votre commande !!!

[ERROR]You’ve no permission to communicate with the Bumblebee daemon. Try adding yourself to the ‘bumblebee’ group

Ce message d’erreur vous informe que votre identifiant utilisateur semble ne pas être ajouté groupe bumblebee .

Ajoutez-le !

fallen off the bus

Info

Vérifiez la sortie dmesg !

Si dmesg vous informe du souci GPU suivant fallen off the bus, il y a deux manières de régler le problème :

Test “rcu_idle_gp_delay «<1”

Testez la commande suivante, avant le lancement d’optirun :
# tee /sys/module/rcutree/parameters/rcu_idle_gp_delay <<<1

Si cela fonctionne en effet correctement, modifiez le fichier /etc/default/grub pour ajouter l’information suivante à la ligne de commande GRUB_CMDLINE_LINUX_DEFAULT : rcutree.rcu_idle_gp_delay=1.

Mettez-à-jour votre grub et redémarrez votre ordinateur :
# update-grub
# shutdown -r now

Incompatibilité kernels (3.10 à 3.19)

L’autre solution est de vérifier votre version de kernel linux - en effet ce problème concerne les noyaux versions 3.10 à 3.19 !

Soit vous choisissez un noyau antérieur, soit vous upgradez sur un noyau plus récent !

Il semble que ce soit surtout un bogue Nvidia… cf Bumblebee issue 445

error while loading shared libraries: libturbojpeg.so

L’erreur complète est la suivante :
error while loading shared libraries: libturbojpeg.so: cannot open shared object file: No such file or directory

Si vous avez une architecture 32 ou 64 bits :

architecture 32 bits

Si votre architecture est 32 bits, tapez dans votre terminal console préférée, cette commande avec les droits administrateur :
# ln -s /usr/lib/i386-linux-gnu/libturbojpeg.so.0 /usr/lib/i386-linux-gnu/libturbojpeg.so

architecture 64 bits

Si votre architecture est 64 bits, tapez cette commande-ci, toujours avec les droits administrateur :
# ln -s /usr/lib/x86_64-linux-gnu/libturbojpeg.so.0 /usr/lib/x86_64-linux-gnu/libturbojpeg.so

modprobe:FATAL:Module nouveau in use

Lors de l’installation, au tout début, il vous est dit de décharger le module nouveau. Si le système vous répond l’erreur suivante : modprobe:FATAL:Module nouveau in use, il est intéressant de le désactiver lors du démarrage du noyau.

Ne vous inquiétez pas trop de ce message d’erreur, mais plutôt paramétrez le fichier de configuration de grub /etc/default/grub afin de rajouter les paramètres noyau suivants nouveau.modeset=0 et modprobe.blacklist=nouveau dans la ligne de configuration relative à GRUB_CMDLINE_LINUX_DEFAULT, telle que, par exemple :
GRUB_CMDLINE_LINUX_DEFAULT="quiet nouveau.modeset=0 modprobe.blacklist=nouveau"

Mettez-à-jour votre grub… et redémarrez votre station.

source

primus: fatal: failed to load any of the libraries: (…)/libGL.so.1

Lorsque vous exécutez optirun, vous avez le retour d’erreur suivant :

$ primus: fatal: failed to load any of the libraries: /usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1:/usr/lib/i386-linux-gnu/nvidia/libGL.so.1:/usr/lib/nvidia/libGL.so.1
/usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory
/usr/lib/i386-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory
/usr/lib/nvidia/libGL.so.1: cannot open shared object file: No such file or directory

ou :

$ primus: fatal: failed to load any of the libraries: /usr/lib/x86_64-linux-gnu/ nvidia/libGL.so.1:/usr/lib/i386-linux-gnu/nvidia/libGL.so.1:/usr/lib/nvidia/libGL.so.1
/usr/lib/x86_64-linux-gnu/nvidia/libGL.so.1: wrong ELF class: ELFCLASS64
/usr/lib/i386-linux-gnu/nvidia/libGL.so.1: cannot open shared object file: No such file or directory
/usr/lib/nvidia/libGL.so.1: cannot open shared object file: No such file or directory

  1. La première chose à tester est :
    $ primusrun glxgears
    • Si cela fonctionne, alors précéder les commandes non pas avec optirun, mais primusrun.
    • Sinon un bogue #867033 est ouvert… sachez que c’est galère à corriger, parce que même en installant les packages ci-dessous, vous ne serez pas sûr de résoudre le problème.
  2. Dans un premier temps, vérifiez que vous avez bien installé le package primus-libs-ia32.
  3. Vous pouvez essayer l’une des solutions suivantes - sachant qu’il n’y a aucune garantie de fonctionnement :
    • Exécutez primusrun en le préfixant de l’option _GLVND_DISALLOW_PATCHING=1, tel que :
      _GLVND_DISALLOW_PATCHING=1 primusrun glxgears - (cf, la réponse 22)
    • Éditez le fichier /usr/bin/primusrun, pour modifier la ligne PRIMUS_libGL=${PRIMUS_libGL:-'/usr/$LIB/primus'} par PRIMUS_libGL=${PRIMUS_libGL:-"/usr/$LIB/primus"} -
      c’est-à-dire changer les simples quotes en doubles quotes - (cf, la réponse 59)
    • Essayez l’installation des packages suivants :
      libgl1-nvidia-glx libgl1-nvidia-glx:i386 nvidia-driver-libs nvidia-driver-libs-i386

Freezes diverses

Il existe plusieurs raisons pour lesquelles le portable peut “freezer”, essayez les solutions proposées - en anglais :

Freezes lors de l’activation du serveur graphique

Freezes au boot

Test du fonctionnement de la batterie

Pour tester le fonctionnement :

  1. vous pouvez procéder ainsi en mode terminal :
    $ cat /proc/acpi/bbswitch
    0000:01:00.0 OFF
  2. Lancement d’optirun :
    $ optirun glxgears > /dev/null &
    [1] 4785
  3. Vérification de bbswitch :
    $ cat /proc/acpi/bbswitch
    0000:01:00.0 ON
  4. Arrêt d’optirun, par l’appui simultanée des touches CTRL+C :
    [VGL] ERROR: in readback--
    [VGL] 246: Window has been deleted by window manager

    [1]+ Termine 1 optirun glxgears > /dev/null
  5. Après avoir fermé la fenêtre de glxgears :
    $ cat /proc/acpi/bbswitch
    0000:01:00.0 OFF

Documentations

  • Vous pouvez retrouver un complément d’informations sur la page wiki du projet Debian
  • Sur le forum Debian-fr.org, à-partir du 23 août 2019, j’ai écrit ce complément d’informations titré "[Doc] Nvidia Optimus + Bumblebee : Dans quel état gère… [Infos]" qui montre à quel point la situation devient compliquée…
    je l’ai maintenu jusqu’en début 2020 - je n’ai de fait plus ce type d’architecture graphique !
  • J’ai écrit ce tutoriel la première fois en Janvier 2013, pour la communauté Debian-fr.xyz ;-)
  • J’ai collaboré à l’écriture de cette page wiki pour la communauté Debian-Facile.org, depuis mai 2016.