Starting with the 6.9 version of X.org, it is no longer necessary to patch the kernel to get a multiseat system running! I'll write a HOWTO when time permits, but in the meantime, here is a temporary mini-Howto on my blog.
The information below is out of date but I'll leave it here for now. My home system is an update of the system described below, using FC4 with X.org 6.9. There are now four heads on the system, and an update to Fedora Core 6 is planned for the Christmas holidays.
Multiuser/multihead systems, also called multiseat systems, provide an cost-effective computing solution for many environments.
Details below, or see the Seneca OpenSource Software Symposium 2004 presentation slides: Web Format, Printable format (PDF)
One computer, three users. Family computing on a budget!
The image above shows my new computer system (except for the single CPU, which is under the desk). As you can see, it has three 'heads', or user-interface setups, and is running RedHat Linux 9. Although the photo shows all three screens on one desk, they usually sit on three different desks within our family den/home office: one for my wife, one for my children, and one for me.
The XFree86 server has long had support for multiple heads used by one user, and recently added support for Xinerama (combining multiple screens into one so that windows can span across monitors and be moved between monitors).
However, the Linux kernel input drivers were written to combine multiple input devices into a single input stream. This makes sense with laptops, for example; when you plug a (nicer) keyboard into a laptop, pressing the "a" key on either keyboard should result in an "a" appearing on the screen. Likewise with mice; when you get sick of the little 'joystick mouse' on the laptop and plug in an additional mouse, it should supplement the joystick and you should be able to use either.
So to support multiple users, some changes are required at the kernel level. The most basic way of preventing the kernel from merging the keyboard and mouse data is make the kernel disregard HID (human interface device) hardware plugged in to the USB bus, and then modify XFree86 to directly access that hardware.
But a better approach is to have the kernel directly support multiple consoles, each consisting of a keyboard, mouse, and monitor(s). The Linux console support had become a bit of a spider-web by the time of the 2.4 series, so when it was reworked in 2.5 the possibility of creating additional consoles was added.
The basic code necessary to support this was backported from the 2.5 series to 2.4.20/2.4.22 and called "backstreet ruby". Unlike the 2.5 code, which will ultimately support multiple character consoles and framebuffers, backstreet ruby supports additional consoles for use with X only.
The other piece of the puzzle is support for single-board initialization in XFree86. By default, XFree86 likes to go and initialize all the graphics boards when it starts, which can be disasterous in a multi-user configuration.
This change to the XFree86 server is called the 'prefbusid' patch. It's not perfect-- depending on your hardware, you can still mess up other X sessions when you terminate the server-- but it generally works well. This patch has not been merged into the XFree86 source tree, but the code will probably get cleaned up and merged once multiple consoles become part of the mainline kernel with the 2.6 series.
Clearly, multi-head/multi-user is not for everyone, but it does make a lot of sense for certain situations:
When multiple users are located physically close together and their work is not CPU-intensive, e.g., bank tellers, call centers, data entry applications.
For multiple public kiosks at one location: library catalogs, product information displays.
For multiple web-surfing or word-processing stations: Internet cafes, Learning Commons.
For families where it is physically feasible to place multiple monitor/keyboard/mouse sets together for multiple users.
Compared to using multiple computers, multi-head/multi-user can result in reduced electrical costs, simpler system maintenence, and reduced hardware costs. It is not suited to extremely CPU-intensive tasks, but the CPU power of modern systems greatly exceeds that required for most desktop work. (There are reports of people doing multi-user 3d gaming on backstreet-ruby systems).
Well, yes and no. "Yes" in the sense that we're sharing CPU power between multiple users. "No" in the sense that each user has a PC-style experience -- they have a full-featured GUI, a personal workspace, and the ability to tailor the system to the way they want it.
The bottom line is that unless you tell people that they're sharing a machine, they won't realize it. I think that speaks well for the user experience that this configuration can provide.
A configuration possibility was suggested by someone on one of the backstreet-ruby web pages: one could configure a system so that the multiple heads were used in an Xinerama (one big monitor) configuration or a multple-user configuration depending on which version of a 'startx' script was used, or which runlevel was entered. Thus, if you had two screens side-by-side, you could configure them so that they were both available to one user, or to two independent users, depending on your needs at a particular point in time.
Sure, and they love it. Most Linux distributions include a ton of useful and interesting software. My children are very comfortable using GUI apps such as OpenOffice, the Gimp, Galeon, Evolution, and so forth, and they don't find it a big switch to use Windows at school.
In case you're curious: the system above is an AMD Athlon XP 2800+ with 1 GB of RAM (2 x 512 MB, DDR400) and two 120-GB disks (each with 8MB cache) in a mirrored configuration (RAID-1 array). The 17" LCD is connected to an nVidia FX5200 AGP8X video card, the 15" LCD to a Matrox Millenium PCI, and the 15" CRT to an nVidia GX4/MX440 PCI.
The keyboards are Logitech (one PS/2) and A/Open (two USB), the mice are Logitech optical wheel mice (all USB, one connected through a USB-PS/2 adapter). Good-quality VGA and USB extension cables permit the screens to be up to 4-5 metres away from the CPU.
Other peripherals include a laser printer and a colour inkjet, an HP PSC2210 multifunction, an external fax modem, a UPS, a wireless router, a cable modem, and a TV tuner/capture card. There's also a DVD and a CD-RW drive.
I finally got sound working... the motherboard has sound built-in, and I've added a SoundBlaster PCI128 and an Aureal Vortex card that I had lying around. The sound is routed to speakers built into the LCD panels, plus a set of external speakers surrounding the CRT. I'm still having troubles getting applications to send their sound to the right sound card, though! (Anyone with information on how to control the sound destination for Gnome apps and/or Macromedia Flash, please let me know!).
The whole thing uses a lot of cables; there are 18 cables connecting to the system case alone, and 12 power outlets in use. (One tip: if you have a lot of cables running along the back of a desk, buy a cheap plastic shower curtain rod cover. They're split lengthwise -- just tuck the cables into the cover and the clutter will disappear. I'm using a black one at the back of my main desk to bundle the power, usb, sound, and video cables going to the adjacent desk).
The Kernel version used is 2.4.22-backstreet-ruby, which is a plug-in replacement for the kernel supplied with RedHat 9.
Recommendation for a computer store in Toronto: the folks at Keit Computer have treated me really well, despite unusual configuration requests on my order. They've handled some system instability issues without any hassle, performing diagnostics and eventually changing the motherboard at my request. They also stock a good selection of cables, and the cheapest Epson ink cartridges I've seen yet ($8 black/ $12 tri-colour for an Epson Color Stylus 660).
Chris Tyler <firstname.lastname@example.org> - 2003.10.31-2004.04.08