Autor Thema: Optimus - umschalten zwischen Nvidia und Intel, ganz bequem!  (Gelesen 602 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Amber

  • Forum Gott
  • ****
  • Beiträge: 276
  • Dankeschön: 24 mal
  • CPU: i7
  • GPU: HD4000 / GeForce670m
  • Kernel: 4.9. LTS & 4er
  • DE: Plasma 5
  • GPU Treiber: nvidia / intel
Einrichten von Optimus in der neuesten Arch-Version Stand 1.3.2017
siehe 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
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
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 =

#! /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 =

#!/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 =

#! /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 =

#!/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
blacklist nouveau
blacklist lbm-nouveau
alias nouveau off
alias lbm-nouveau off
und die Datei gpu-driver.conf in /usr/lib/modules-load.d
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
« Letzte Änderung: 17. September 2017, 11:48:13 von Amber »
Mit freundlichen Grüßen
            Amber
 
Folgende Mitglieder bedankten sich: suska

Amber

  • Forum Gott
  • ****
  • Beiträge: 276
  • Dankeschön: 24 mal
  • CPU: i7
  • GPU: HD4000 / GeForce670m
  • Kernel: 4.9. LTS & 4er
  • DE: Plasma 5
  • GPU Treiber: nvidia / intel
Re: Optimus - umschalten zwischen Nvidia und Intel, ganz bequem!
« Antwort #1 am: 01. Mai 2017, 12:01:11 »
Moin,

alles im oberen Teil geändert.

peace
« Letzte Änderung: 22. Mai 2017, 11:11:43 von Amber »
Mit freundlichen Grüßen
            Amber