Optimus - umschalten zwischen Nvidia und Intel, ganz bequem!
Verfasst: Mittwoch 26. April 2017, 12:02
Einrichten von Optimus in der neuesten Arch-Version Stand 1.3.2017
siehe
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
sowie die nvidia.conf
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 =
prime-offload =
prime-next-gpu =
prime-select =
Die Datei gpu-driver in /usr/lib/modprobe.d sieht so aus
und die Datei gpu-driver.conf in /usr/lib/modules-load.d
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
siehe
Code: Alles auswählen
https://bbs.archlinux.de/viewtopic.php?id=30219
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
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
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
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
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
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
Code: Alles auswählen
blacklist nouveau
blacklist lbm-nouveau
alias nouveau off
alias lbm-nouveau off
Code: Alles auswählen
nvidia
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