Xserver Xorg

Es gibt im grossen und ganzen drei, vier 3D Implementierungen für Xorg/Linux:

  • Mesa/SGI als OSS - zu bevorzugen - läuft beispielsweise mit Intel i8/9XX und ist standard
  • ATI
  • NVidia
  • Matrox Parhelia - hier nicht berücksichtigt

Dabei gilt, dass es nicht möglich ist (außer bei Gentoo), alle Implementierungen nebeneinander installiert zu haben.

Das Ganze ist nicht trivial, da mehrere Komponenten aus Kernel-Modulen, X-Server- und X-Client-Bibliotheken zusammenspielen müssen. Dabei kann es passieren, falls eine Komponente nicht passt, das Ergebnis inakzeptabel ist (Abstürze, kein 3D oder deutlich verlangsamt, ...).

Ü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 Treiber (Ersatz für nv_drv.so bzw. radeon_drv.so in /usr/lib/xorg/modules/drivers oder entsprechend, unterstützen mindestens 2D)
  • 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 und /usr/lib/xorg/modules/extensions/libGLcore.so ausgetauscht werden.
  • Die X-Server 3D-Treiber in /usr/X11R6/lib/modules/extensions (libdri.so / fɡlrx_dri.so für ATI)
  • Die X-Client 3D-Bibliotheken ... /usr/X11R6/lib/libGL.so (bei NVIDIA noch libGLcore.so)

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, unter Suse-10.2. 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 Version 97.55 zum Einsatz gekommen. Dabei muss auch beim Start des X-Servers in /etc/X11/xorg.conf in der Device-Section nvidia statt nv stehen und in den ServerFlags ein Eintrag mit ModulePath /opt/openslx/plugin-repo/xserver/nvidia/usr/lib/xorg/modules/.

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.

Plugin: xserver

Ist ein OpenSLX-Plugin. Es dient der Einrichtung und Konfiguration des X-Servers (Xorg) für alle grafischen Oberflächen von Desktop-Systemen. Sobald auf einem Rechner die Grafikhardware genutzt werden soll (kein X-Terminalserver, der X nur remote anbietet), wird dieses Plugin zwingend benötigt.

Eine größere Herausforderung stellen Mehrschirmszenarien dar. Hier wird die noch fehlende Option von "xrandr" interessant.

Abhängigkeiten

Es bestehen keine Abhängigkeiten zu anderen Plugins. Es basieren alle Plugins, die grafisch orientierte Dienste für den Desktop anbieten auf xserver.

Optionen

active

Beschreibung

Aktiviert das Plugin

Werte

1: aktiviert

0: deaktiviert

Standard

1 (Plugin aktiviert)

ddcinfo

Beschreibung

Trägt in /etc/X11/xorg.conf die Monitor-Parameter für Auflösung und Frequenzbereiche ein, wenn sie in Stage3 ermittelt werden konnten. Diese Option kann man aktivieren, falls die Monitorauflösung im Stage4 falsch ist.

Werte

1: aktiviert

0: deaktiviert

Standard

0

prefnongpl

Beschreibung

Bevorzuge beim Setup die "nongpl" Treiber von ATI/NVidia falls vorhanden.

Werte

1: aktiviert

0: deaktiviert

Standard

0

driver

Beschreibung

Überschreibe in Stage 3 den von hwinfo identifizierten Treiber (force driver).

Werte

undef # ati, radeon(hd), fglrx, nv, nvidia, intel, matrox, vesa, ...

Standard

undef

Geplant: xrandr

Beschreibung

Aktiviere die Xrandr-Erweiterung des Xorg-Servers, benötigt für Mehrschirmszenarien und dynamisch hinzugefügte oder entfernte Displays. Ist noch nicht implementiert.

Werte

1: aktiviert

0: deaktiviert

Standard

0

ati

Beschreibung

