Seite 1 von 1

Optimus - umschalten zwischen Nvidia und Intel, ganz bequem!

Verfasst: Mittwoch 26. April 2017, 12:02
von Amber
Einrichten von Optimus in der neuesten Arch-Version Stand 1.3.2017
siehe

Code: Alles auswählen

https://bbs.archlinux.de/viewtopic.php?id=30219
Zuerst möchte ich die evtl auftretenen Probleme, je nach System, beschreiben.
Es kann vorkommen das Konfigurationsdateien doppelt sind. Einmal in /etc/X11/(xorg.conf.d), /etc/modprobe.d(/modules-load.d) und unter /usr/share/X11/(xorg.conf.d) bezw. /usr/lib/modprobe.d (/modules-load.d). Dies sollte unbedingt vermieden werden!
Also unter /etc/... nichts, dieses Script nutzt nur /usr..... zumal beim Nvidia-Update durchaus mal eine config unter /usr.... landet.


Anmerkung:
Unter Manjaro sollte man die Verzeichnisse ebenfalls so erstellen und die mhwd‘s unberührt lassen, ausser die Dateien in modprobe.d sowie modules-load.d sollten keinen Inhalt haben aber vorhanden sein.

Optimus:
Es greifen mehrere Scripte und Configurationsdateien ineinander. Diese sind:
1. 60-prime-provider-sh in /etc/X11/xinit/ xinitrc.d/
2. prime.offload in /sbin/
3. prime-next-gpu in /bin/
4. prime-select in /bin/
5. und die Config prime-next-gpu.conf in /etc/ sowie die intel.conf und die nvidia.conf in /usr/share/X11/config.d

Prinzip:
der Script prime-next-gpu überprüft ob die prime-next-gpu.conf vorhanden ist (wird gegebenfalls erstellt), fragt die prime-next-gpu.conf ab und übernimmt den Wert für prime-select. Nun startet dieser Script /bin/prime-select und übernimmt den entsprechenden Wert von prime-next-gpu. Jetzt setzt  prime-select die entsprechenden Configurationsdateien wie ein Link in /usr/share/X11/xorg.conf.d.

Weiter wird in /usr/lib/modprobe.d und /usr/lib/modules-load.d die Konfigurationsdateien gpu-driver.conf angelegt (sofern nicht vorhanden).

Der Script prime-offload wird über xinitrc.d/60-prime-provider.sh gestartet und nur ausgeführt wenn das Modul nvidia geladen ist nun werden die Provider gesucht, zuletzt wird xrandr --setprovideroutputsource "$sink" "$src" sowie xrandr –auto oder je nach dem was man braucht. Beispiel steht in diesem Script.

Anmerkung:
Das Verzeichniss /etc/X11/xinit/xinitrc.d für die  60-prime-provider.sh habe ich gewählt um unhabhängig gegenüber Displaymanager zu sein.

Nach einem Neustart sollte nun die entsprechend Karte laufen.

Voraussetzung:
Die Configurationsdateien intel.conf, nvidia.conf sowie das Verzeichniss config.d sollten in /usr/share/X11/ vorhanden sein, evtl erstellen.
(sudo mkdir /usr/share/X11/config.d)

Hier die intel.conf

Code: Alles auswählen

Section "Device" 
       Identifier  "Intel" 
       Driver      "intel" 
       Option      "DRI"     "3" 
       Option      "AccelMethod" "sna" 
EndSection 

Section "DRI" 
        Group      "video" 
        Mode       0666 
EndSection 

Section "Extensions" 
      Option "Composite" "Enable" 
EndSection
sowie die nvidia.conf

Code: Alles auswählen

Section "OutputClass" 
   Identifier "intel" 
   MatchDriver "i915" 
   Driver "modesetting" 
EndSection 

Section "OutputClass" 
   Identifier "nvidia" 
   MatchDriver "nvidia-drm" 
   Driver "nvidia" 
   Option "AllowEmptyInitialConfiguration" 
   Option "PrimaryGPU" "yes" 
   ModulePath "/usr/lib/nvidia/xorg" 
EndSection
Achtung:Es kann vorkommen das der Loginscreen unter Nvidia nicht zu sehen ist, da sollte man die Zeile Driver    "modesetting"  in Driver    "intel" umschreiben! Der Treiber modesetting funktioniert wohl nicht so korrekt! Der Fehler tratt unter Plasma 5 mit sddm auf, ob weitere DM betroffen sind kann ich nicht beurteilen.

Die Datei prime-next-gpu.conf wird, falls nicht vorhanden, angelegt und auf intel gesetzt. Es wird also beim ausführen von prime-next-gpu das System auf den Intel-Treiber gesetzt. Weiterhin sollten nvidia (oder nvidia-lts) sowie xf-86-video-intel installiert sein.

Man kann nun mit sudo /bin/prime-next-gpu die Grafikkarte starten, ist die intel aktiv wird die nvidia eingebunden und läuft nach einem Neustart und umgekehrt. Man könnte sich ein Icon auf dem Desktop anlegen und mit prime-next-gpu verknüpfen.

Läuft die Intel-Grafikkarte, kann man mit:
$ DRI_PRIME=1 glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
46854 frames in 5.0 seconds = 9370.725 FPS
lief per nvidia Treiber.

