Thursday, February 21, 2008

Multiseat in Ubuntu 8.04 (II)

<< step (I) <<

Once we have modified the xorg.conf file and we have a big desktop in the two monitors, the next thing is to configure gdm to launch the two Xephyr sessions.

Previously, you will need to obtain the information related to the input events on your system. The way of referencing the events has been recently modified. Now, the operating system allows you to access the events via their paths, and on some systems, via their names. The script wrapper to launch Xephyr it is now simpler compared to the previous version. It is not necessary any more to match the events with the physical locations (as we did through /proc/bus/input/devices)

You must obtain the path-based symbolic links to the events corresponding to your keyboards and mouses. In our particular case, whe have two USB keyboards, one USB mouse and one PS/2 mouse.


# ls -la /dev/input/by-path/ | grep event | grep kbd
lrwxrwxrwx 1 root root 9 2008-02-20 09:49 pci-0000:00:1d.2-usb-0:1:1.0-event-kbd -> ../event5
lrwxrwxrwx 1 root root 9 2008-02-20 09:49 pci-0000:00:1d.2-usb-0:2:1.0-event-kbd -> ../event6

# ls -la /dev/input/by-path/ | grep event | grep mouse
lrwxrwxrwx 1 root root 9 2008-02-20 09:49 pci-0000:00:1d.3-usb-0:1:1.0-event-mouse -> ../event8
lrwxrwxrwx 1 root root 9 2008-02-20 09:49 platform-i8042-serio-1-event-mouse -> ../event2


The invocation of the Xephyr wrapper in the (/etc/gdm/gdm.conf) file will be something like this (remember to do a backup of your files before doing any modification!):


# ****************************************************************************

# Modificaciones multiseat (20080109)

0=Xephyr0
1=Xephyr1
2=Xephyr2

[server-Xephyr0]
name=Xephyr0
command=/usr/bin/X -br -dpms -s 0
handled=false
flexible=false

[server-Xephyr1]
name=Xephyr1
command=/usr/sbin/Xephyr-path.sh -display :0 -br -xauthority /var/lib/gdm/:0.Xauth -screen 1280x1024 -kbdpath pci-0000:00:1d.2-usb-0:2:1.0-event-kbd -mousepath platform-i8042-serio-1-event-mouse
handled=true
flexible=false

[server-Xephyr2]
name=Xephyr2
command=/usr/sbin/Xephyr-path.sh -display :0 -br -xauthority /var/lib/gdm/:0.Xauth -screen 1280x1024+1280+0 -kbdpath pci-0000:00:1d.2-usb-0:1:1.0-event-kbd -mousepath pci-0000:00:1d.3-usb-0:1:1.0-event-mouse
handled=true
flexible=false

# ****************************************************************************


Notice that the Xepyr wrapper is called Xephyr-path.sh (just to remark the modification). If you prefer to reference the devices by its name instead of the path, obtain the names in a similar way (have a look at /dev/input/by-name/) and do the necessary modifications on the wrapper.

Since the previous version, xserver-xephyr has been modified so the script is slightly different from the old one. Place the script somewhere in your computer (and remember to give it execution permissions) so it can be invoked when gdm starts. In our prototype, the wrapper is placed at /usr/sbin/Xephyr-path.sh


#!/bin/bash

# 20080109..20080221 - josean
# http://netpatia.blogspot.com/

trap "" usr1

XEPHYR=/usr/bin/Xephyr

args=()

while [ ! -z "$1" ]; do
if [[ "$1" == "-xauthority" ]]; then
shift
if [ ! -z "$1" ]; then
export XAUTHORITY="$1"
fi
elif [[ "$1" == "-display" ]]; then
shift
if [ ! -z "$1" ]; then
export DISPLAY="$1"
fi
elif [[ "$1" == "-kbdpath" ]]; then
shift
if [ ! -z "$1" ]; then
args=("${args[@]}" "-keybd")
args=("${args[@]}" "evdev,,device=/dev/input/by-path/$1,xkbrules=xorg,xkbmodel=evdev,xkblayout=es")
fi
elif [[ "$1" == "-mousepath" ]]; then
shift
if [ ! -z "$1" ]; then
args=("${args[@]}" "-mouse")
args=("${args[@]}" "evdev,,device=/dev/input/by-path/$1,WHEELRelativeAxisButtons 6 7")
fi
else
args=("${args[@]}" "$1")
echo "+++ args $1 +++" >> /tmp/logXephyr
fi
shift
done

echo $XEPHYR -ac "${args[@]}" >> /tmp/logXephyr
exec $XEPHYR -ac "${args[@]}"


Notice the changes, mainly in the options passed to the evdev driver for mouse and keyboard.

Another significant change on the wrapper script is the removal of the line...

elif ! expr match $1 'vt[0-9][0-9]*' >/dev/null; then

...from the 6.06 version. Now, the parameters related to virtual terminals are not filtered, so they are passed in the final invocation. In our prototype, the two seats share the same vt (vt9) and this seems to be no problem at all. If you have more seats or you experience some problem, maybe you will need to filter the vt parameters in the final Xephyr call.

Currently, the mouse wheel (vertical scroll) is not working. The option WHEELRelativeAxisButtons is just to try to get it working, but without success at the moment. Unfortunately there is not much documentation about evdev and its options. If somebody achieves to manage the mouse wheel, feedback is welcome.