Installiere die ATI-Treiber (dieses erfordert beim ersten Lauf eine funktionierende Internet-Verbindung auf dem OpenSLX-Server).

Werte

1: installiere (Stage 1) / aktiviert (Stage 3)

0: entferne (Stage 1) / deaktiviert (Stage 3)

Standard

0

nvidia

Beschreibung

Installiere die NVidia-Treiber (dieses erfordert beim ersten Lauf eine funktionierende Internet-Verbindung auf dem OpenSLX-Server).

Werte

1: installiere (Stage 1) / aktiviert (Stage 3)

0: entferne (Stage 1) / deaktiviert (Stage 3)

Standard

0

Geplant: matrox

Beschreibung

Installiere die Matrox(Parhelia)-Treiber

Werte

1: installiere (Stage 1) / aktiviert (Stage 3)

0: entferne (Stage 1) / deaktiviert (Stage 3)

Standard

0

pkgpath (Stage 1)

Beschreibung

Pfad, in dem die allgemeinen Pakete für die NVidia und ATI Installation benötigten Dateien liegen. Wenn distro-spezifische Pakete benutzt werden, hat diese Option keine Bedeutung. Unter Suse-10.2 werden zum Beispiel die Installer von diesem Pfad verwendet. Bei Verwendung von diesem Installer müssen die Kernel-Sources installiert sein.

Werte

undef

Standard

/root/xserver-pkgs

Entwiklerinfos und Problembehebung

Diskless Closed-Source 3D-Treiber

Damit die Treiber beim Systemstart eingebunden werden, müssen die Bibliotheken vom System bekannt gemacht werden.

Dabei sollten die Dateien vorher auf der Zieldistribution in einen Ordner installiert worden sein. Das ist durch den festen Installations-Ordner /opt/openslx/plugin-repo/xserver/{ati,nvidia} vorgegeben.

@Edit: (neuste Version)

Die Bibliotheken, die leicht ein Konflikt verursachen können (z.B. libGL.so.1.2 und libGLCore.so), werden in stage1 durch ein präpariertes ldconfig in eine spezielle ld.so.cache geschrieben. Die Treiber-Bibliotheken für Xorg werden mittels der ModulePath-Option in der xorg.conf eingetragen und werden so vom X-Server gefunden. Im stage3 werden dann je nach Grafikkarte des Klienten die vorher präparierte ld.so.cache ersetzt und die Pfade in /etc/ld.so.conf hinzugefügt.

Diese Methode garantiert eine reibungslose Integration von mehreren Treibern und ermöglicht eine schnelle Installation/Deinstallation von den Treiberpaketen.

Es folgt die Verzeichnisstruktur, die vom stage3-xserver-Skript (XX_xserver.sh) erwartet wird.

NVIDIA

