You are hereDual Head mit Lenovo T430

Dual Head mit Lenovo T430


By thomas - Posted on 28 Januar 2013

Der Lenove T430 (zumindest mal in der Version, in der ich ihn in der Arbeit bekommen habe) ist mit zwei Graphikkarten ausgestattet. Dieses mir noch zweifelhafte Austattungsmerkmal nennt sich Hybrid Graphic oder so. Nur, steckt man den Laptop in die Dockingstation und startet (wie in meinem Fall) ArchLinux drauf, so bleibt der externe Bildschirm erst mal schwarz. Das zu ändern war natürlich gleich eine Herausforderung.

Hardware: In jedem Fall sieht ein lspci | grep VGA hier so aus:

00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GF108 [Quadro NVS 5400M] (rev a1)

Betriebssystem: Installiert ist ArchLinux, darauf VirtualBox und dadrin wiederum eine Win7-Instanz. Als Desktop-Environment ist KDE installiert. Als Graphiktreiber sind sowohl die Intel- als auch die nVidia-Treiber installiert. Aber nicht die proprietären nVidia-Treiber sondern die offene Variante "nouveau":

pacman -S lib32-intel-dri  lib32-nouveau-dri xf86-video-nouveau xf86-video-intel nouveau-dri intel-dri

Zielsetzung: Ziel ist es, den externen Monitor nutzbar zu machen. Was ich haben möchte ist Fenster auf dem Screen auf und zu machen können, ob mit oder ohne Graphikbeschleunigung durch irgendwelche GPUs. Letzteres ist mir völlig egal weil ich eh meistens nur vor dem EMail-Cient oder Browser sitze - zwischenrein mal ein Dokument bearbeiten.

Die X11-Konfiguration
Ums Kurz zu machen, der Witz liegt in der X11-Konfiguration (welch Überraschung, nicht wahr? ;-)).
Läßt man Xorg die Konfiguration von sich selbst selber machen, bleibt der zweite Bildschirm leer, nur die Intel-Karte wird angesprochen. Also muss man hier ein bisschen Hand anlegen und nachhelfen. Zu den in /etc/X11/xorg.conf.d/ abgelegten Dateien bauen wir noch eine Weitere die die zweite Graphikkarte aktiviert und anspricht:

cat > /etc/X11/xorg.conf.d/90-dualhead.conf <
Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        Screen      1  "Screen1" RightOf "Screen0"
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        ModulePath   "/usr/lib/xorg/modules"
        FontPath     "/usr/share/fonts/misc/"
        FontPath     "/usr/share/fonts/TTF/"
        FontPath     "/usr/share/fonts/OTF/"
        FontPath     "/usr/share/fonts/Type1/"
        FontPath     "/usr/share/fonts/100dpi/"
        FontPath     "/usr/share/fonts/75dpi/"
EndSection

Section "Module"
        Load  "glx"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/mice"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
        Identifier   "LVDS2"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
EndSection

Section "Monitor"
        Identifier   "VGA2"
        VendorName   "Monitor Vendor 1"
        ModelName    "Monitor Model 1"
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: : integer, : float, : "True"/"False",
        ### : "String", : " Hz/kHz/MHz",
        ### : "%"
        ### [arg]: arg optional
        #Option     "NoAccel"                   # []
        #Option     "AccelMethod"               # 
        #Option     "Backlight"                 # 
        #Option     "DRI"                       # 
        #Option     "ColorKey"                  # 
        #Option     "VideoKey"                  # 
        #Option     "Tiling"                    # []
        #Option     "LinearFramebuffer"         # []
        #Option     "SwapbuffersWait"           # []
        #Option     "TripleBuffer"              # []
        #Option     "XvPreferOverlay"           # []
        #Option     "HotPlug"                   # []
        #Option     "RelaxedFencing"            # []
        #Option     "XvMC"                      # []
        #Option     "ZaphodHeads"               # 
        #Option     "TearFree"                  # []
        #Option     "PerCrtcPixmaps"            # []
        #Option     "FallbackDebug"             # []
        #Option     "DebugFlushBatches"         # []
        #Option     "DebugFlushCaches"          # []
        #Option     "DebugWait"                 # []
        #Option     "BufferCache"               # []
        Identifier  "Card0"
        Driver      "intel"
        BusID       "PCI:0:2:0"
EndSection

Section "Device"
        Identifier  "Card1"
        Driver      "nouveau"
        BusID       "PCI:1:0:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "LVDS2"
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
        EndSubSection
EndSection

Section "Screen"
        Identifier "Screen1"
        Device     "Card1"
        Monitor    "VGA2"
EndSection
EOF

Nach einem Restart ercheint auf den externen Bildschirm ein weiterer Desktop von KDE. Mit der Maus lässt sich quer von einem zum anderen Bildschirm fahren, nicht aber Fenster verschieben. Die Frage ist nun, wie bekommt man denn nun Anwendungen auf den zweiten Desktop?
Aus dem zweiten Desktop kann man eine eigene Startleite installieren und darin wiederum Widgets anflanschen. Soweit so gut. Nun, irgendwoher muß das System aber doch wissen, wo auf welchen Desktop was anzuzeigen ist. Via Konsole kann man das Environmen prüfen und daraus kommt dann die Erkenntniss:

set
...
DISPLAY=:0.1
...


Aha, also tatsächlich ein eigener X11-Screen. Somit müsste durch gezieltes Setzen der DISPLAY-Environment-Variable steuerbar sein, wo die jeweilige Anwendung startet. Und genaus so ists auch:

DISPLAY=:0.0 --> linker Monitor (bei mir steht Laptop links vom ext.BS)
DISPLAY=:0.1 --> rechter Monitor, also der ext.BS

Nun noch schnell ein kleines Script:

cat > ~/on-right <
#!/bin/sh

pgm=$(basename $0)

if [ "$pgm" == "on-left" ]; then
    export DISPLAY=:0.0
elif [ "$pgm" == "on-right" ]; then
    export DISPLAY=:0.1
else
    true;    # leave DISPLAY untouched
fi

# Exec the passed command
exec $@
EOF
ln -svf on-right on-left
chmod 754 ./on-right

Ich habe das Script on-right getauft und einen symbolischen Link als on-left angelegt. Ein ./on-right xterm startet nun ein Terminal auf den ext. Monitor, ein ./on-left xterm auf der linken Seite.

Für mich tuts das...