The good news is that the keyboard mapping seems to work properly. After dozens of trials with parameters (keyboard layouts, mapping, geometry), an updated package of xserver-xephyr was published some days ago. The new package corrected a bug in the path locations where evdev was looking for keyboard definition files. Now everything works perfect, you just have to choose the language layout for your keyboard (Spanish in our example).

If you test the system at this stage, you will probably see just only one login window. There is still a couple of things to do before your system is ready to use.

>> step (III) >>

Tuesday, February 19, 2008

Asus Eee PC: Hardware support in Ubuntu 8.04

Software tested: Ubuntu 8.04 alfa 4 + updates available on 20080219
Hardware environment: Asus Eee PC 4G (Black Galaxy)

Wifi:

The wifi chipset - Atheros AR2425 (AR5007EG) - is identified, and the propietary drivers are loaded.



Sadly, right now, wifi can not be used unless you install the appropriate patches. The dmesg command shows an error message: Hardware revision not supported, so the driver has not support for that piece of hardware.


394-[ 41.672159] ath_hal: module license 'Proprietary' taints kernel.
395-[ 41.802765] ath_hal: 0.9.18.0 (AR5210, AR5211, AR5212, RF5111, RF5112, RF2413, RF5413)
396-[ 42.159082] ACPI: Battery Slot [BAT0] (battery present)
397:[ 42.223421] wlan: 0.8.4.2 (0.9.3.3)
398-[ 42.450675] ath_pci: 0.9.4.5 (0.9.3.3)
399-[ 42.451801] ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 18 (level, low) -> IRQ 18
400-[ 42.451824] PCI: Setting latency timer of device 0000:01:00.0 to 64
401-[ 42.500081] wifi%d: unable to attach hardware: 'Hardware revision not supported' (HAL status 13)
402-[ 42.500114] ACPI: PCI interrupt for device 0000:01:00.0 disabled


Wired Ethernet:

Hardware on the Eee PC according to the original Xandros: Atheros Technology Corp. L2 100 Mbit Ethernet Adapter. Ubuntu 8.04 detects it as Attansic Technology Corp. L2 100 Mbit Ethernet Adapter and loads the correspondig drivers (atl2). The wired network seem to work properly. I have found just a small bug in the counter of the outbound traffic (always zero).

The original Xandros uses
Atheros(R) L2 Ethernet Network Driver - version 1.0.40.4

while Ubuntu uses
Attansic(R) L2 Ethernet Network Driver - version 1.0.40.2


As you can imagine Atheros and Attansic are just the same right now.

ACPI:
Suspend: You can suspend the computer (it takes a long time but finally it does suspend). When you restore, everything seems to be right. The only small detail is that the screen brightness does not maintain the previous settings. The screen brightness is set to max when you restore. You only have to adjust the brightness.

Power off: The live CD powers off properly. Once installed you have to press the power button for several seconds to power the computer off.

CPU frequency: Not tested

Audio:

It seems to work right. Some ocassional strange noises. Maybe not still 100% supported, but it works well enough to be usable without modifications.

Camera:

The video camera works out of the box. just be sure to have the camera enabled on the BIOS. The system loads the uvcvideo drivers and the camera is just ready to use.



Special buttons:
I have tested the suspend, Wifi on/off and brightness adjustment buttons. They work properly with no need for previous configuration.

Multiseat computer with Ubuntu 8.04

The goal of this guide is to achieve a multiseat (also called multiterminal) computer so that more than one user can work simultaneously with the computer.

Update (20090619): New tutorial for Multiseat in Ubuntu 9.04 available




In our particular case, we want to obtain a computer for two users, and as a constraint we want to use only one video card. Obviously the card will be a multihead one.

Our hardware can be considered as a low cost PC: The computer is equiped with a Pentium 4 at 3GHz, 512MB of RAM and a 80GB hard sisk. The video card is a Radeon X300 PCIe by ATI with two outputs (VGA and DVI). On the DVI output we have a DVI to VGA converter so we can connect two simple VGA monitors.

What to do step by step:

1.- Install the latest available version of Ubuntu 8.04 on your hard disk. We started the first prototype with the alfa 2 version and several of the problems that we encountered have been already fixed.

2.- After the installation do a package update to be sure that your system has the latest available packages.

One of the main changes in the multihead configuration is the use of xrandr. First of all you must plug the two monitors to your graphic card and obtain your configuration details. Read carefully the instructions of xrandr. The video out connections (VGA, DVI) are referenced with different names depending on your card manufacturer.


# xrandr -q
Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 2560 x 1024
VGA-0 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 337mm x 270mm
1280x1024 60.0*+ 75.0 59.9
1152x864 75.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3
640x480 75.0 72.8 60.0
720x400 70.1
DVI-0 connected 1280x1024+1280+0 (normal left inverted right x axis y axis) 337mm x 270mm
1280x1024 60.0*+ 75.0 59.9
1152x864 75.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3
640x480 75.0 72.8 60.0
720x400 70.1
S-video disconnected (normal left inverted right x axis y axis)


Once you have this information, you can modify your /etc/X11/xorg.conf file. It is very advisable to make a backup of the original (working) configuration file.

This is the xorg.conf for the prototype here presented:


# xorg.conf (X.Org X Window System server configuration file)

Section "Module"
Load "dri"
Load "drm"
Load "glx"
EndSection