Kernel-Modul
nvidia/modules/nvidia.ko
Konfigurations-Programme (nicht verwendet)
nvidia/usr/bin/nvidia-settings
nvidia/usr/bin/nvidia-xconfig
Das Treiber-Modul für den Xorg-Server (nicht gelinkt, über xorg.conf geladen)
nvidia/usr/lib/xorg/modules/drivers/nvidia_drv.so
Verschiedene von NVIDIA benötigten Bibliotheken (teilweise gelinkt nach /usr/lib )
nvidia/usr/lib/tls/libnvidia-tls.so.1.0.9755
nvidia/usr/lib/tls/libnvidia-tls.so.1
nvidia/usr/lib/xorg/modules/libnvidia-wfb.so.1.0.9755
nvidia/usr/lib/xorg/modules/libnvidia-wfb.so.1
nvidia/usr/lib/xorg/modules/libwfb.so (Link)
Das GLX-Modul (über xorg.conf geladen)
nvidia/usr/lib/xorg/modules/extensions/libglx.so
nvidia/usr/lib/xorg/modules/extensions/libglx.so.1.0.9755
Verschiedene Erweiterungen
nvidia/usr/lib/libXvMCNVIDIA.so.1.0.9755
nvidia/usr/lib/libXvMCNVIDIA_dynamic.so.1
nvidia/usr/lib/libXvMCNVIDIA.a
nvidia/usr/lib/libnvidia-tls.so.1.0.9755
nvidia/usr/lib/libnvidia-tls.so.1 (Link)
nvidia/usr/lib/libnvidia-cfg.so.1.0.9755
nvidia/usr/lib/libnvidia-cfg.so.1 (Link)
nvidia/usr/lib/libnvidia-cfg.so (Link)
GL-Implementierung (gelinkt - /var/X11R6/lib )
nvidia/usr/lib/libGL.so.1.0.9755
nvidia/usr/lib/libGL.so.1.2
nvidia/usr/lib/libGL.so.1
nvidia/usr/lib/libGL.so
nvidia/usr/lib/libGL.la
nvidia/usr/lib/libGLcore.so.1.0.9755
nvidia/usr/lib/libGLcore.so.1
Dokumentations-Dateien
nvidia/usr/share/man
nvidia/usr/share/man/man1
nvidia/usr/share/man/man1/nvidia-installer.1.gz
nvidia/usr/share/man/man1/nvidia-xconfig.1.gz
nvidia/usr/share/man/man1/nvidia-settings.1.gz
nvidia/usr/share/applications
nvidia/usr/share/applications/nvidia-settings.desktop
nvidia/usr/include
nvidia/usr/include/GL
nvidia/usr/include/GL/gl.h
nvidia/usr/include/GL/glx.h
nvidia/usr/include/GL/glxext.h
nvidia/usr/include/GL/glext.h

ATI

/etc-Dateien (in stage3 kopiert)
ati/etc/ati/control
ati/etc/ati/logo.xbm.example
ati/etc/ati/fglrxrc
ati/etc/ati/fglrxprofiles.csv
ati/etc/ati/logo_mask.xbm.example
ati/etc/ati/authatieventsd.sh
ati/etc/ati/inst_path_default
ati/etc/profile.d/ati-fglrx.sh
Kernel-Treiber
ati/modules/fglrx.ko
spezielle Info-Programme für die OpenGL-Implementierung
ati/usr/bin/fglrxinfo
ati/usr/bin/fglrx_xgamma
ati/usr/bin/aticonfig
ati/usr/bin/fgl_glxgears
Das DRI-Interface für den Kernel-Treiber (gelinkt)
ati/usr/lib/dri/fglrx_dri.so
GL-Client-Dateien (gelinkt nach /var/X11R6/lib)
ati/usr/lib/xorg/libGL.so (Link)
ati/usr/lib/xorg/libGL.so.1 (Link)
ati/usr/lib/libGL.so.1 (Link)
ati/usr/lib/libGL.so (Link)
ati/usr/lib/xorg/libGL.so.1.2
Der Direct-Rendering-Manager für den Xorg-Server (über xorg.conf geladen)
ati/usr/lib/xorg/modules/linux/libfglrxdrm.so
Der Treiber für Xorg
ati/usr/lib/xorg/modules/drivers/fglrx_drv.so
ati/usr/X11R6/lib/modules/dri/fglrx_dri.so
Verschiedene Erweiterungen
ati/usr/lib/xorg/libfglrx_tvout.so.1
ati/usr/lib/xorg/libfglrx_gamma.so.1
ati/usr/lib/xorg/libfglrx_tvout.so.1.0
ati/usr/lib/xorg/libfglrx_pp.so.1.0
ati/usr/lib/xorg/libfglrx_dm.a
ati/usr/lib/xorg/libfglrx_pp.a
ati/usr/lib/xorg/libfglrx_gamma.so.1.0
ati/usr/lib/xorg/libfglrx_dm.so.1.0
ati/usr/lib/xorg/libfglrx_gamma.a
ati/usr/lib/xorg/libatixutil.a
ATI-ACPI-Event-Daemon (unwichtig)
ati/usr/sbin/atieventsd
Dokumentations-Dateien (unter)
ati/usr/share/doc
Include-Dateien
ati/usr/include/GL/glxATI.h
ati/usr/include/GL/glATI.h
ati/usr/include/X11/extensions/fglrx_gamma.h
Diese Liste ist nicht vollständig und korrekt, da sie sich von Version zu Version ändert

