ASCII Smiley Face Daniel Dickinson Mini Headshot
The C Shore
Daniel Dickinson's Website - Experimental

NB: The main page content is close to the 2007-2011 version (you can view it with no styles or graphics). There are major technical updates for future work, however.

X.Org Dual Monitor Dual Server

Abstract: This HOWTO describes setting up a single computer which has two monitors on two separate video cards but only one keyboard and mouse such that there is a separate X server running for each display with a separate login session for each.


1. Introduction

This HOWTO describes setting up a single computer which has two monitors on two separate video cards but only one keyboard and mouse such that there is a separate X server running for each display with a separate login session for each.

1.1 System

2. Overview

3. The Configuration

3.1. Create configuration for the X servers

3.1.1. For Primary Display

Example /etc/X11/xorg.conf

  Section "InputDevice"
    Identifier	"Generic Keyboard"
    Driver		"kbd"
    Option		"XkbRules"	"xorg"
    Option		"XkbModel"	"pc104"
    Option		"XkbLayout"	"us"
  EndSection

  Section "InputDevice"
    Identifier	"Configured Mouse"
    Driver		"mouse"
  EndSection

  Section "Device"
    Identifier	"Configured Video Device"
    BusID		"PCI:01:00:00"
    Driver		"radeon"
    Option		"Int10"		"false"
  EndSection

  Section "Monitor"
    Identifier	"Configured Monitor"
    Option		"DPMS"
    Option		"PreferredMode"		"1600x1200"
  EndSection

  Section "Screen"
    Identifier	"Default Screen"
    Device		"Configured Video Device"
    Monitor		"Configured Monitor"
    Option		"NoInt10"	"true"
  EndSection

  Section "ServerLayout"
    Identifier "Primary Display"
    Screen "Default Screen"
    InputDevice "Generic Keyboard" "CoreKeyboard"
    InputDevice "Configured Mouse" "CorePointer"
    Option	    "IsolateDevice"    "1:0:0"
  EndSection

The most important settings above are:

    BusID		"PCI:01:00:00"
    Option	    "IsolateDevice"    "1:0:0"

If you’re having trouble with displays hanging during initialization the following settings (from above) are also important:

    Option		"Int10"		"false"
    Option		"NoInt10"	"true"

The BusID and IsolateDevice settings take the PCI id information in decimal. lspci lists the devices with PCI id information in hexadecimal (base 16), so you will have to convert the numbers to decimal to use the in xorg.conf.

Note the BusID for the configuration for the secondary display (below)

    BusID		"PCI:2:14:0"

It is associated with the lspci line

 02:0e.0 VGA compatible controller: ATI Technologies Inc 3D Rage II+ 215GTB [Mach64 GTB] (rev 9a)

Sample lspci output:

  00:00.0 Host bridge: Intel Corporation 82845 845 [Brookdale] Chipset Host Bridge (rev 04)
  00:01.0 PCI bridge: Intel Corporation 82845 845 [Brookdale] Chipset AGP Bridge (rev 04)
  00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 05)
  00:1f.0 ISA bridge: Intel Corporation 82801BA ISA Bridge (LPC) (rev 05)
  00:1f.1 IDE interface: Intel Corporation 82801BA IDE U100 Controller (rev 05)
  00:1f.2 USB Controller: Intel Corporation 82801BA/BAM USB Controller #1 (rev 05)
  00:1f.3 SMBus: Intel Corporation 82801BA/BAM SMBus Controller (rev 05)
  00:1f.4 USB Controller: Intel Corporation 82801BA/BAM USB Controller #1 (rev 05)
  01:00.0 VGA compatible controller: ATI Technologies Inc Radeon RV200 QW [Radeon 7500]
  02:09.0 SCSI storage controller: LSI Logic / Symbios Logic 53c875 (rev 04)
  02:0a.0 PCI bridge: Digital Equipment Corporation DECchip 21154 (rev 05)
  02:0b.0 Multimedia audio controller: Creative Labs SB Audigy (rev 04)
  02:0b.2 FireWire (IEEE 1394): Creative Labs SB Audigy FireWire Port (rev 04)
  02:0c.0 Ethernet controller: 3Com Corporation 3c905 100BaseTX [Boomerang]
  02:0d.0 Serial controller: 3Com Corp, Modem Division 56K FaxModem Model 5610 (rev 01)
  02:0e.0 VGA compatible controller: ATI Technologies Inc 3D Rage II+ 215GTB [Mach64 GTB] (rev 9a)
  03:00.0 PCI bridge: Digital Equipment Corporation DECchip 21154 (rev 05)