Section "DRI"
Mode 0666
EndSection

Section "Extensions"
Option "Composite" "Enable"
EndSection

Section "InputDevice"
Identifier "Keyboard-base"
Driver "kbd"
# Option "Device" "/dev/null"
Option "XkbRules" "xorg"
Option "XkbModel" "evdev"
Option "XkbLayout" "es"
EndSection

Section "InputDevice"
Identifier "Mouse-base"
Driver "mouse"
Option "Device" "/dev/null"
EndSection

Section "Device"
Identifier "Card0"
BoardName "ATI Technologies Inc RV370 5B60 [Radeon X300 (PCIE)]"
Driver "ati"
BusID "PCI:1:0:0"
Option "Monitor-VGA-0" "Mon-VGA"
Option "Monitor-DVI-0" "Mon-DVI"
EndSection

Section "Monitor"
Identifier "Mon-VGA"
Option "DPMS"
EndSection

Section "Monitor"
Identifier "Mon-DVI"
Option "DPMS"
Option "RightOf" "Mon-VGA"
EndSection

Section "Screen"
Identifier "Screen-base"
Device "Card0"
Monitor "Mon-VGA"
DefaultDepth 24
Subsection "Display"
Depth 24
Modes "1280x1024" "1024x768"
Virtual 2560 1024
EndSubSection
EndSection

Section "ServerFlags"
# Even if mouse detection fails, X will start
Option "AllowMouseOpenFail" "yes"

# VT switching is disabled
Option "DontVTSwitch" "yes"

# X restart (Ctrl+Alt+Backspace) is disabled
Option "DontZap" "yes"
EndSection


The lines ...

Option "Monitor-VGA-0" "Mon-VGA"
Option "Monitor-DVI-0" "Mon-DVI"

... are to indicate which monitor is connected to each of the card video outputs.

You can eliminate some lines, such as those related to acceleration (dri, glx). As we will use Xephyr, the final result will not have 3D acceleration. In our case, that does not matter because the PC will be used on an office environment, mainly for administrative tasks.

The line ...

Virtual 2560 1024

... on the screen section is like a kind of bounding box containing the two monitor. As you can see, we have two 1280x1024 monitors in a side by side configuration.

If you restart the X system, you will have a big desktop across the two monitors.

Update (20080508): Comment out the "/dev/null" option in the mouse section. In the final configuration you will not need the base mouse anymore, but this line in this moment will let your desktop without mouse support.


Section "InputDevice"
Identifier "Mouse-base"
Driver "mouse"
-> Option "Device" "/dev/null"
EndSection


>> step II >>

Friday, February 15, 2008

Asus Eee PC: Install Ubuntu 8.04 on a USB stick

Ubuntu, the popular Linux distribution, is catching the attention of more and more people every day.

Many distributions today are available as live CD / DVD, so you can just test the new operating system with no modifications at all on your computer.

There are lots of tutorials and howtos on the web covering the topic of the installation, but our goal and the reason of this post is a bit different.

If you want to go ahead further than you can do just with a live distribution, then you will need to install the operating system on your computer. Maybe you want to start using the new system while maintaining the previous one, and I mean a full use (update packages, install applications, install additional drivers to test if your hardware is supported, and so on).

If you do not want to mess with your hard disk partitions and you only have one hard disk available (as laptop owners have), then you should consider to install the system on an external device.

Luckily we have today many options available such as USB disks, USB memory or even memory cards that can act as boot devices. Those devices are available today at cheap or moderated prices.

We have a laptop: The popular Asus Eee PC with its original operating System (a customized version of Xandros). We want to install Ubuntu (Ubuntu 8.04 alfa 4) on the laptop but we do not want to remove the original system. We will use a 8GB USB memory as the target device where new the operating system will be installed.

Prepare the media containing the live CD installation disk. You can download Ubuntu as an .iso file to be recorded on a CD (DVD). Alternatively you can extract the files from the .iso to a USB memory and make it bootable. This way you will have a live USB with your Ubuntu distribution. You can find tutorials with instructions to do this.

I used an USB with only one big partition of 1GB. Then I resized it to 720MB obtaining a second one of about 260MB. That can be a good idea if you plan to do some work (such as creating documents or downloading from the web) since the second partition will be available in read + write mode. In my first trial I used an additional SD card just to store the screenshots of this tutorial. With two partitions on the live USB you can avoid the need of a second storage device even if you want to take screenshots.

Plug your live USB and boot your computer. If you are doing this on the Eee PC, just press the Esc key in the first screen to choose which device to boot from. Wait until the live system is fully loaded and running.



Plug the target USB memory (where you are going to install the operating system). In this case I used one having 8GB, but the default install takes less than 2GB. I do recommend to use one having at least 4GB (you are going to need additional space for your files, to download package updates, to install additional applications, ...) or you will have almost no free space.

Click on the install icon.



Choose your prefered language, your timezone and the keyboard layout. When asked to prepare disk space, choose to manually partition the disk.



I do recommend to create partitions. This is an optional step and you can use the whole disk without partitions, but if you plan to update / upgrade your system it may be convenient to have separated partitions to mount the /boot and /home directories. Create the partitions on the desired media according to your preferences.



In particular, I have done three partitions: ~100MB (/boot), ~6GB (/), and ~2GB (/home)



