Page 1 sur 3
[SCRIPT] NVIDIA-switch [EN COURS]
Publié : ven. 09 oct. 2015, 11:49
par aminnairi
Bonjour à tous !
J'aimerais réaliser un script qui me permettra d'automatiser le passage d'Intel vers NVIDIA. Pour ne pas expliquer tout, j'ai choisi NVIDIA comme renderer sans passer par Optimus. J'aimerais en fait pouvoir passer de Intel à NVIDIA et vice versa.
Pour le moment, je commence par la script de nvidia vers intel (je verrais le reste plus tard et pourquoi pas les deux en un).
J'ai commencé par créer une application dans /usr/bin/nti dans lequel j'ai ajouté ceci :
Code : Tout sélectionner
#!/bin/sh
systemctl stop lxdm ; mv /etc/X11/xorg.conf.d/00-nvidia-optimus.conf ~/.00-nvidia-optimus.conf ; pacman -S --noconfirm lib32-mesa-libgl mesa-libgl ; systemctl restart lxdm
Problème N°1 : je ne sais pas comment faire un script qui démarre d'un terminal ouvert depuis mon affichage graphique, qui continue quand celui-ci s'est arrêté et qui termine en relançant l'affichage graphique.
Problème N°2 : j'ai essayé la commande
mais l'argument --noconfirm semble ne pas fonctionner. Et je n'arrive pas à trouver un équivalent à sudo apt-get install -y blabla. Le souci c'est qu'en fait mes librairies nvidia vont être remplacée par les librairies mesa, du coup il faudrait que je trouve un moyen de répondre o (oui) dans le script.

Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 11:55
par benjarobin
Le mieux à faire c'est de faire un service systemd, bien plus propre, et qui résout ton problème numéro 1.
Quand le service est "lancé" tu utilises nvidia, et quand le service est arrêté tu utilises intel.
Pour le problème numéro 2, je ne sais pas si pacman est une bonne solution (quoi que), car la base peut être verrouillé.
Les paquets *nvidia-libgl / *mesa-libgl ne contient que des liens symboliques vers les bonnes librairies. Pourquoi ne pas faire un paquet fournissant ces liens symboliques et ton script s'occupe de les gérer... Le problème d'une telle solution c'est qu'il faut maintenir les liens...
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 12:58
par aminnairi
Oui c'est une bonne idée le systemd. Je vais voir ça.
Pour ce qui est des liens symboliques j'y ait bien pensé... En solution de dernier recours car comme tu l'a dit il faudra que je les maintiennent. Bon j'vais pas faire le difficile et puis y'a un début à tout.
Merci beaucoup pour ta réponse !
Re: [SCRIPT] NVIDIA-switch [RÉSOLU]
Publié : ven. 09 oct. 2015, 13:03
par benjarobin
J'avais oublié, ce ne serait pas plus simple de ne pas installer ces paquets et de faire comme bumblebee et de jouer sur les variables d'environnement ? Car techniquement c'est comme cela que bumblebee fait la bascule des lib libgl entre mesa et nvidia
Après analyse tu as 2 chose à définir
ModulePath
du xorg.conf, associé au switch -modulepath
de Xorg, pour faire ceci. C'est lié à l'option XorgModulePath
de bumblebee.
En gros pour nvidia cela demanderait juste de définir ModulePath
à /usr/lib/nvidia/xorg/,/usr/lib/xorg/modules
- La variable d'environnement
LD_LIBRARY_PATH
. C'est lié à l'option LibraryPath=/usr/lib/nvidia:/usr/lib32/nvidia
de bumblebee.
La variable LD_LIBRARY_PATH
pourrait être définit via /etc/environment
Donc en résumé, fait un premier test, garde installé mesa-libgl, et modifie ta conf d'Xorg pour rajouter
ModulePath
, et faire un export de
LD_LIBRARY_PATH
modifié.
Pourquoi mettre le sujet résolu ? On est loin d'une belle solution finie et fonctionnelle

Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 18:32
par aminnairi
Oui tu as raison, je me suis un peu emporté...
Alors en fait je n'ai plus du tout Bumblebee !
Du coup ce que j'ai essayé de faire c'était d'enlever tout simplement les liens qui existaient dans /usr/lib/libGL* (sauf les libGLU) et j'ai essayé de faire ln -sf /usr/lib/nvidia/lib* /usr/lib/ mais ça n'a pas fonctionné.
En regardant ta réponse, ça m'a fait pensé à une variable dans le fichier de configuration de xorg. Est-ce que je peux rajouter ModulePath dans mon /etc/X11/xorg.conf.d/00-nvidia-optimus.conf ?
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 18:52
par benjarobin
je n'ai jamais dis que tu avais besoin de Bumblebee, je me suis juste inspiré de ce qui était fait côté Bumblebee. J'ai fait le parallèle donc mon explication avec Bumblebee, ce dernier à le même problème est doit switcher à la volé entre ces mesa et nvidia
aminnairi a écrit :Du coup ce que j'ai essayé de faire c'était d'enlever tout simplement les liens qui existaient dans /usr/lib/libGL* (sauf les libGLU) et j'ai essayé de faire ln -sf /usr/lib/nvidia/lib* /usr/lib/
Cela fait très scientifique un peu fou, pourquoi tester un peu au hasard... Si tu es curieux de savoir comment sont fait les liens symboliques je te conseil vivement de regarder le PKGBUILD de mesa-libgl / nvidia-libgl
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 18:57
par aminnairi
D'accord. Alors voilà ce que j'ai fait :
Fichier /etc/X11/xorg.conf.d/00-nvidia-optimus.conf modifié en rajoutant
Code : Tout sélectionner
Section "Files"
ModulePath "/usr/lib/nvidia/xorg/,/usr/lib/xorg/modules"
EndSection
Ensuite, j'ai ouvert /etc/environnement en rajoutant
Puis j'ai fait un export LD_LIBRARY_PATH
Et bien sûr j'ai installé mesa-libgl lib32-mesa-libgl. Maintenant quand je veux faire un glxgears j'obtient :
Code : Tout sélectionner
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 3 (X_GLXCreateContext)
Value in failed request: 0x0
Serial number of failed request: 35
Current serial number in output stream: 37
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:03
par benjarobin
C'est l'idée... tu y es presque

