In diesem Artikel beschreiben wir, wie Sie mit zwei Grafikkarten oder einer Dual-Head-Karte (mit zwei VGA-Ausgängen) zwei Monitore parallel betreiben können. Um dieses Feature nutzen zu können, müssen Sie bereits mit XFree86 4.x arbeiten - wir haben unsere Tests mit der aktuellen Version 4.1.0 durchgeführt. XFree86 3.x beherrscht den Dual-Head-Betrieb nicht.
Zwei Karten einrichten
Nach dem Einbau einer zusätzlichen (PCI-) Karte gilt es zunächst herauszufinden, in welcher Reihenfolge der Rechner mit diesen umgeht. Das ist einfach: Zwei Monitore anschließen und den Rechner starten; die Karte, die die BIOS-Meldungen anzeigt, ist die "erste". Gefällt Ihnen die Reihenfolge nicht, haben Sie neben dem Tausch der Monitore noch eventuell die Möglichkeit, im BIOS die Bus-Reihenfolge einzustellen (AGP/PCI oder PCI/AGP).
Starten Sie nun Linux in einem Runlevel, in dem X nicht aktiviert wird; bei Red Hat und Mandrake eignet sich Runlevel 3, bei SuSE Runlevel 2. Einige Distributionen werden beim Systemstart die neue Grafikkarte erkennen und automatisch einbinden wollen (Mandrake Linux 8 schlug etwa gleich eine Konfiguration mit beiden Karten vor); wir machen das im Folgenden selbst.
Nach dem Anmelden als root prüfen Sie zunächst, ob beide Karten von Linux ordentlich erkannt wurden; dazu suchen Sie mit lspci nach Grafikkarten. In unserem Beispielrechner mit einer Matrox-G400-AGP- und einer ATI-Rage-PCI-Karte sieht dies wie folgt aus:
[esser@dual dual]$ lspci | grep VGA 00:0a.0 VGA compatible controller: ATI Technologies Inc 3D Rage IIC 215IIC [Mach64 GT IIC] (rev 3a) 01:00.0 VGA compatible controller: Matrox Graphics, Inc. MGA G400 AGP (rev 04)
Die Ausgabe verrät Zweierlei: Erstens wurden beide Grafikkarten vom Kernel erkannt, und zweitens erfahren wir für jede Karte in der Form "xx:yy.z", wie sie angesprochen werden kann. xx ist dabei die Bus-ID (00 ist der PCI-Bus, 01 der AGP-Bus), yy ist die Geräte-ID (in hexadezimaler Schreibweise - 0a ist im Dezimalsystem 10), und z die "Funktion", in der Regel 0. Diese Werte brauchen wir gleich, um in der XFree86-Konfiguration die Karten zu beschreiben. lspci fragt übrigens PCI- und AGP-Bus ab und schlägt die Geräte-IDs in der Datei /usr/share/pci.ids nach.
Erzeugen Sie nun eine Sicherheitskopie der XFree86-Konfigurationsdatei (häufig /etc/X11/XF86Config-4 genannt, um sie von der entsprechenden Datei für XFree 3.x zu unterscheiden), und öffnen Sie diese in einem Editor Ihrer Wahl. Suchen Sie dann nach dem "Device"-Abschnitt. Dort sollte bereits die AGP-Karte konfiguriert sein, wenn X vor dem Einbau der zweiten Karte korrekt eingerichtet war. Da wir im Folgenden ja zwei Karten verwenden wollen, wird zunächst ein Eintrag "BusID" ergänzt, der für die AGP-Karte den Wert "PCI:1:0:0" erhält. Diese Angabe entspricht der lspci-Ausgabe "01:00.0".
# Graphics device section
Section "Device"
Identifier "Matrox Millennium G400"
VendorName "Matrox"
BoardName "Millennium G400"
Driver "mga"
Option "DPMS"BusID "PCI:1:0:0"
EndSection
Unter diesem Device-Abschnitt legen Sie einen zweiten an; in unserem Fall konfigurieren wir eine ATI-Karte. Die Device-Section sieht fast genauso aus, wie es der Fall wäre, wenn ausschließlich diese Karte vorhanden wäre - auch hier geben wir wieder die BusID an: Aus "00:0a.0" (lspci) wird nun "PCI:0:10:0".
Section "Device"
Identifier "ATI Mach64 3D RAGE II"
VendorName "ATI"
BoardName "Rage II"
Driver "ati"
Option "DPMS"BusID "PCI:0:10:0"
EndSectionAls nächsten Schritt definieren wir die beiden Monitore, die an die Karten angeschlossen werden. Hier gibt es keine Überraschungen: Ungewöhnlich ist nur, dass es zwei "Monitor"-Abschitte gibt:
# Monitor section
Section "Monitor"
Identifier "monitor1"
VendorName "Unknown"
ModelName "Unknown"
HorizSync 30-96
VertRefresh 48-120
EndSection
Section "Monitor"
Identifier "monitor2"
VendorName "Unknown"
ModelName "Unknown"
HorizSync 30-96
VertRefresh 48-120
EndSectionMonitor 1 soll dabei der linke Monitor sein; Nummer 2 der rechte. Als nächstes folgt die Definition von zwei "Screen"-Abschnitten. Ein Screen fasst eine Kombination aus "Device" und "Monitor" und die Einstellungen zu Auflösung und Farbtiefe zusammen. Auch diese Abschnitte sehen wieder ganz gewöhnlich aus:
# Screen sections
Section "Screen"
Identifier "links"
Device "Matrox Millennium G400"
Monitor "monitor1"
DefaultColorDepth 16
Subsection "Display"
Depth 16
Modes "1280x1024" "1024x768" "800x600" "640x480"
ViewPort 0 0
EndSubsection
EndSection
Section "Screen"
Identifier "rechts"
Device "ATI Mach64 3D RAGE II"
Monitor "monitor2"
DefaultColorDepth 16
Subsection "Display"
Depth 16
Modes "1024x768" "800x600" "640x480"
ViewPort 0 0
EndSubsection
EndSectionUm mehr Übersicht zu bieten, haben wir die beiden "Screen"-Abschnitte mit den Identifiers "links" und "rechts" versehen. Die maximalen Auflösungen der beiden Screens sind hier unterschiedlich: Das linke Display wird in 1280x1024 starten, während das rechte Display nur 1024x768 Pixel bietet.
Zum Abschluss muss dem X-Server noch mitgeteilt werden, welche Screens in welcher Anordnung verwendet werden - dies geschieht über einen "ServerLayout"-Abschnitt:
# Server Layout
Section "ServerLayout"
Identifier "layout1"
Screen "links"
Screen "rechts" RightOf "links"
InputDevice "Mouse1" "CorePointer"
InputDevice "Keyboard1" "CoreKeyboard"
EndSectionDas Schlüsselwortes "RightOf" leistet genau das, was "right of" bedeutet: Der rechte Screen wird rechts vom linken angeordnet. Alle übrigen Abschnitte der X-Konfigurationsdatei haben wir hier nicht aufgeführt - natürlich müssen auch Maus und Tastatur, Fonts und Module konfiguriert werden, aber dies geschieht genau wie im Ein-Karten-Fall.
Xinerama?
Es gibt zwei Möglichkeiten, die beiden Monitore zu verwenden: Eine davon nennt sich "Xinerama" und erzeugt einen großen gemeinsamen Desktop, auf dem sich Fenster zwischen den beiden Monitoren hin und her schieben lassen; dabei kann ein Fenster auch "auf der Kante" liegen, also jeweils einen Teil auf einem der beiden Monitore darstellen.
Xinerama einzusetzen, ist jedoch nur dann eine gute Idee, wenn beide Monitore in der gleichen Auflösung betrieben werden. Da ein Desktop immer eine rechteckige Form hat, wird im Fall unterschiedlicher Auflösungen der "kleinere" Monitor (bei Links-Rechts-Anordnung) so behandelt, als ob er die gleiche Zeilenzahl wie der große hätte. Als Folge ist ein Teil des Desktops (ein halber Streifen, z. B. im rechten Bereich) nicht sichtbar. Dies trifft bei KDE und GNOME die Startleiste, die sich standardmäßig am unteren Desktop-Rand befindet, so dass diese auf dem kleineren Monitor nicht zu erkennen ist.
Werden aber beide Monitore mit der gleichen Auflösung benutzt, spricht nichts gegen Xinerama. Der "ServerLayout"-Abschnitt ist dann um eine Option zu ergänzen:
# Server Layout
Section "ServerLayout"
Identifier "layout1"
Screen "links"
Screen "rechts" RightOf "links"Option "Xinerama" "on"
InputDevice "Mouse1" "CorePointer"
InputDevice "Keyboard1" "CoreKeyboard"
EndSection
Wer auf die Xinerama-Option verzichtet, erhält stattdessen zwei getrennte Desktops auf den beiden Rechnern. KDE 2.2 erzeugt dann im Home-Verzeichnis zusätzlich zu Desktop ein weiteres KDE-Verzeichnis Desktop1, welches Icon-Plazierungen für diesen zweiten Desktop aufnimmt. Außerdem wird in .kde/share/config neben der Desktop-Konfigurationsdatei kdesktoprc ebenfalls eine zweite Datei namens kdesktop-screen-1rc erzeugt. So lassen sich beide Desktops völlig getrennt einrichten. Der zweite Desktop bietet auch eine separate Startleiste.
Ein kleiner Bug bei dieser Einstellung fiel beim Aktivieren des Screensavers auf: Zwar werden beide Desktops für Eingaben gesperrt, bis das Passwort eingegeben wird; der zweite Desktop bleibt aber sichtbar. Wer hier verhindern will, dass Neugierige einen Blick auf die Fenster des zweiten Monitors werfen, sollte diese vorher minimieren oder auf einen freien Desktop wechseln.