Rmember to choose a filesystem without journaling (i.e. avoid using ext3). I have used ext2 on all filesystems.





The system may present you some warnings about "incompatible features", "uncorrected errors" or lack of "swap partition". You can ignore these warning and follow to the next step.



Then, you will be asked for some personal data to create your account on the system



The system looks for previous data. It this is a first install it will find nothing to import.



Ready to install. Be extremelly careful in this step. If you just choose to continue, the installer will modify the MBR of your main disk (the SSD containing the original Xandros or whatever you installed on your disk).



This is the lower part of the window, with the Advanced... button:



Choose the correct location (hd0) is the SSD, use the item corresponding to your media, such as: (hd1), /dev/sdc, or whatever else.



Once decided whether to use a boot manager and its location, the installation begins.



Be patient. Flash disks are not as fast as a clasical HD. The installation process will take a lot of time.

Before rebooting the system, check /boot/grub/menu.lst If your boot device is not the SSD the references to your device will be wrong. Replace (hd2,0) or (hd1,0) by (hd0,0). When you boot from the removable media, this media is seen as hd0 by the system.

Once finished, you can finally boot on your newly installed device




Versión en español: Instalar Ubuntu 8.04 en una memoria USB

Wednesday, February 13, 2008

Video of Ubuntu 8.04 multiseat computer

At last, the prototye of the Ubuntu 8.04 multiseat computer is already running.

We started working on that prototype with the alfa 2 version, and currently it runs under the alfa 4 one. During this time many bugs have been fixed and what seemed impossible to achieve one month ago, is a working computer right now.

In this moment, we have a computer usable and apparently stable. Two people can use (share) simultaneously the computer, and this one uses only one graphic card (the same as we did in our first trial).



There are still some minor bugs and limitations, but we hope that things will keep improving in the two remaining months until the publication of the final release.

Monday, January 28, 2008

Coming soon: Multiseat in Ubuntu 8.04

In three months the guys of canonical are releasing the next Ubuntu version. As they did with the 6.06, the 8.04 is a LTS (Long Term Support) version. That ensures three years of support (updates, security fixes, etc), so these versions are ideal for sites intended to be working for a very long period of time with a minimal maintenance (i.e. no intentions to do major version upgrades but only keeping up to date the original version).



There are several changes that affect to the current multiseat configuration. The goal is just the same as it was in our fist multiseat configuration (using Ubuntu 6.06): To obtain two seats using just one graphic card with two video outputs.

The Ubuntu 8.04 release includes xorg 7.3 with some important changes compared to previous versions. The main advantage of that version is that the xserver-xephyr package includes support for evdev input events. We finally can obtain a full multiseat computer just doing some modifications in configuration files, and with no need of external patches. That eases the setup of the system as well as it avoids problems in the process of package updating.

Another relevant change is the use of xrandr instead of xinerama to manage the multiple outputs of a video card. At the begining that was a problem until we found a way to obtain the same as we did on the previous version: Showing a xephyr session on every screen.

We have been doing several tests with Ubuntu 8.04 alfa 2 and alfa 3. The result is a working prototype but we are still having some issues to fix. The fact of working with alfa and prerelease versions means to deal with additional problems, but we are confident in obtaining an easy to follow step by step tutorial to create a two seat computer when the final 8.04 version will be released.

Saturday, May 05, 2007

Multiseat in Ubuntu 7.04

The multiseat computer configuration has been carried out again on a new computer with the Ubuntu 7.04 release.



The main difference in this installation is that a brand new computer has been used. The computer was equiped with a PCI-Express card (nVidia 6600), instead of using an AGP card as we did in our first installation.




The big news are that the problems related to keyboard configuration seem to be solved. The page related to gdm and xkb has been updated with instructions on how to solve the keyboard missconfiguration problem reported by several users.



Update (20080114): Pics added. The pics were taken on 20070518

Wednesday, November 01, 2006

Google Maps + SIGPAC: Spain in high definition

Interesting development carried on based on two very useful products. By the combination of each one's advantages, the result is a product that avoids the limitations of each separate one.

On one side, Google Maps: The well known application offering satellite images (among other features) of the whole planet. This product has a nice interface very easy to use. Its only limitation, the areas in some countries (in this case, Spain) still not available as high resolution imagery.

On the other side, SIGPAC, the geographical information system from the Spanish Ministerio de Agricultura, Pesca y Alimentación. This application is publicly available, and it allows viewing ortophotos of the whole country in high detail level. The main drawbacks, are the images being a bit aged and a user interface suffering from some limitations.




The solution: just to combine the best of the two systems. Let the Google Maps interface use the SIGPAC maps when viewing areas not available in high detail level, and to continue using the original Google Maps imagery when available in high detail.

Best of all, is that even using external maps (such as the SIGPAC ones), we can still combine the additional information coming from Google Maps. This way, we can see street and route maps properly placed all over the SIGPAC images.

Here, you can view the mix Google Maps + SIGPAC

Spanish version of this story here

Friday, October 20, 2006

Multiseat in Mandriva 2007

I was on the web, looking for information on Xephyr, when I accidentally discovered an interesting feature. The Mandriva 2007 Linux distribution includes in the standard repositories a version of Xephyr with evdev support.

In the changelog, you can find that the 'evdev' patch has been included:


* Tue Jul 04 2006 Gustavo Pichorim Boiko <..mail@removed..>
+ 2006-07-03 11:05:06 (38323)
- Removed the FIXME lines. All fixed.
- Added a patch providing evdev support for the Xephyr kdrive server. It is used
for multihead/multiseat solutions


So, I now have an additional TO DO in my pending tasks: Test if a multiterminal configuration can be obtained using a standard distribution without additional external packages or patches. Maybe Mandriva 2007 will be the first affirmative answer.

Saturday, September 09, 2006

Multiseat (VI): Final notes

(...comes from step V)



This project is just an evaluation prototype. It has been developed in a Hospital environment to determine if the computer on every medical examination room can be used simultaneously by two people.

Currently there is a computer on every examination room. Through the computer, some administrative tasks related to the patient are carried on by a nurse. There is also a web based information system, used by the physician to access to the medical information of every patient.

The goal is to share the same computer for administrative and medical tasks simultaneously (that is why only two seats are necessary in our case study) and evaluate the opinions of the final users about the new system.

Friday, September 08, 2006

Multiseat (V): gdm and xkb

(...comes from step IV)



The next step is to configure gdm to indicate how to execute Xephyr.sh (the wrapper script). The call includes a couple of parameters (display and xauthority) that will be converted to environment variables . The other pair of parameters are the physical addresses of the input devices, that will be converted to the event numbers to be used as keyboard and mouse events.


# cp /etc/gdm/gdm.conf /etc/gdm/gdm.conf.bak
# vi /etc/gdm/gdm.conf


Only the servers section of the gdm.conf file is shown

[servers]

0=Xephyr0
1=Xephyr1
2=Xephyr2

[server-Xephyr0]
name=Xephyr0
command=/usr/bin/X -ac -br
handled=false
flexible=false

[server-Xephyr1]
name=Xephyr1
command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -kbdphys isa0060/serio0/input0 -mousephys isa0060/serio1/input0 -use-evdev
handled=true
flexible=false

[server-Xephyr2]
name=Xephyr2
command=/usr/sbin/Xephyr.sh -display :0.1 -xauthority /var/lib/gdm/:0.Xauth -fullscreen -kbdphys usb-0000:00:1d.1-1/input0 -mousephys usb-0000:00:1d.1-2/input0 -use-evdev
handled=true
flexible=false


Notice theat the command lines have been split for better readability.

Right now, you already have a multiseat computer. If you start the graphic mode, you will see the two monitors showing the gdm login screen.

# /etc/init.d/gdm start


In this moment there is only one problem remaining: To be able to obtain a proper configuration of the keyboards.

According to messages in several forums on Internet, evdev seems to have some problems still waiting to be patched related to keyboard configuration. Some options are ignored, some others can lead to a fully missconfigured keyboard (no one key mapping to the correct one). After many hours looking for information, and dozens of trial-error tests with setxkbmap, we finally achieved to obtain a correct keyboard configuration.

The best solution is to create a keyboard configuration file for every Xephyr session (change the layout according to your particular locale):


# vi /etc/X11/xkb/X1-config.keyboard
model = "pc105"
keycodes = "evdev"
layout = "es"


# cp /etc/X11/xkb/X1-config.keyboard /etc/X11/xkb/X2-config.keyboard


Do never include this line rules = "evdev" in the Xn-config.keyboard file. Every test we did (and we did really lots of tests!) having such line present, the result was a useless keyboard with no correct keys at all!

Update (4-May-2007): Since we are using a Xephyr compiled on another distribution, there seem to be an issue with the directories, and some configuration files can not be found. Including these additional lines, you can avoid all the keyboard related problems:

# ln -s /usr/share/X11/xkb /usr/lib/X11/xkb
# cp /etc/X11/xkb/X*.keyboard /usr/lib/X11/xkb
# cp `which xkbcomp` /usr/lib/X11/xkb
# mkdir /usr/lib/X11/xkb/compiled


Launch again the gdm, and have a coffee break. Your new toy is ready to play with!

(continues on step VI...)

Multiseat (IV): evdev and Xephyr

(...comes from step III)




What is evdev?


evdev is the generic input event device driver. It passes the events generated in the kernel (since version 2.6.8) straight to the program, with timestamps.

The evdev driver is able to separate and distinguish events coming from different keyboards and mouses plugged into the computer. The xorg supports evdev input driver module since version 6.9/7.0 . This way, it can get separated input events coming from every seat (keyboard and mouse pair) on the system.


This is a great step compared to previous multiseat solutions, since it makes possible to have multiterminal systems without having to patch neither the kernel nor the X server.

What is Xephyr?

Xephyr is a kdrive based X Server which targets a window on a host X Server as its framebuffer. In other words, it is a piece of software which creates a X server on top of another X server. That will allow us to run as many Xephyr instances as seats we have in our system. Every Xephyr instance will cover the area shown in a given display, and finally, evdev will allow us to separate the different input devices.

The good news

Xephyr is included in the universe repository from Ubuntu.

The bad news

The Xephyr version included in the Ubuntu repository, does not support evdev. I hope in a near future Xephyr comes with evdev upport.

Right now, you will have either to patch the Xephyr sources and compile it, or download an already patched solution. Download links for both solutions are available here.

# wget http://www.c3sl.ufpr.br/multiterminal/howtos/xephyr-precompiled.tar.bz2
# tar -xjf xephyr-precompiled.tar.bz2 --directory /usr/local/

