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

Code : Tout sélectionner

pacman -S --noconfirm lib32-mesa-libgl mesa-libgl
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.

:merci:

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. :lol:

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

Code : Tout sélectionner

LibraryPath=/usr/lib/nvidia:/usr/lib32/nvidia
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

Code : Tout sélectionner

/usr/lib/nvidia:/usr/lib32/nvidia

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 :love: ) 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
:merci: le script :bravo: 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 8)

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é.