Dennoch kann man bei Fehlen von wichtigen Ordnern schon einige Schlüsse über die Installation in stage1 ziehen.

Fehlersuche

Es kann eine Reihe von Ursachen geben, wenn etwas mit dem xserver Plugin nicht klappt.

Kein X gestartet

Wenn lediglich die Konsole zu sehen ist und X gar nicht startet:

  • Nachsehen, welche elche Plugins installiert sind - das desktop und das xserver Plugin werden beim Lauf des Demuxers gemeldet ala:
    "active plugins: xserver,x11vnc,desktop"
  • Im Stage3 (mit debug=3 booten) überprüfen, was in der /mnt/etc/X11/xorg.conf drinsteht, ob es einen Runlevel-Link für gdm oder kdm (nur xdm bei SuSE) im /mnt/etc/rc3,5.d gibt und ob /initramfs/plugin-conf/xserver existiert und was drinsteht.
  • Nachsehen, ob das /tmp-Verzeichnis beschreibbar ist. Eventuell will openslx das /tmp-Verzeichnis über das Netzwerk mounten, was zum Teil nicht möglich ist wegen geänderter Server-Konfigurationen.

Falsche, schlechte Auflösungen

Manchmal entspricht die Grafikauflösung im Stage4 nicht dem Erwarteten. Gut ist es in solchen Fällen, wenn man die Maschine regulär im klassischen Modus einer festplatteninstallierten Disto startet, um direkte Vergleiche zu erlauben.

  • Generell ist interessant, was in der /var/log/Xorg.0.log drinsteht. Hier könnten Hinweise auf verschiedene Probleme zu finden sein. Es könnten Module fehlen, der Monitor seine Auflösung nicht melden, bestimmte Devices nicht erreichbar sein, ... Diese sollte man bei komplexeren Ausgaben direkt mit der einer Festplatteninstallation vergleichen, um Probleme evtl. anhand der Unterschiede zu ermitteln.
  • Was passiert wenn man den X-Server mit CTRL-ALT-BACKSPACE killt und sich neu starten lässt? Wiederholt sich das Problem oder ändert sich etwas zum Besseren/Schlechteren? Dann die Logfiles (/var/log/Xorg.0.log) miteinander vergleichen.
  • Dann sollte man mal die Option "ddcinfo" ausprobieren, siehe oben. Diese ist derfaultmäßig nicht aktiv (wenn aktiviert, verschwinden die Kommentarzeilen der Monitordefinitionen aus der xorg.conf. Es kann jedoch sein, dass hwinfo keine Daten erhält und deshalb kein Eintrag von Daten erfolgt. Problematisch sind hier auch Mehrschirmszenarien. Wenn ddcinfo schlechte Ergebnisse liefert, kann es auch nützlich sein, ddcinfo auszuschalten, damit der nongpl-Treiber die besten Auflösungen heraussucht.
  • Als nächstes kann man im Stage3 nachsehen, was sowohl für die Grafikkarte oder den Monitor erkannt wurde. Mit "debug=3" starten und nachsehen, was in /etc/hwinfo.display für den Monitor und in /etc/hwinfo.gfxcard für die Grafikkarte drinsteht.
  • Timing-Probleme bei der Hardware-Erkennung: Was passiert wenn man eine einzelne Maschine in einem unbelasteten Netz neu startet: Bleibt die Auflösung immer gleich oder ändert sich diese? Wechselt das Verhalten in einem belasteten Netz?