Now it is time to plug your second set of keyboard and mouse. The evdev driver will access the input coming from every device by means of a given event in the form of /dev/input/eventNN. You must obtain the event id associated to every input device.

A new problem arises, since the event number assigned can change (in fact, it changes) between different boots. To solve this problem we well use a wrapper script. The script is the same as proposed here, but modified in order to obtain the event number given the physical connection of the device. We are assuming that the devices will be always plugged in the same position (you can label the back connectors to remember the correct position). Since the physical device addresses do not change between boots, the script can obtain the corresponding event id and match it properly with one physical keyboard or mouse.

Input devices and events, once plugged the second keyboard and mouse:

# cat /proc/bus/input/devices
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/class/input/input0
H: Handlers=kbd event0
B: EV=120013
B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7

I: Bus=0011 Vendor=0002 Product=0005 Version=0000
N: Name="ImPS/2 Generic Wheel Mouse"
P: Phys=isa0060/serio1/input0
S: Sysfs=/class/input/input1
H: Handlers=mouse0 event1 ts0
B: EV=7
B: KEY=70000 0 0 0 0 0 0 0 0
B: REL=103

I: Bus=0010 Vendor=001f Product=0001 Version=0100
N: Name="PC Speaker"
P: Phys=isa0061/input0
S: Sysfs=/class/input/input2
H: Handlers=kbd event2
B: EV=40001
B: SND=6

I: Bus=0003 Vendor=0d62 Product=001c Version=0202
N: Name="Darfon USB Combo Keyboard"
P: Phys=usb-0000:00:1d.1-1/input0
S: Sysfs=/class/input/input5
H: Handlers=kbd event4
B: EV=120003
B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: LED=7

I: Bus=0003 Vendor=0d62 Product=001c Version=0202
N: Name="Darfon USB Combo Keyboard"
P: Phys=usb-0000:00:1d.1-1/input1
S: Sysfs=/class/input/input6
H: Handlers=kbd event5
B: EV=3
B: KEY=3078 d801d101 1e0000 0 0 0

I: Bus=0003 Vendor=046d Product=c03f Version=2000
N: Name="Logitech USB-PS/2 Optical Mouse"
P: Phys=usb-0000:00:1d.1-2/input0
S: Sysfs=/class/input/input8
H: Handlers=mouse1 event3 ts1
B: EV=7
B: KEY=f0000 0 0 0 0 0 0 0 0
B: REL=103


The Name section will help us to identify the device. The Phys section is the parameter that we will send to the wrapper script in order to start every Xephyr instance.

The Xephyr wrapper

Now, it is time to create the wrapper script. The original one is modified to obtain the event numbers from the physical addresses

# vi /usr/sbin/Xephyr.sh


This is the final wrapper script:

#!/bin/bash

# 20060905 - josean - added get_event() function to obtain eventNN from a physical address
# Original version:
# http://en.wikibooks.org/wiki/Multiterminal_with_Xephyr
# http://www.c3sl.ufpr.br/multiterminal/howtos/Xephyr.sh

trap "" usr1

XEPHYR=/usr/local/bin/Xephyr

get_event()
{
evento=`grep -A2 $1 /proc/bus/input/devices | grep 'H: Handlers=' | grep --only-matching -e 'event[0-9]*'`
}

args=()

while [ ! -z "$1" ]; do
if [[ "$1" == "-xauthority" ]]; then
shift
if [ ! -z "$1" ]; then
export XAUTHORITY="$1"
fi
elif [[ "$1" == "-display" ]]; then
shift
if [ ! -z "$1" ]; then
export DISPLAY="$1"
fi
elif [[ "$1" == "-kbdphys" ]]; then
shift
if [ ! -z "$1" ]; then
get_event $1
args=("${args[@]}" "-keyboard")
args=("${args[@]}" "/dev/input/$evento")
fi
elif [[ "$1" == "-mousephys" ]]; then
shift
if [ ! -z "$1" ]; then
get_event $1
args=("${args[@]}" "-mouse")
args=("${args[@]}" "/dev/input/$evento,5")
fi
else
if ! expr match $1 'vt[0-9][0-9]*' >/dev/null; then
args=("${args[@]}" "$1")
fi
fi

shift
done

# echo $XEPHYR "${args[@]}" >> /tmp/logXephyr

exec $XEPHYR "${args[@]}"


Finally, be sure to allow the script to be executed.

# chmod +x /usr/sbin/Xephyr.sh


(continues on step V...)

Thursday, September 07, 2006

Multiseat (III): xorg.conf

(...comes from step II)

Changes on the xorg.conf file

Since the system automatically generated a correct configuration file, this step is not really necessary. Anyway, if you need to obtain information about the bus in which your card is plugged, the lspci command will give you such data.

Obtaining the information for the graphic card.

# lspci | grep VGA
0000:01:00.0 VGA compatible controller: nVidia Corporation NV34 [GeForce FX 5200] (rev a1)


Before making any change, it is advisable to make a backup of the original configuration file. Then edit it using your favorite text editor.

# cp /etc/X11/xorg.conf /etc/X11/xorg.conf.bak
# vi /etc/X11/xorg.conf


The next step is the edition of the xorg.conf according to your configuration. In particular, we must create the corresponding device, monitor and screen sections for every seats.

