Mise à jour : Debian 9.4
La technologie d'affichage Optimus est basée sur la combinaison d'utilisation d'une carte graphique intel et d'une carte graphique nvidia. L'objectif de cette combinaison est de réduire la consommation électrique et d'augmenter l'autonomie des PCs portables.
La carte graphique intel est utilisée par défaut
La carte graphique nvidia est mise en service à la demande pour les applications nécessitant des performances d'affichage supérieures au prix d'une consommation plus élevée.
Plusieurs mises en œuvre sont possible sous Linux. Celle décrite repose sur le projet libre bumblebee et le pilote propriétaire nvidia :
la mise sous tension à la demande, de la carte graphique nvidia est prise en charge par le paquet bbswitch-dkms
le chargement dynamique du module nvidia est fourni par le paquet bumblebee-nvidia qui fournit la commande optirun et le daemon bumblebeed
le paquet primus fournit le pont qui prend en charge la "diversion GLX" et la commande primusrun
Vérifier que les deux cartes (intel et nvidia) sont présentes et noter les identifiants numériques :
$ lspci |grep -i vga
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 GF116M [GeForce GT 555M/635M] (rev a1)
Vérifier que le module intel i915 est chargé
$ lspci -k -s 00:02
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
Subsystem: ASUSTeK Computer Inc. 2nd Generation Core Processor Family Integrated Graphics Controller
Kernel driver in use: i915
Kernel modules: i915
Désinstaller tout ce qui a trait aux pilotes nouveau et nvidia et qui aurait pu être installé antérieurement
# aptitude purge ~nnouveau ~nnvidia
$ lspci -k -s 01:00
01:00.0 VGA compatible controller: NVIDIA Corporation GF116M [GeForce GT 555M/635M] (rev a1)
Subsystem: ASUSTeK Computer Inc. GeForce GT 635M
Kernel modules: nvidia
Installer X et le pilote de la carte intel
# aptitude install xorg xserver-xorg xserver-xorg-input-all xserver-xorg-video-intel
Vérifier le bon fonctionnement de X avec la carte intel, en lançant par exemple glxgears
$ xinit -g -0 glxgears
L'installation des en-tête linux est nécessaire pour générer les modules dkms bbswitch et nvidia
$ aptitude search ~i~nlinux-image
i A linux-image-4.14.0-0.bpo.3-amd6 - Linux 4.14 for 64-bit PCs
i A linux-image-4.15.0-0.bpo.2-amd6 - Linux 4.15 for 64-bit PCs
Installer pour chaque noyau qui sera utilisé avec optimus les en-têtes correspondants, par exemple pour installer les en-têtes des noyaux listés ci-dessus
# aptitude install linux-headers-4.14.0-0.bpo.3-amd64
# aptitude install linux-headers-4.15.0-0.bpo.2-amd64
$ apt-cache policy linux-image-4.15.0-0.bpo.2-amd64
linux-image-4.15.0-0.bpo.2-amd64:
Installé : 4.15.11-1~bpo9+1
Candidat : 4.15.11-1~bpo9+1
Table de version :
*** 4.15.11-1~bpo9+1 100
100 http://ftp.debian.org/debian stretch-backports/main amd64 Packages
100 /var/lib/dpkg/status
et installer l'image et l'en-tête générique correspondant, dans le cas présent
# aptitude install -t stretch-backports linux-image-amd64 linux-headers-amd64
Installer nvidia-detect (section nonfree) et lancer la commande homonyme
# aptitude install nvidia-detect
$ nvidia-detect
Detected NVIDIA GPUs:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF116M [GeForce GT 555M/635M] [10de:1247] (rev ff)
Checking card: NVIDIA Corporation GF116M [GeForce GT 555M/635M] (rev ff)
Your card is supported by all driver versions.
It is recommended to install the
nvidia-driver
package.
Dans le cas présent, la carte est supportée par toutes les versions de driver.
Le driver nvidia sera fourni par l'intermédiaire du paquet nvidia-kernel-dkms et non par un paquet nvidia-driver-xxxx ou autre. Afficher les versions disponibles (la version du module nvidia est identique à la version nvidia-kernel-dkms)
# apt-cache policy nvidia-kernel-dkms
nvidia-kernel-dkms:
Installé : 390.48-2~bpo9+1
Candidat : 390.48-2~bpo9+1
Table de version :
*** 390.48-2~bpo9+1 100
100 http://ftp.debian.org/debian stretch-backports/non-free amd64 Packages
100 /var/lib/dpkg/status
384.130-1 500
500 http://deb.debian.org/debian stretch-proposed-updates/non-free amd64 Packages
375.82-1~deb9u1 500
500 http://deb.debian.org/debian stretch/non-free amd64 Packages
Sélectionner la version en fonction des indications fournies par nvidia-detect et en déduire le dépôt qui sera utilisé pour installer bumblebee-nvidia. Dans le cas présent, on choisit d'installer la dernière version 390.48 disponible dans les dépôts backports.
Installation de la carte graphique avec optimus / bumblebee primus
# aptitude install -t stretch-backports nvidia-kernel-dkms bumblebee-nvidia primus nvidia-detect nvidia-settings
Si le module "nouveau" est détecté, un avertissement est affiché demandant le redémarrage après l'installation pour que le blacklistage du module "nouveau" soit effectif
Si sudo est utilisé, tous les sudoers sont ajoutés automatiquement au groupe bumblebee, sinon l'ajouter.
# adduser $USER bumblebee
Redémarrer le système
Vérifier que l'utilisateur appartient au groupe bumblebee
$ cat /etc/group |grep bumblebee
Vérifier que le daemon bumblebeed est en service
$ systemctl status bumblebeed.service
● bumblebeed.service - Bumblebee C Daemon
Loaded: loaded (/lib/systemd/system/bumblebeed.service; enabled; vendor prese
Active: active (running) since Thu 2018-05-03 09:23:30 CEST; 1h 58min ago
Vérifier que les modules bbswitch et nvidia ont été intégrés au noyau (par dkms) pour la version de noyau en cours d'utilisation
# dkms status |grep $(uname -r)
bbswitch, 0.8, 4.15.0-0.bpo.2-amd64, x86_64: installed
nvidia-current, 390.48, 4.15.0-0.bpo.2-amd64, x86_64: installed
Vérifier que la version installée du module nvidia, dans le cas présent 390.48, est celle-prévue initialement.
Noter le nom du module nvidia, dans le cas présent, nvidia-current
Vérifier la mise en service de la carte nvidia lorsque optimus est en fonctionnement
$ optirun cat /proc/acpi/bbswitch
0000:01:00.0 ON
Vérifier l'arrêt de l'alimentation de la carte nvidia lorsque optimus n'est plus utilisé
$ cat /proc/acpi/bbswitch
0000:01:00.0 OFF
Vérifier le chargement du module nvidia par optirun
$ optirun lsmod |grep nvidia
nvidia_modeset 1110016 1
nvidia 14372864 78 nvidia_modeset
ipmi_msghandler 61440 2 nvidia,ipmi_devintf
Vérifier la prise en compte de glx
dans le cas de la carte intel
$ glxheads
glxheads: exercise multiple GLX connections (any key = exit)
Usage:
glxheads xdisplayname ...
Example:
glxheads :0 mars:0 venus:1
Name: :0.0
Display: 0x55d86bc1d030
Window: 0x4400002
Context: 0x55d86bc2c4e0
GL_VERSION: 3.0 Mesa 13.0.6
GL_VENDOR: Intel Open Source Technology Center
GL_RENDERER: Mesa DRI Intel(R) Sandybridge Mobile
dans le cas de la carte nvidia
$ optirun glxheads
glxheads: exercise multiple GLX connections (any key = exit)
Usage:
glxheads xdisplayname ...
Example:
glxheads :0 mars:0 venus:1
Name: :0.0
Display: 0x5575038fd3b0
Window: 0x4a00002
Context: 0x557503bbe908
GL_VERSION: 4.6.0 NVIDIA 390.48
GL_VENDOR: NVIDIA Corporation
GL_RENDERER: GeForce GT 635M/PCIe/SSE2
Si les tests ne sont pas concluants, voir la partie debuggage ci-dessous
Tester les modifications suivantes
# nano /etc/bumblebee/bumblebee.conf
Remplacer Driver= par
Driver=nvidia
Remplacer Kerneldriver=nvidia, par le nom du module fourni par dkms status (dans le cas présent nvidia-current) :
Kerneldriver=nvidia-current
# nano /etc/bumblebee/xorg.conf.nvidia
Ajouter une section "Screen"
# Suppression erreur .. Failed to load module "mouse"
Section "Screen"
Identifier "Default Screen
Device "DiscreteNvidia"
EndSection
Veiller à ce utiliser le même dépôt main ou backport etc.... que nvidia-kernel-dkms
# aptitude install -t stretch-backports nvidia-driver
Afficher les alternatives possibles pour fournir les modules nvidia et glx (utiliser update-glx ou update-alternatives)
# update-glx --list nvidia
/usr/lib/nvidia/current
# update-glx --list glx
/usr/lib/mesa-diverted
/usr/lib/nvidia
/usr/lib/nvidia/bumblebee
# update-glx --display glx |head -4
glx - mode automatique
link best version is /usr/lib/nvidia/bumblebee
le lien pointe actuellement sur /usr/lib/nvidia/bumblebee
link glx is /usr/lib/glx
# update-glx --display nvidia |head -4
nvidia - mode automatique
link best version is /usr/lib/nvidia/current
le lien pointe actuellement sur /usr/lib/nvidia/current
link nvidia is /usr/lib/nvidia/nvidia
Pour lancer le panneau de contrôle de la carte nvidia,
$ optirun -b none nvidia-settings -c :8
Optimus peut-être lancé (cf https://wiki.archlinux.org/index.php/Bumblebee) avec
optirun, exemple
$ optirun glxspheres64
avec optirun et des options de compression
$ optirun -c jpeg glxspheres64
avec optirun et primus comme "pont"
$ optirun -b primus glxspheres64
ou avec primusrun (sans options)
$ primusrun glxspheres64
Pour comparer les performances des différentes solutions, utiliser de préférence, soit directement l'application graphique visée, soit un logiciel de "benchmark", tel que GpuTest : voir Logiciels de test de processeur graphique . Résultats du test Furmark de GpuTest, obtenus avec un PC Asus N55SL et une fenêtre de 1024x640
Avec processeur graphique intel 3000 seul : 565 points - 9 FPS
Avec processeurs graphiques intel 3000 et Nvidia GeForce GT 635M :
Commande optirun : 1203 points - 20 FPS, soit un gain de performances supérieur à 2
Commande optirun -c jpeg : 1229 points - 20 FPS, soit une performance quasi identique à la commande précédente. Cette solution présente l'inconvénient d'une charge processeur beaucoup plus importante (calcul compression)
Commande optirun -b primus ou primusrun : 1319 points - 21 FPS. Ces deux commandes fournissent des résultats équivalents et les meilleures performances.