3.1.2. For Secondary Display

Example /etc/X11/xorg.conf.1

  Section "InputDevice"
    Identifier	"Generic Keyboard"
    Driver		"void"
    Option		"CoreKeyboard"
  EndSection

  Section "InputDevice"
    Identifier	"Configured Mouse"
    Driver		"void"
    Option		"CorePointer"
  EndSection

  Section "Device"
    Identifier	"Configured Video Device"
    BusID		"PCI:2:14:0"
    Driver		"mach64"
  EndSection

  Section "Monitor"
    Identifier	"Configured Monitor"
  EndSection

  Section "Screen"
    Identifier	"Secondary Screen"
    Device		"Configured Video Device"
    Monitor		"Configured Monitor"
    DefaultDepth	16
  EndSection

  Section "ServerLayout"
    Identifier "Secondary Display"
    Screen "Secondary Screen"
    InputDevice "Generic Keyboard" "CoreKeyboard"
    InputDevice "Configured Mouse" "CorePointer"
  EndSection

Notice the following setting:

   Driver		"void"

This requires the package xserver-xorg-input-void be installed (on Debian; other distributions will make the void driver available in other ways). Setting the mouse and keyboard driver to void and using

   InputDevice "Generic Keyboard" "CoreKeyboard"
   InputDevice "Configured Mouse" "CorePointer"

means that the server associated with this configuration has not access to input devices on the server (until we use x2x) and must therefore be controlled through software.

3.2. Configure GDM to start both servers

Here is an example /etc/gdm/gdm.conf

  [daemon]

  [security]

  [xdmcp]

  [gui]

  [greeter]

  [chooser]

  [debug]

  [servers]

  0=Primary
  1=Secondary

  [server-Primary]
  name=Primary Display
  command=/usr/X11R6/bin/X -audit 0 -isolateDevice PCI:1:0:0 vt7
  flexible=true

  [server-Secondary]
  name=Secondary Display
  command=/usr/X11R6/bin/X -audit 0 -config /etc/X11/xorg.conf.1 -isolateDevice PCI:2:14:0 -sharevts
  flexible=true

The important parts are the server* sections. Note the -isolateDevice parameter (which is the same as the BusID) and, for the secondary display, -config /etc/X11/xorg.conf.1

3.3. On primary login, obtain authorization to use secondary display

3.3.1. Script to copy secondary display authorization

  #!/bin/sh

  xauth -f "$1" merge /var/lib/gdm/:1.Xauth
  chown user:group "$1"
  /bin/chmod g+r "$1"

If you call this script merge-gdm-auth, it would used as:

merge-gdm-auth "$XAUTHORITY"

if you want to get the authorization for the secondary display into the user who just logged in.

3.3.2. Allow primary user to run the script as root

Modify /etc/sudoers with a line such as:

daniel	      ALL=(root) NOPASSWD: /usr/local/bin/merge-gdm-auth

3.3.3. Execute the command on login

Add a line such as the following to $HOME/.xsessionrc (for users who will use both displays)

sudo /usr/local/bin/merge-gdm-auth "$XAUTHORITY"

3.4. Share the mouse and keyboard with secondary display

3.4.1. Before login on secondary display

Make sure the command x2x is present on your system (package x2x on Debian) and add the following line to $HOME/.xsessionrc:

x2x -to :1 -east &

That gets us a mouse and keyboard we can use to move over to the secondary monitor (on the right)

3.4.2. After login on secondary display

We first need to make sure that the secondary user is able to obtain the authorization to use the primary display (for x2x)

3.4.2.1a. Method One
3.4.2.1a.4. Merge in primary user’s authorization

In secondary user’s $HOME/.xsessionrc

xauth -f "$XAUTHORITY" merge /home/daniel/.Xauthority-link
3.4.2.1a.5. Launch x2x

In secondary user’s $HOME/.xsessionrc

x2x -from :0 -east &
3.4.2.1b. Another method (untested)

Use sudo to let secondary user launch x2x as the primary user on the primary display (with primary user’s home directory)

In secondary user’s $HOME/.xsessionrc

 DISPLAY=:0 sudo -u primaryuser -to :1 -east

In /etc/sudoers

Defaults>primaryuser	always_set_home
Defaults:secondaryuser	env_keep = "DISPLAY XAUTHORITY"
secondaryuser	ALL=(primaryuser) NOPASSWD: /usr/bin/x2x

4. Gotchas


Author: Daniel F. Dickinson Address: openwrt@thecshore.com Version: 1.0 Date: February 23, 2009 Language: en