Hier nochmals alle Scripte. Viel Spass beim probieren, experimentieren.

60-prime-provider.sh =

Code: Alles auswählen

#! /bin/sh 
# Starte prime-offload wenn die Datei vorhanden ist
# prime-offload entspricht etwa wie 
# xrandr --setprovideroutputsource modesetting NVIDIA-0
# nur das die Werte automatisch ermittelt werden.

if [ -e /sbin/prime-offload ]; then 
       /sbin/prime-offload 
fi 

prime-offload =

Code: Alles auswählen

#!/bin/sh 

# Für NVIDIA's geschlossene Treiber 
# falls nicht geladen, bricht der Script hier ab. 

if ! lsmod | grep nvidia > /dev/null; then 
    exit 0 
fi 

#Abfrage der Provider 

output="$(xrandr --listproviders)" 

if [ "$use_randr_names" = true ]; then 
   src=$(echo "$output" | grep " Source" | head -n1 | awk '{print $NF}' | cut -d: -f2) 
   sink=$(echo -e "$output" | grep " Sink" | head -n1 | awk '{print $NF}' | cut -d: -f2) 
else 
   src=$(echo "$output" | grep " Source" | head -n1 | cut -d: -f3 | cut -d" " -f2) 
   sink=$(echo -e "$output" | grep " Sink" | head -n1 | cut -d: -f3 | cut -d" " -f2) 
fi 

# Setzen der Provider 
xrandr --setprovideroutputsource "$sink" "$src" 

xrandr --auto 

exit 0
prime-next-gpu =

Code: Alles auswählen

#! /bin/bash 
# Auswerten der config und entsprechend die Grafikkarte umschalten 

[[ $(whoami) != "root" ]] && sudo /bin/prime-next-gpu

if [ -f /etc/prime-next-gpu.conf ]; then 
   var=$(cat /etc/prime-next-gpu.conf) 
   /bin/prime-select $var 
   echo 'Systemkonfiguration auf' $var 'gesetzt' 
else 
  echo "intel" > "/etc/prime-next-gpu.conf" 
  echo "Konfiguratonsdatei wurde angelegt" 
  var=$(cat /etc/prime-next-gpu.conf) 
  /bin/prime-select $var 
  echo 'neue Systemkonfiguration auf' $var 'gesetzt' 
fi 

exit 0

prime-select =

Code: Alles auswählen

#!/bin/sh

D=("intel" "nvidia")

modul_Intel() {
echo 'nvidia' > '/etc/prime-next-gpu.conf'
[[ -f /usr/lib/modprobe.d/nvidia-lts.conf ]] && rm /usr/lib/modprobe.d/nvidia-lts.conf
[[ -f /usr/lib/modprobe.d/nvidia.conf ]] && rm /usr/lib/modprobe.d/nvidia.conf
rm /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
ln -sf /usr/share/X11/config.d/intel.conf /usr/share/X11/xorg.conf.d/10-intel.conf
}

modul_Nvidia() {
echo 'intel' > '/etc/prime-next-gpu.conf'
[[ -f /usr/lib/modprobe.d/nvidia-lts.conf ]] && rm /usr/lib/modprobe.d/nvidia-lts.conf    
[[ -f /usr/lib/modprobe.d/nvidia.conf ]] && rm /usr/lib/modprobe.d/nvidia.conf
rm /usr/share/X11/xorg.conf.d/10-intel.conf
ln -sf /usr/share/X11/config.d/nvidia.conf /usr/share/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf
}

modul_genconf() {
echo 'blacklist nouveau
blacklist lbm-nouveau
alias nouveau off
alias lbm-nouveau off' > '/usr/lib/modprobe.d/gpu-driver.conf'
echo 'nvidia' > '/usr/lib/modules-load.d/gpu-driver.conf' 
}

case "$@" in
   "${D[0]}") # intel
        modul_Intel;
        [[ -f /usr/lib/modprobe.d/gpu-driver.conf ]] && exit 1        
        modul_genconf;
	#
        ;;
   "${D[1]}") # nvidia
        modul_Nvidia;
        [[ -f /usr/lib/modprobe.d/gpu-driver.conf ]] && exit 1
        modul_genconf;
	#
        ;;
esac
exit 2

Die Datei gpu-driver in /usr/lib/modprobe.d sieht so aus

Code: Alles auswählen

blacklist nouveau
blacklist lbm-nouveau
alias nouveau off
alias lbm-nouveau off
und die Datei gpu-driver.conf in /usr/lib/modules-load.d

Code: Alles auswählen

nvidia
Feedback erwünscht, sowie jemanden der das ganze grafisch einpacken könnte?? Qt?? Also die prime-next-gpu grafisch startet und die Meldungen anzeigt. (Anregung)

Diskussion evtl im extra Thread!?
Letzte Änderung:17.09.2017
Das anwenden dieser Anleitung erfolgt auf eigenes Risiko, bei nicht korrekter Umsetzung kann es zum Bildausfall kommen. Daher sollte man sich mit dem Terminal auskennen!

Gruß Amber

Re: Optimus - umschalten zwischen Nvidia und Intel, ganz bequem!

Verfasst: Montag 1. Mai 2017, 12:01
von Amber
Moin,

alles im oberen Teil geändert.

peace