C'est
/etc/environment
, et non ce que tu as donné, le export est inutile, d'ailleurs je ne sais pas où tu l'as fait. Et la variable se nomme
LD_LIBRARY_PATH
et non
LibraryPath
, qui est l'option de Bumblebee. Donc en gros il suffit de faire
Code : Tout sélectionner
echo 'LD_LIBRARY_PATH=/usr/lib/nvidia:/usr/lib32/nvidia' >> /etc/environment
De puis ton environnement graphique, depuis une console, tu dois avoir en sortie de
echo $LD_LIBRARY_PATH
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:16
par aminnairi
J'ai essayé de taper la commande que tu m'a donné avec un échec de permission, j'ai essayé avec echo | sudo tee [...] non plus j'ai été obligé d'utiliser le sudo su et quand je reviens sur l'utilisateur et que je tape echo $LD_LIBRARY_PATH j'obtiens une grande ligne blanche alors que dans mon fichier /etc/environment j'ai bien la ligne qui a été créé. Normal docteur ?
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:17
par benjarobin
Il faut relancer ton utilisateur, fermer Xorg et tout relancer. Normalement ce fichier devrait être lu par tout bon gestionnaire de connexion, tu utilises quoi ?
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:25
par aminnairi
LXDE/LXDM et ça marche nickel chrome après un redémarrage (systemctl restart lxdm n'a pas suffit).
Maintenant, il faudrait que je puisse envoyer un # devant LD_LIBRARY_PATH=[...] du fichier /etc/environment pour le cas où je vais switcher sur ma Intel. On peut le faire avec un echo ?
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:32
par benjarobin
S'il faut redémarrer pour appliquer la modif ce n'est pas terrible, je vais trouvé un meilleur moyen
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:34
par aminnairi
Non mais je pense que c'était juste histoire d'appliquer la variable. Mais maintenant quand je ferme lxdm et que je bouge mon 00-nvidia-optimus.conf, que je rajoute un # et que je restart lxdm ça fonctionne bien (pour utiliser intel) !
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 19:57
par aminnairi
C'est bon j'ai trouvé comment rajouter un # à une ligne en utilisant sed :
sed -i '6 s/^/#/' /etc/environment
et j'utiliserai sed -i '6 s/#//' /etc/environment pour l'enlever quand j'en aurais besoin pour nvidia.
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 20:06
par aminnairi
J'avais pensé à utiliser ces deux scripts dans mon systemd du coup puisque c'est la partie finale de notre petit interrupteur magique.
Code : Tout sélectionner
#!/bin/sh
#Ce script fait passer le rendu graphique de la carte graphique dédiée vers la carte graphique intégrée
systemctl stop lxdm
mv /etc/X11/xorg.conf.d/00-nvidia-optimus.conf ~/.00-nvidia-optimus.conf
sed -i ‘6 s/^/#/’ /etc/environment
systemctl restart lxdm
Code : Tout sélectionner
#!/bin/sh
#Ce script fait passer le rendu graphique de la carte graphique intégrée vers la carte graphique dédiée
systemctl stop lxdm
mv ~/.99-nvidia-optimus.conf /etc/X11/xorg.conf.d/00-nvidia-optimus.conf
sed -i ‘6 s/a/#/’ /etc/environment
systemctl restart lxdm
EDIT : oui tu as raison, ça ne marche pas à moins de redémarrer le système. Bon même avec un vieu HDD mon installation est pas mal rapide au redémarrage (merci Arch

) mais sinon ben je laisse le sujet en standby je ferais comme ça pour l'instant.
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 20:27
par papajoke
le format du fichier /etc/environment n'est pas fixe, tu ne peut être sûr d'un numéro de ligne
il vaut mieux faire une recherche sur la clé
Code : Tout sélectionner
sed -i 's/^LD_LIBRARY_PATH/#LD_LIBRARY_PATH/' /etc/environment
sed -i 's/^#LD_LIBRARY_PATH/LD_LIBRARY_PATH/' /etc/environment
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 20:38
par aminnairi
Merci beaucoup, je vais rectifier mon script dans ce cas là.
Code : Tout sélectionner
#!/bin/bash
#Ce script fait passer le rendu graphique de la carte graphique dédiée vers la carte graphique intégrée
systemctl stop lxdm ; mv /etc/X11/xorg.conf.d/00-nvidia-optimus.conf /home/amin/.00-nvidia-optimus.conf ; sed -i 's/^LD_LIBRARY_PATH/#LD_LIBRARY_PATH/' /etc/environment ; systemctl restart lxdm
Code : Tout sélectionner
#!/bin/sh
#Ce script fait passer le rendu graphique de la carte graphique intégrée vers la carte graphique dédiée
systemctl stop lxdm ; mv /home/amin/.00-nvidia-optimus.conf /etc/X11/xorg.conf.d/00-nvidia-optimus.conf ; sed -i 's/^#LD_LIBRARY_PATH/LD_LIBRARY_PATH/' /etc/environment ; systemctl restart lxdm
Par contre j'arrive pas à tester sous tty2 parce qu'il voit les ' comme des caractères inconnus. Faut également que je cherche comment rajouter une bonne keyboard layout à mes tty.
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 22:31
par papajoke
voici une version (verbeuse) avec un véritable swich automatique :
Code : Tout sélectionner
#!/usr/bin/env bash
#Ce script fait passer le rendu graphique de la carte graphique dédiée vers la carte graphique intégrée
KEYPATH='LD_LIBRARY_PATH'
ENVFILE='/etc/environment'
if [[ $EUID -ne 0 ]]; then
echo "Erreur, ce script demande des droits administrateurs"
exit 1
fi
state=$(systemctl show display-manager.service | awk -F'=' '/^LoadState/ {print $2}')
if [ "${state}" == "loaded" ]; then
DMname=$(systemctl cat display-manager.service | awk -F'=' '/^Description/ {print $2}')
echo "on stop ${DMname}"
systemctl stop display-manager
if [ "$?" -ne 0 ]; then
echo "impossible de fermer ${DMname} ?"
exit 1
fi
fi
isset=$(grep "^${KEYPATH}" ${ENVFILE})
if [ "${isset}" != "" ]; then
echo "on charge dédiée"
sed -i "/^${KEYPATH}/ d" ${ENVFILE}
mv /etc/X11/xorg.conf.d/00-nvidia-optimus.conf /home/amin/.00-nvidia-optimus.conf ;
else
echo "on charge intégrée"
echo "${KEYPATH}=/usr/lib/nvidia:/usr/lib32/nvidia" >> ${ENVFILE}
mv /home/amin/.00-nvidia-optimus.conf /etc/X11/xorg.conf.d/00-nvidia-optimus.conf ;
fi
echo "on redémarre $DMname"
systemctl restart display-manager
non testé ...
Re: [SCRIPT] NVIDIA-switch
Publié : ven. 09 oct. 2015, 22:38
par aminnairi

le script

je testerais ça et je t'enverrais les feedback...
Après y'a juste une petite coquille Intel = intégrée NVIDIA = dédiée mais c'est pas bien grave ça se corrigera à la version 1.1

Re: [SCRIPT] NVIDIA-switch
Publié : sam. 10 oct. 2015, 22:16
par aminnairi
Donc pour les feedback :
J'ai essayé de lancer le script avec l'affichage graphique. Le seul résultat c'est l'affichage graphique qui stop. Aucun autre fichier n'a été modifié.
J'ai essayé dans un tty et pareil aucun fichier changé.
Étant donné que mes compétences en script bash sont très limités je pourrais pas en dire plus que ça mais je vais essayer de voir de mon côté.