||<>|| This HOWTO explains how to attach two monitors, two keyboards and two mice to a computer with only one two-head video-card. If you have two video-cards, you should read [[MultiseatX]] instead of this HOWTO. The instructions are for Ubuntu 10.04 LTS (lucid). = Display manager with support for XDMCP = A lot can go wrong with this setup and the fancy splash screen during the boot doesn't help. In order to disable it (maybe temporarily) edit `/etc/default/grub` and change the `GRUB_CMDLINE_LINUX_DEFAULT` assignment from `quiet splash` to `nomodeset noplymouth`. Then run `sudo update-grub`. The version of gdm in lucid is severely broken. It is not as configurable as version 2.20 and it doesn't even support some basic X protocols such as XDMCP. I suppose you should be able to use kdm, wdm or xdm instead of gdm, but for my setup I decided to use gdm-2.20. I suppose there are better ways to install the gdm-2.20 but my method also works. First, download the package from http://packages.ubuntu.com/karmic/gdm-2.20. Then go to the text console (Ctrl+Alt+F1), login, purge gdm (this is important), make sure `/etc/init/*gdm*` doesn't exist and install gdm-2.20: {{{ sudo su dpkg --force-depends --purge gdm ls /etc/init/*gdm* dpkg --install my_download_dir/gdm-2.20_2.20.10-0ubuntu3_amd64.deb apt-get install -f }}} The standard configuration of gdm-2.20 assumes that some directories (such as `/usr/X11R6`) exist. It is possible to correct the configuration of gdm but I preffered to create these missing directories: {{{ mkdir /usr/X11 ln -s ../bin/X11 /usr/X11/bin ln -s . /usr/X11R6 }}} Now it is time to test what you have done. Reboot the system and test that there is no splash screen and gdm starts. A message about missing theme may appear, don't be alarmed by it. If you want to start or stop this version of gdm, then don't use `start gdm` and `stop gdm`. Use `/etc/init.d/gdm start` and `/etc/init.d/gdm stop` instead. Login in order to install some gdm themes. Use `apt-cache search gdm-theme` to see the available themes and then install some. Run `sudo gdmsetup`. Under the '''Local''' tab select some theme and uncheck '''Show Actions menu'''. Under the '''Remote''' tab select '''Style: Same as Local'''. Then one important step: execute the following commands: {{{ rm /etc/alternatives/gdm-config-derivative ln -s /etc/gdm/gdm.conf /etc/alternatives/gdm-config-derivative }}} This step is required because we will need to edit `/etc/gdm/gdm.conf` and the themes often disable this configuration file. = Extended desktop through both monitors = The next step is to make your two monitors provide you with one bug desktop extended through both monitors. Create a file `/etc/X11/xorg.conf` with the following contents. This configuration assumes you are using some free-software driver - the non-free drivers often do not support the last version of the RANDR extension. Look at the lines marked with '### EDIT ###' and change them appropriately. The numbers at the `Virtual` line depend on the resolutions of your monitors. In my case I have one 1920x1080 monitor attached at the DVI output of the card and another 1280x1024 monitor attached at the VGA output. Then 3200=1920+1280 and 1080=max(1080,1024). {{{ Section "Monitor" Identifier "monitor0" EndSection Section "Monitor" Identifier "monitor1" Option "RightOf" "monitor0" EndSection Section "Device" Identifier "card0" Driver "radeon" ### EDIT ### Option "Monitor-DVI-0" "monitor0" ### EDIT ### Option "Monitor-VGA-0" "monitor1" ### EDIT ### EndSection Section "Screen" Identifier "screen0" Device "card0" Monitor "monitor0" DefaultDepth 24 SubSection "Display" Depth 24 Virtual 3200 1080 ### EDIT ### EndSubSection EndSection Section "ServerLayout" Identifier "default" Screen "screen0" EndSection }}} Turn both monitors on and test the configuration (run the following command from the text console): {{{ /etc/init.d/gdm restart }}} If everything is ok then you should see the gdm login screen on one of the monitors. Login and test that you can move the windows from one of the monitors to another. If you want you can also test that 3D effects work but this is not necessary and depends on the card you have. = Disable the local X server in gdm, enable XDMCP connections = The next step is to make gdm listen for XDMCP connections and make it not run the X server. First, find in `/etc/gdm/gdm.conf`, in the `[servers]` section a line starting with `0=....` (without `#` at the beginning of the line). Put a `#` in front of it. Then edit `/etc/gdm/gdm.conf-custom`. Find the `[security]` section and add a line `PamStack=gdm-2.20`, then find the `[xdmcp]` section and add a line `Enable=true`. XDMCP is not particularly secure protocol so it is a good idea to make gdm refuse connections from other computers. Add a line `gdm: 127.*` in `/etc/hosts.allow` and a line `gdm: ALL` in `/etc/hosts.deny`. Time to test. Run the following command in the text console: {{{ /etc/init.d/gdm restart }}} If you see the gdm login screen then there is something wrong with the gdm configuration. Check it again. If there is no login screen and X is not running, then run the following command: {{{ X -query 127.0.0.1 }}} Now you should see the login screen of gdm. Kill it (for example, go back to the text console and press Ctrl-C). = New user "monitor" = We are going to use a special user called "monitor" in order to start the graphical environment. It is not a system user - it has normal home directory (this helps debugging) but we will create it with a non-standard number. This number ensures the user "monitor" will be hidden in the login screen of gdm. Make sure you give a strong password of this user. {{{ addgroup --gid 983 monitor adduser --uid 983 --gid 983 monitor }}} In order to be able to control the keyboards and the mice of the computer, the user "monitor" has to have full access to the files in `/dev/input`. In order to achieve this, create a file `/etc/udev/rules.d/my.rules` with the following contents: {{{ SUBSYSTEM=="input", OWNER="monitor", GROUP="monitor" }}} I don't know how to test this without reboot, so reboot the machine and make sure the files in `/dev/input` are owned by "monitor". = Two desktops = Now the final stage. We need to install some packages: {{{ apt-get install x11-utils xserver-xephyr }}} Now we are going to make the user "monitor" start the X server and two instances of Xephyr. Xephyr is a X server that is able to output to a window on a pre-existing X display. We will run two instances of Xephyr - two windows, one for the first monitor and another for the second one. We will also configure these two instances of Xephyr to take control of the keyboard and mouse. Unfortunately Xephyr doesn't have an option `-display` which we could use to tell it the exact position and size of the window. Fortunately it has an option `-parent` that tells it to display in an existing window. So we are going to do this: 1. Run two windows with the proper size and position. It doesn't matter what program is used for the windows, but are going to use `xmessage`. 1. Use `xwininfo` in order to get the window ID. 1. Run Xephyr with option `-parent` But as we have two windows of `xmessage`, in order to be able to differentiate between both, we need to change the name of `xmessage`. Use the following commands to create aliases `xmessage0` and `xmessage1`: {{{ ln -s xmessage /usr/bin/xmessage0 ln -s xmessage /usr/bin/xmessage1 }}} Login with the user "monitor" (on the text console; you don't have a graphical environment yet, do you?). Create a file `~/.xsession` with the following contents: {{{ #!/bin/sh runscreen () { # $1 = number # $2 = geometry local xpid winid k while :; do xmessage$1 -geometry $2 "Window $1" & xpid=$! k=10 while \ winid=`xwininfo -name xmessage$1|grep 'Window id'|cut -d' ' -f4` \ && [ $k -gt 0 -a ! "$winid" ] do sleep 1 k=$(($k - 1)) done if [ "$winid" ]; then Xephyr :1$1 -parent "$winid" -dpms -keybd "evdev,,device=$3,$xkb" -mouse "evdev,,device=$4" -query 127.0.0.1 fi kill $xpid sleep 3 kill -9 $xpid done } # For some reason I was unable to set the following in xorg.conf # We need to turn off power management of the main X server because it doesn't # see either of the keyboards and the mice so it will enter power-saving mode # after 10 minutes xset s off xset dpms 0 0 0 xset -dpms xkb='xkbrules=xorg,xkbmodel=evdev,xkblayout=us' # PS/2 keyboard and mouse kbd1=`ls /dev/input/by-path/platform-*-event-kbd` mouse1=`ls /dev/input/by-path/platform-*-event-mouse` # USB keyboard and mouse kbd2=`ls /dev/input/by-path/pci-*-event-kbd` mouse2=`ls /dev/input/by-path/pci-*-event-mouse` runscreen 1 1280x1024+1920+0 "$kbd2" "$mouse2" & runscreen 0 1920x1080+0+0 "$kbd1" "$mouse1" }}} Notice - there is ampersand for the first `runscreen` command and no ampersand for the second. Change the screen sizes appropriately and optionally edit the `xkb=` line. If you want, you can use static assignments for `kbd1`, `mouse1`, `kbd2` and `mouse2` but I've read that sometimes the file names change. In order to be safe, I have used PS/2 keyboard and mouse for the first monitor and USB keyboard and mouse for the second monitor. Then the commands `ls ...` will discover the correct file names. Time to test. Run `startx` as user "monitor" and enjoy two login screens on your two monitors, each controlled by its own keyboard and mouse. = Automatic start at boot = The last step is to make all this start automatically at boot. Add at the end of `~monitor/.profile` the following lines: {{{ if [ "`tty`" = /dev/tty6 ]; then exec startx fi }}} Kill the graphical environment (`killall xinit`), go to the sixth text console(Ctrl+Alt+F6), login as monitor and the graphical environment should start. If everything is ok, edit (as root) `/etc/init/tty6.conf` and the replace the `exec /sbin/getty ...` line with the following one: {{{ exec /bin/login -f monitor tty6 /dev/tty6 2>&1 }}} If you want you can reconfigure pulseaudio as described at [[MultiseatX]]. It is time to make the final test - reboot the machine and enjoy your two separate desktops. = Multiseat assistant for Ubuntu 11.04 and Ubuntu 12.04 = There is an assistant to configure a multiseat system in Ubuntu 11.04 and Ubuntu 12.04. You can download from: http://code.google.com/p/multiseat-wizard-bicefalo/ tags: multiseat, one card, two head, lucid, xephyr ---- CategoryXwindowSystem CategoryInstallation