Non-GPL Xorg Server

Die Konfiguration des Xorg soll in Zukunft mittels des OpenSLX-Plugins mit der Bezeichnung "xserver" erfolgen. Sie wird damit aus dem klassischen Hardware-Setup (siehe HardwareErkennung) herausgezogen.

Es gibt im grossen und ganzen drei, vier 3D Implementierungen für Xorg/Linux:
  • Mesa/SGI als OSS - zu bevorzugen. Geht gut beispielsweise mit Intel i8/9XX und ist überall dabei
  • ATI
  • NVidia
  • Matrox Parhelia oder so (die älteren Matrox sind im OSS Paket unterstützt)

Dabei gilt, dass es kaum klappt alle drei, vier Installationen einfach so nebeneinander parat zu haben.

Das Ganze ist nicht trivial, da mehrere Komponenten aus Kernel-Modulen, X-Server- und X-Client-Bibliotheken zusammenspielen müssen (siehe derzeit auch #92). Dabei kann es passieren, dass wenn eine Komponente nicht passt, das Ergebnis schlechter ist (Abstürze, kein 3D oder deutlich verlangsamt, ...) als die Verwendung der Open Source Xorg Treiber. Üblicherweise gibt es die folgenden Komponenten:
  • Das Kernelmodul - nvidia.ko oder fglrx.ko - dieses muss meistens auf der Zielplattform noch geeignet gewrappt werden, damit es zum Kernel passt. Regelt oft ein Installationsskript. Wenn man Glück hat, gibts auch schon ein vorbereitetes Modul passend vom Hersteller. Für die Open Source DRI Treiber ist die Unterstützung im Kernel enthalten unter /lib/modules/<kernel-version>/kernel/drivers/char/drm (i830.ko, mga.ko, radeon.ko, sis.ko, via.ko,i810.ko, i915.ko, !r128.ko, savage.ko, tdfx.ko).
  • Die X-Server 2D Treiber (Ersatz für nv_drv.so bzw. radeon_drv.so in /usr/lib/xorg/modules/drivers oder entsprechend)
  • Die X-Server 3D Komponenten für DRI bei ATI /usr/lib/dri bzw. /usr/X11R6/lib/modules/dri (Lage der Module je nach Version und Einhaltung der LSB - fglrx_dri.so und/oder atiogl_a_dri.so?). Für NVidia muss noch /usr/lib/xorg/modules/extensions/libglx.so ausgetauscht werden.
  • Die X-Server 3D-Bibliotheken in /usr/X11R6/lib/modules/extensions (libdri.so / fɡlrx_dri.so für ATI)
  • Die X-Client 3D-Bibliotheken ... /usr/X11R6/lib/libGL(core).so - Beim ATI-Treiber gibt es keine libGLCore-Datei.

Einen Überblick zur aktuell laufenden Konfiguration gibt glxinfo:

name of display: :0.0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
[ ... ]
client glx vendor string: SGI
client glx version string: 1.4
client glx extensions:
[ ... ]
OpenGL vendor string: Tungsten Graphics, Inc
OpenGL renderer string: Mesa DRI Intel(R) 945GM 20050225 x86/MMX/SSE2
OpenGL version string: 1.3 Mesa 6.5.1
OpenGL extensions:
[ ... ]

Dieses Beispiel zeigt ein System mit Intel i945 Chipset, welches das Kernel DRI verwendet. Das ist der freundliche Fall, da alles Open Source und mit der Distro bereits zur Verfügung gestellt. Wenn man die non-GPL Treiber von ATI und NVidia einsetzt, sollte in den drei Feldern etwas anderes stehen.

NVidia

name of display: :0.0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
[ ... ]
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
[ ... ]
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce FX 5200/AGP/SSE/3DNOW!
OpenGL version string: 2.1.0 NVIDIA 97.55
OpenGL extensions:
[ ... ]

In diesem Fall ist der kommerzielle Nvidia-Treiber zum Einsatz gekommen. Dabei muss auch beim Start des X-Servers in /etc/X11/xorg.conf in der Device-Section nvidia statt nv stehen.

Für NVidia gibt es ein spezielles Problem: Die Devices /dev/nvidia0 und /dev/nvidiactl müssen für Standardnutzer zugreifbar sein. Das Problem besteht bei SuSE10.1, wenn der Nutzer nicht in der Gruppe "video" ist.
Durch einen Eintrag in /etc/udev.d/rules.d/10-nvidia-devperms.rules mit dem Inhalt

KERNEL=="nvidia*|nvidiactl*", GROUP="video", MODE="0666" 

wird auch dieses Problem behoben.

ATI

Das Kernelmodul heisst fglrx.ko und benutzt agpgart.ko.

name of display: :0.0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.2
server glx extensions:
[ ... ]
client glx vendor string: ATI
client glx version string: 1.3
client glx extensions:
[ ... ]
OpenGL vendor string: ATI Technologies Inc.
OpenGL renderer string: RADEON X300/X550 Series Generic
OpenGL version string: 2.0.5879 (8.26.18)
OpenGL extensions:
[ ... ]

ATI verwendet die Kernel-DRI-Infrastruktur, NVidia hingegen nicht.

Diskless Closed-Source 3D-Treiber

Damit die Treiber beim Systemstart eingebunden werden, ist einiges an Arbeit im Initramfs notwendig. Dafür sollte das postinit.local verwendet werden, da es jedem freistehen sollte, ob er noch die Closed-Source-Treiber oder nur die Open-Source-Treiber verwenden möchte.

Dabei sollten die Dateien vorher schon auf der Zieldistribution richtig installiert worden sein und in einen speziellen Ordner kopiert werden. Dies ist am besten durch ein Durchsichtiges Dateisystem zu realisieren (tempfs, unionfs, aufs).

Dadurch wird sichergestellt, dass die Dateien am richtigen Platz für die jeweilige Distribution liegen. Die Dateien sind dann frei verfügbar für die Diskless-PCs auf einen NFS-Server abzulegen. Beim Systemstart können sie dann mit Hilfe von Unionfs oder AUFS auf das Wurzeldateisystem verlinkt werden. Damit werden sämtliche Abhängigkeiten für die Treiber auf dem Klienten im Speicher gehalten.

Unten ist eine Beispiel-ConfTGZ (Klient-Konfigurations-Paket, siehe Client-Konfiguration) angehängt, die genau das realisiert.
In /initramfs/postinit.local wird dabei /rootfs/var/lib/openslx/bin/bin-drivers aufgerufen, das dann je nach eingebauter Grafikkarte die Skripte fglrx oder nvidia aufruft. Die Skripte verlinken die Verzeichnisse vom Netzwerk und laden den jeweiligen Treiber.

Es folgt die Verzeichnisstruktur, die die Skripte erwarten (relativ zu dem eingebundenen NFS-Ordner):

NVIDIA

Kernel-Modul

nvidia/r/lib/modules/2.6.18.8-0.3-default/kernel/drivers/video/nvidia.ko

Konfigurations-Programme

nvidia/r/usr/bin/nvidia-settings
nvidia/r/usr/bin/nvidia-xconfig

Das Treiber-Modul für den Xorg-Server

nvidia/r/usr/lib/xorg/modules/drivers/nvidia_drv.so

Verschiedene von NVIDIA benötigten Bibliotheken

nvidia/r/usr/lib/tls/libnvidia-tls.so.1.0.9755
nvidia/r/usr/lib/tls/libnvidia-tls.so.1
nvidia/r/usr/lib/xorg/modules/libnvidia-wfb.so.1.0.9755
nvidia/r/usr/lib/xorg/modules/libnvidia-wfb.so.1
nvidia/r/usr/lib/xorg/modules/libwfb.so (Link)

Das GLX-Modul

nvidia/r/usr/lib/xorg/modules/extensions/libglx.so
nvidia/r/usr/lib/xorg/modules/extensions/libglx.so.1.0.9755

Verschiedene Erweiterungen

nvidia/r/usr/lib/libXvMCNVIDIA.so.1.0.9755
nvidia/r/usr/lib/libXvMCNVIDIA_dynamic.so.1
nvidia/r/usr/lib/libXvMCNVIDIA.a
nvidia/r/usr/lib/libnvidia-tls.so.1.0.9755
nvidia/r/usr/lib/libnvidia-tls.so.1 (Link)
nvidia/r/usr/lib/libnvidia-cfg.so.1.0.9755
nvidia/r/usr/lib/libnvidia-cfg.so.1 (Link)
nvidia/r/usr/lib/libnvidia-cfg.so (Link)

GL-Implementierung

nvidia/r/usr/lib/libGL.so.1.0.9755
nvidia/r/usr/lib/libGL.so.1.2
nvidia/r/usr/lib/libGL.so.1
nvidia/r/usr/lib/libGL.so
nvidia/r/usr/lib/libGL.la
nvidia/r/usr/lib/libGLcore.so.1.0.9755
nvidia/r/usr/lib/libGLcore.so.1

Dokumentations-Dateien

nvidia/r/usr/share/man
nvidia/r/usr/share/man/man1
nvidia/r/usr/share/man/man1/nvidia-installer.1.gz
nvidia/r/usr/share/man/man1/nvidia-xconfig.1.gz
nvidia/r/usr/share/man/man1/nvidia-settings.1.gz
nvidia/r/usr/share/applications
nvidia/r/usr/share/applications/nvidia-settings.desktop
nvidia/r/usr/include
nvidia/r/usr/include/GL
nvidia/r/usr/include/GL/gl.h
nvidia/r/usr/include/GL/glx.h
nvidia/r/usr/include/GL/glxext.h
nvidia/r/usr/include/GL/glext.h

ATI

/etc-Dateien

ati/r/etc/ati/control
ati/r/etc/ati/logo.xbm.example
ati/r/etc/ati/fglrxrc
ati/r/etc/ati/fglrxprofiles.csv
ati/r/etc/ati/logo_mask.xbm.example
ati/r/etc/ati/authatieventsd.sh
ati/r/etc/ati/inst_path_default
ati/r/etc/profile.d/ati-fglrx.sh

Kernel-Treiber

ati/r/lib/modules/2.6.18.8-0.3-default/kernel/drivers/char/drm/fglrx.ko

Link für das Control-Zentrum

ati/r/opt/kde3/share/applnk/fireglcontrol_kde3.desktop

spezielle Info-Programme für die OpenGL-Implementierung

ati/r/usr/bin/fglrxinfo
ati/r/usr/bin/fglrx_xgamma
ati/r/usr/bin/aticonfig
ati/r/usr/bin/fgl_glxgears

Das DRI-Interface für den Kernel-Treiber

ati/r/usr/lib/dri/fglrx_dri.so

GL-Client-Dateien

ati/r/usr/lib/xorg/libGL.so (Link)
ati/r/usr/lib/xorg/libGL.so.1 (Link)
ati/r/usr/lib/libGL.so.1 (Link)
ati/r/usr/lib/libGL.so (Link)
ati/r/usr/lib/xorg/libGL.so.1.2

Der Direct-Rendering-Manager für den Xorg-Server

ati/r/usr/lib/xorg/modules/linux/libfglrxdrm.so

Der Treiber für Xorg

ati/r/usr/lib/xorg/modules/drivers/fglrx_drv.so
ati/r/usr/X11R6/lib/modules/dri/fglrx_dri.so

Verschiedene Erweiterungen

ati/r/usr/lib/xorg/libfglrx_tvout.so.1
ati/r/usr/lib/xorg/libfglrx_gamma.so.1
ati/r/usr/lib/xorg/libfglrx_tvout.so.1.0
ati/r/usr/lib/xorg/libfglrx_pp.so.1.0
ati/r/usr/lib/xorg/libfglrx_dm.a
ati/r/usr/lib/xorg/libfglrx_pp.a
ati/r/usr/lib/xorg/libfglrx_gamma.so.1.0
ati/r/usr/lib/xorg/libfglrx_dm.so.1.0
ati/r/usr/lib/xorg/libfglrx_gamma.a
ati/r/usr/lib/xorg/libatixutil.a

ATI-ACPI-Event-Daemon (unwichtig)

ati/r/usr/sbin/atieventsd

Dokumentations-Dateien (unter)

ati/r/usr/share/doc

Include-Dateien

ati/r/usr/include/GL/glxATI.h
ati/r/usr/include/GL/glATI.h
ati/r/usr/include/X11/extensions/fglrx_gamma.h

Wie gesagt, arbeitet dieses Skript bisher nur mit NFS, das heißt, man muss die Variable nfs_bin_drivers in postinit.local noch an die lokalen Gegebenheiten anpassen.

bin-drivers.tgz - ConfTGZ mit Skripts zum Einbinden der binären Treiber über NFS. (1.6 kB) bw21, 05/22/2007 08:28 pm