Section "Files"
FontPath "/usr/share/X11/fonts/misc"
# FontPath "/usr/share/X11/fonts/cyrillic"
FontPath "/usr/share/X11/fonts/100dpi/:unscaled"
FontPath "/usr/share/X11/fonts/75dpi/:unscaled"
FontPath "/usr/share/X11/fonts/Type1"
FontPath "/usr/share/X11/fonts/100dpi"
FontPath "/usr/share/X11/fonts/75dpi"
# path to defoma fonts
FontPath "/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType"
EndSection

Section "Module"
Load "bitmap"
Load "ddc"
# Load "dri"
Load "extmod"
Load "freetype"
Load "glx"
Load "int10"
Load "type1"
Load "vbe"
EndSection

# ------------------------------------------------------------------------
# Input devices
# ------------------------------------------------------------------------

Section "InputDevice"
Identifier "Keyboard-base"
Driver "kbd"
EndSection

Section "InputDevice"
Identifier "Mouse-base"
Driver "mouse"
Option "Device" "/dev/input/mice"
EndSection

# ------------------------------------------------------------------------
# Dual head system. Notice the two devices sharing the same BusID
# ------------------------------------------------------------------------

Section "Device"
Identifier "Card0.0" # CRT-0 (VGA output)
Driver "nvidia"
VendorName "nVidia Corporation"
BoardName "NV34 [GeForce FX 5200]"
BusID "PCI:1:0:0"
Screen 0
Option "NoLogo"
EndSection

Section "Device"
Identifier "Card0.1" # CRT-1 (Analog-DVI, DFP-0 : Digital-DVI)
Driver "nvidia"
VendorName "nVidia Corporation"
BoardName "NV34 [GeForce FX 5200]"
BusID "PCI:1:0:0"
Screen 1
Option NoLogo"
EndSection

# ------------------------------------------------------------------------
# Monitor section: Most of the parameters are optional
# ------------------------------------------------------------------------

Section "Monitor"
Identifier "Monitor0"
VendorName "HP"
ModelName "HP D8904"
Option "DPMS"
HorizSync 30-70
VertRefresh 50-160
DisplaySize 320 240 # CRT 17" (81 DPI @ 1024x768)
EndSection

Section "Monitor"
Identifier "Monitor1"
VendorName "Compaq"
ModelName "Compaq 5500"
HorizSync 30-54
VertRefresh 50-120
DisplaySize 280 210 # CRT 15" (72 DPI @ 800x600)
Option "DPMS"
EndSection

# ------------------------------------------------------------------------
# Screen section: Pairing video cards and monitors
# ------------------------------------------------------------------------

Section "Screen"
Identifier "Screen0"
Device "Card0.0"
Monitor "Monitor0"
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "Card0.1"
Monitor "Monitor1"
SubSection "Display"
Depth 24
Modes "800x600" "640x480"
EndSubSection
EndSection

# ------------------------------------------------------------------------
# Layout section
# ------------------------------------------------------------------------

Section "ServerLayout"
Identifier "Multihead"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" LeftOf "Screen0"
InputDevice "Keyboard-base" "CoreKeyboard"
InputDevice "Mouse-base" "CorePointer"
EndSection

# ------------------------------------------------------------------------
# Additional sections
# ------------------------------------------------------------------------

# Xephyr can not use DRI, so it is not enabled
# Section "DRI"
# Mode 0666
# EndSection

Section "ServerFlags"
# Xinerama does not affect this configuration, so it is not enabled
# Option "Xinerama" "on"

# Even if mouse detection fails, X will start
Option "AllowMouseOpenFail" "yes"

# VT switching is disabled
Option "DontVTSwitch" "yes"

# X restart (Ctrl+Alt+Backspace) is disabled
Option "DontZap" "yes"
EndSection




If everything was OK, when you log into your computer, you should have either two independent adjacent desktops (Xinerama disabled) or a bigger desktop extended through the two monitors (Xinerama enabled)

Do not worry in this moment about configuring your keyboard layout. This X configuration will not be seen by the final user of the system. The only goal in this moment is to define properly your video hardware in order to have the two monitors working simultaneously.

Take into account that the login greeter will appear in only one of the screens, but as soon as you log into the system you will see your desktop along the two screens.

The next step is to create a true multiseat computer. We will use Xephyr: A software able to act as an intermediary between the input devices and the underlying X.

(Continues on step IV...)

Multiseat (II): Let's start

(...comes from step I)



Step by step installation

Requirements

First of all, obviously, we need the hardware. In the prototype here presented, we had this configuration
  • Computer: Pentium IV 2.0GHz, 512MB RAM, 20GB hard disk
  • Graphic card: nVidia GeForce 5200 AGP 8x, 128MB, VGA + DVI + TV outputs (the blue one on the picture)
  • Seat 1: PS/2 keyboard and mouse, 17" CRT monitor (the right one in the photo)
  • Seat 2: USB keyboard and mouse, 15" CRT monitor (the left one)

Additional requirements:
  • Network connection to a second computer, in order to have remote access during the configuration of the system (It is also possible to do without an additional computer, but this option is not recommendable at all).
  • Internet access, to download drivers, additional packages, and (optionally) to keep updated the system.

Standard Ubuntu install

