• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Optimus-Notebook: Entweder Intel- oder Nvidia-GPU betreiben

Ich habe eine Lösung zur Frage, wie man auf einem Optimus-Notebook die Nvidia-Karte sinnvoll verwenden kann, und eine Frage dazu, namlich ob jemand mir erklären kann, was die Datei, die unten abgedruckt ist, überhaupt macht. Also:

Bei manchen Optimus-Notebooks ist der Display Port nur mit der Nvidia-GPU verbunden. Über die Intel-GPU auf dem Mainboard kann man nicht auf den Display Port zugreifen.

Dies schränkt den Nutzen von Optimus unter Linux deutlich ein. Bumblebee kann den Display Port nicht ansteuern. Der Display Port ist aber sehr nützlich, wenn man eine großen externen Schirm betreiben will, beispielsweise für eine Präsentation.

Im Normalbetrieb brauche ich weder die Nvidia-Karte noch den Display Port. Bei besonderen Gelegenheiten aber beide.

Das BIOS der Thinkpads (in meinem Fall ein T420s) bietet folgende Möglichkeiten:
  • Interne Graphik = Intel GPU
  • Externe Graphik = Nvidia GPU
  • Optimus = Optimus entscheidet, welche GPU verwendet wird

Dazu kann man das BIOS vorher noch prüfen lassen, ob das OS überhaupt mit Optimus etwas anfangen kann.

Die Frage war, ob ich openSuse 12.3 (64-bit) so einrichten kann, dass je nach Einstellung im BIOS entweder nur die Intel-GPU läuft oder nur die Nvidia-Karte.

Es geht. Bei der Installation von openSuse 12.3 auf dem Rechner wird ja zunächst mal kein Nvidia-Treiber berücksichtigt. Wenn man also im BIOS auf die interne Graphik schaltet, sollte die Nvidia-Karte ganz abgeschaltet sein, was die Laufzeit des Akkus drastisch erhöht.