In this step it is not necessary to have all your hardware plugged. If you have only a set of KVM (keyboard, video, mouse), that is enough right now. We used a PS/2 keyboard and a PS/2 mouse, and a VGA monitor plugged in the VGA output of the graphic card. Nothing special at the moment.

Insert the Ubuntu CD. The CD of the 6.06 version is a live one, which offers the possibility of being installed on youy hard drive.

Follow the instructions and Install Ubuntu on your hard drive. Your hard drive will be deleted and its contents will be lost. Any spyware and virus you may previously have there, will be lost.

After the installation if everything was OK, you should have an Ubuntu with the X working properly on one of your monitors.

Before going into the next step, we recommend you to enable the root account. May be this is against the philosophy of Ubuntu, but it can be annoying to type sudo just before each command when you have to change many things at one time, such as in this project. After this step, the next commands will have to be executed as the root user. Otherwise, you will have to prepend sudo to all the commands needing root access.

$ sudo passwd root


If you want to make changes from another computer in your network, you must install a SSH server

# apt-get install openssh-server


The next step is to download the binary drivers from nVidia, because of limitations of the open source ones in graphic cards having more than one output.

# apt-get install nvidia-glx


Multihead install

Now it is time to plug the second monitor and modify your system configuration editing your xorg.conf file

(Continues on step III...)

Wednesday, September 06, 2006

Multiseat computer with Ubuntu

After having spent many hours working with the goal in mind of achieving a multiseat (also called multiterminal) computer, I have decided to write some lines to help anybody interested in building this kind of system.

Update (20090619): New tutorial for Multiseat in Ubuntu 9.04 available






The concept of multiseat

A multiseat computer is a particular configuration which allow a computer to be used for several people simultaneously. There are many fields of application of such kind of systems: Companies can achieve big savings on hardware and maintenance while giving service to many users. The main sites where this can be useful are all those in which users do not have great graphical requirements, i.e. almost everything except CPU hungry applications, such as recent 3D games or video encoding.

The sites which most can benefit from this technique are typically libraries, schools, public Internet access sites, and in general almost every site intended for administrative work.

Obviously the underlying operating system is a Linux distribution. Unfortunately, nowadays there are still too much sites tightly tied to proprietary operating systems, due to the fact that they must use some corporate applications developed for exclusive use on such proprietary operating systems. I hope in a near future that will be just bad memories belonging to the past, since the main trend in current developments is based on corporate intranets offering the necessary tools and software to the employees.

The configuration

I have choosen Ubuntu 6.06LTS as the OS, and a dual head video card to obtain two seats from a computer.

Why Ubuntu?

Yeah, why Ubuntu?... I have also made myself this question many times in recent days! I must confess that almost all my previous Linux experience had been with Fedora Core / RedHat systems (dealing with them since RedHat 5.x versions). I had only worked previously with Debian and its derived distributions in just a few ocasions, so obviously there were some new things to learn.

The reason for choosing Ubuntu is its popularity as a desktop based distribution. Several governments are choosing or creating Ubuntu or other Debian based distributions, and the supporting community is growing quickly. I think it is the distribution in which this kind of systems can catch most interest.

Why the 6.06LTS version?

A system based on recent software is easier to be reproduced, and will be more interesting for users willing to reproduce it than an alternative based on outdated software. Apart from beta versions, this is the latest Ubuntu version available right now.

The main goal is to give here the necesary steps to reproduce this configuration. A second goal is to ease the installation as much as possible. The ideal scenario would be to install only standard packages, without the need to use patched pieces of code. With the latest kernel inprovements, and the changes in xorg this is already possible in some cases.

Why a dual-head video card?

Let's start saying that the use of different cards with one video output each one would result in
a easier configuration, involving less packages of software. The reason to use dual head cards is just to adjust to a more realistic situation. The use of different cards, means either using additional PCI or PCIe cards.

The first ones (PCI) are almost impossible to obtain in most local stores (at least in Spain). You will have to buy them in sites such as eBay or you will have to use old recovered computer parts.

Our particular case was to create a prototype with evaluation purposes. Depending on the success of the prototype (stability and users satisfaction) the project can be extended to about 50 computers. We worked initially with cards coming from dead computers (very old cards manufactured between 1994 and 1997). That was a total waste of time: problems with video drivers, available video modes too poor for today screens, and the impossibility to extend the prototype for a large number of computers.

The second option is to use a modern motherboard having PCIe slots, but that means spending money in buying new hardware. In our project, the plans are intended to use computers whith motherboards having AGP slots. The only reasonable option for such computers is to plug in every computer a dual head AGP graphic card.

The last step was choosing the graphic card. We decided to use a card widely available and supported (i.e. using ATI or nVidia chips) with dual output, and in the lowest price range. The first prototype was built using a nVidia 5200 AGP 8x, with VGA output (D-sub), TV output (unused) and DVI-I output (either analog output using an adaptor or digital output). This card is well supported and widely available for about 30 euros (40 USD). For the second prototype, we are using a ATI 9250 AGP 8x.

(Continues on step II ...)




UPDATE: There is a new tutorial covering the setup of a multiseat computer with Ubuntu 8.04

Sunday, September 03, 2006

Blogger, at last!

Yeah!

I told myself tens of times that I won't be writing a blog. I used to create and host my own websites to publish the contents which I considered worth being shared.

Now I'm going to use for the first time a website managed by others, just to test and compare...

Let's the show start!