Um die Nvidia-Karte zu installieren, installiert man vom Nvidia-repo (nicht von Bumblebee, nicht von Overman79, in meinem Fall also http://download.nvidia.com/opensuse/12.3/) den zum Kernel passenden Treiber. Das Nvidia-repo bietet da nur eine beschränkte Auswahl, also muss man ggf. einen älteren Kernel auch noch installieren (Stichwort: "multiple kernels"). Ich habe drei Pakete installiert:
  1. nvidia-computeG03
  2. nvdia-gfxG03-kpm-desktop
  3. x11-video-nvidiaG03

OK, ich habe wohl irgendwann mal den Nvidia-Treiber direkt installiert auf der Kommandozeile mit sh ./NVIDIA...run . Das hat den X-Server etwas beeinträchtigt, so dass ich Xorg-X11-server neu installiert habe und sicherheitshalber auch noch viele andere Pakete von X und Mesa.

Das Problem ist, dass sich Intel und Nvidia trotzdem in die Quere kommen und z.B. beim Betrieb auf der Intel-GPU keine 3D Beschleunigung funktioniert. Abhilfe brachte ein kleines Script, das jemand im openSuse-Forum kurz vor dessen Absturz veröffentlichte und dass ich in /etc/boot.local aufgenommen habe (Achtung: 64-bit Variante!):
Code:
mode=$(/sbin/lspci | grep VGA);#Make shure we are in command of /usr/X11R6/lib
if [ -e /etc/ld.so.conf.d/nvidia-gfxGO3.conf ]; then
    /bin/rm /etc/ld.so.conf.d/nvidia-gfxGO3.conf
fi  
#Check graphics mode and take apropriate action
if [ `echo $mode | grep -c "Intel" ` -gt 0 ]; then
if [ -e /usr/lib64/xorg/modules/updates/extensions/libglx.so ]; then
    /bin/rm /usr/lib64/xorg/modules/updates/extensions/libglx.so
fi 
if [ -e /usr/X11R6/lib/libGL.so.1 ]; then
    /bin/rm /usr/X11R6/lib/libGL.so.1
    /bin/rm /usr/X11R6/lib64/libGL.so.1
fi


#Else we must be in Nvidia mode
else
    /bin/ln -s /usr/lib64/xorg/modules/updates/extensions/libglx.so.* /usr/lib64/xorg/modules/updates/extensions/libglx.so
    /sbin/ldconfig /usr/X11R6/lib
    /sbin/ldconfig /usr/X11R6/lib64    
fi

Leider hat der Crash des Forums die Variante für 32-bit weggerissen, die ich nicht kopiert hatte.

Ich kann nun arbeiten mit der Intel-GPU, der Rechner ist leise und sparsam. Wenn ich unbedingt mal den Display-Port und die Nvidia-Karte brauche, stelle ich im BIOS um.

Kann mir jemand erklären, was der Code oben macht, und warum das notwendig ist?
 
Für openSuse 12.3 in der 32-bit Variante lautet der Code für boot.local:

Code:
mode=$(/sbin/lspci | grep VGA);#Make shure we are in command of /usr/X11R6/lib
if [ -e /etc/ld.so.conf.d/nvidia-gfxGO3.conf ]; then
    /bin/rm /etc/ld.so.conf.d/nvidia-gfxGO3.conf
fi  
#Check graphics mode and take apropriate action
if [ `echo $mode | grep -c "Intel" ` -gt 0 ]; then
if [ -e /usr/lib/xorg/modules/updates/extensions/libglx.so ]; then
    /bin/rm /usr/lib/xorg/modules/updates/extensions/libglx.so
fi 
if [ -e /usr/X11R6/lib/libGL.so.1 ]; then
    /bin/rm /usr/X11R6/lib/libGL.so.1
fi
    

else
    /bin/ln -s /usr/lib/xorg/modules/updates/extensions/libglx.so.* /usr/lib/xorg/modules/updates/extensions/libglx.so
    /sbin/ldconfig /usr/X11R6/lib
    

fi

Das Paket Mesa-demos-x sollte auch installiert sein. Dann müsste

Code:
glxinfo | grep OpenGL

jeweils die verwendete Version "ausspucken".
 
Keks Dose schrieb:
Kann mir jemand erklären, was der Code oben macht, und warum das notwendig ist?
fglrx und nvidia installieren neben eigenen Bibliotheken auch noch ihre eigene Version der Bilbliothek libglx.so. Mit dieser Version kommen aber die freien Treiber nicht zurecht. Bei Deiner Konstellation muß daher diese Version entfernt werden, wenn der Intel-Treiber verwendet werden soll, und wiederhergestellt werden, wenn der Nvidia-Treiber verwendet werden soll. Das Entfernen bzw. Wiederherstellen erfolgt im Skript durch Löschen bzw. Neuanlegen der Verknüpfung /usr/lib[64]/xorg/modules/updates/extensions/libglx.so (diese Verknüpfung zeigt auf die eigentliche Bibliothek). Im "Xorg-Bibliotheks-Pfad" ist /usr/lib[64]/xorg/modules/updates/extensions/ vor /usr/lib[64]/xorg/modules/extensions/ gereiht, wenn die Bibliothek im ersten Verzeichnis vorhanden ist, wird sie von dort geladen, ansonsten aus dem zweiten Verzeichnis (also in der Version aus dem Paket xorg-x11-server).

Mit dem Löschen der Verknüpfung /usr/X11R6/lib[64]/libGL.so.1 passiert Ähnliches, hier zeigt dann /usr/X11R6/lib[64]/libGL.so ins Leere (und die ATI- bzw. Nvidia-Bibliothek kann nicht geladen werden), und das Neuanlegen erfolgt mit dem Programm ldconfig (die ATI- bzw. Nvidia-Bibliothek wird geladen).
 
Herzlichen Dank für die Erklärung!

Beim Booten mit aktivierter Intel-GPU beschwert sich der Kernel nun mit "FATAL: module Nvidia not found" und verwendet dann während des Bootens irgendeinen Treiber mit irgendeiner Auflösung. Wo könnte denn noch stehen, dass Nvidia gebraucht wird, so dass der Kernel danach sucht?
 
Wie erklärst Du den Widerspruch, der zwischen
Keks Dose schrieb:
Ich kann nun arbeiten mit der Intel-GPU, der Rechner ist leise und sparsam.
und
Keks Dose schrieb:
mit aktivierter Intel-GPU beschwert sich der Kernel nun mit "FATAL: module Nvidia not found" und verwendet dann während des Bootens irgendeinen Treiber
besteht?

Keks Dose schrieb:
dass der Kernel danach sucht
Der Kernel stellt auf Grund der vorhandenen Hardware (und der Informationen vom BIOS) fest, daß eine Nvidia-Karte vorhanden ist. Das Laden des zugehörigen Kernel-Moduls aus /lib/modules/.../extra/ scheitert jedoch. Vielleicht ist es auf die in Deinem Skript "bearbeiteten" Dateien angewiesen? Vielleicht stört es sich an der Intel-Karte? Vielleicht ist es wirklich nicht vorhanden, aber in modules.dep* enthalten? ...?

Ein bißchen habe ich mich gewundert, daß Dein Skript ausreicht, aber im Hinblick auf das erste Zitat ... Im übrigen kann ich weder zu Nvidia- noch zu Intel-Grafikkarten noch zu deren Zusammenwirken etwas beitragen.
 
Grub2 benutzt wärend des Bootens mit der Intel-GPU eine unpassende Bildschirmauflösung. Sobald X läuft, ist alles in Ordnung. Für den Betrieb unter X reicht das Script aus.

Ich werde mal bei forums.opensuse.org nachfragen, daher kommt auch das Script.

Gruß,
Alexander

P.S.: Ich habe das Scipt hier vor allem deswegen veröffentlich, weil mir klar wurde, dass Bumblebee eine ziemlich sinnlose Sache ist, solange damit der Display Port blockiert wird. Man verschwendet Strom an die Nvidia-GPU und hat ständig diese fragile Bumblebee-Konstruktion auf dem Hals.

Wenn ich wirlich Grafik-Leistung brauche, muss ich halt neu booten, eine Sache von zwei Minuten. Dafür kein Bumblebee und einen selten laufenden Lüfter. YEAH!

P.P.S.: Ich warne vor Experimenten an dem Script, denn wenn boot.local einen Fehler enthält, dann steckt man wirklich in Schwierigkeiten...
 
Oben