Want to read Slashdot from your mobile device? Point it at m.slashdot.org and keep reading!

 



Forgot your password?
typodupeerror
×
Linux Software

Linux Multiuser Servers 11

An Anonymous Coward writes: "John Looney recently posted to the lkml, asking about the possibility of one computer serving multiple users. That is to say, multiple keyboards, mice, monitors, etc, hooked up to a single server. The advantages of such a setup in a lab type environment are obvious. The following discussion ranges through several technical issues with such a configuration, including a kernel limitation of one virtual terminal active at a time, and the typical lack of quality in long video cables. However, none of the issues raised are unbeatable. James Simmons, for example, has been working on cleaning up the virtual terminal code, with many related fixes already merged into Dave Jones' tree."
This discussion has been archived. No new comments can be posted.

Linux Multiuser Servers

Comments Filter:
  • Xterms?? (Score:1, Interesting)

    by jbreker ( 465039 )
    Ive never used any but ive heard conversation about them for use in our school (its a high school and you would be surprised at how the equipment gets busted)

    one other option i could see is to have cheap client machines and rewrite the bootup scripts to ssh connect to the server instead of loading /bin/login.
  • Already been done. (Score:5, Informative)

    by iankerickson ( 116267 ) on Sunday April 14, 2002 @12:47PM (#3339368) Homepage
    This topic was on slashdot once before, and I posted this back then as well. Miguel Freitas of Brazil got this working on his linux PC: two monitors, keyboards, and mice, served by seperate X servers. Long story short, he said performance was adequate supporting two desktops simultaneously. Using PS/2 devices for one console and USB devices for the other prevent /dev name ambiguities. The text is mirrored below with the URL at the end if you want to want to get the HTML.

    This may also be possible in NetBSD if you use wscons to configure two discrete muxes and start a different X server on each one. Can anyone from core or Wasabi comment on that?

    ---

    Multiple local XFree users under Linux
    Version 0.92 by Miguel Freitas

    Updated April 4, 2002

    You can always get the latest version of this document from: http://cambuca.ldhs.cetuc.puc-rio.br/multiuser

    Keywords (for bots)

    I've wasted a lot of time trying to find this kind of document in google, hotbot and so on. Let me add some keywords to help people finding it: true dual-head, multi-user support, XFree86 4.0, multiple keyboard, multiple mouse, multiple video card, dual user, XFree86 instances, dual keyboard, USB keyboard under X.

    Motivation

    I have one girlfriend and one computer. In normal conditions, we both couldn't use the computer at the same time, in spite of the fact that it usually has a lot of processing power available. I also have a spare monitor and a second video card for playing 3D games (voodoo) so this idea came to me as something very obvious. New XFree86 4.0 support for dualhead suggests that most of the hard work is already done. And it has to be on Linux, because no closed source OS would allow me to make the changes that I need.

    As several reports confirm, Linux is been successfully used in educational institutions and projects due to it's great benefits and low cost. Using the same computer for two (or more) simultaneous students, workers, etc. is something that can reduce even more these costs.

    This is also a great option for companies to simplify the management and upgrades of the shared resources (motherboard, processor, hds).

    For everybody who may be asking: don't it get too slow? No. The performance difference is barely perceptible as most of the time the computer is waiting some command from the user. And if you haven't figured it out by yourself let me tell something: we live in a time of computing power in excess or do you think most of the users needs a GigaHertz Pentium 3 machine just to do their word processing and surf the web?

    Problems

    There are some problems that need to be addressed in order to support multiple XFree instances (and users):

    VT handling - The Linux kernel Virtual Terminal scheme is a great hack these days. It used to be good in the past as a way to have multiple screens, but now it's something that needs to be completely rewritten (several Linux developers have shown interest in developing a better scheme for 2.5.x series). The main issue is that VT code doesn't understand that we may have multiple input and output devices which therefore may be completely independent. There's no way to associate a given set of VTs for each hardware so Linux kernel would know which VTs can be used simultaneously. If we dispatch multiple instances of XFree86 they would be on different VTs and the Linux kernel will inform them of all VT switching stuff. A switched out (graphic) VT must not use the hardware as it would normally mess with the other active VT, but this is no more true as we have two independent video cards.
    Keyboard support - Multiple mouses on X are already a reality as we may specify the "device" option for each one. Unfortunately, the keyboard driver is still deeply rooted at XFree86 core, it's not a separated module and access console I/O functions to read the scancodes. Each XFree86 instance would have their keyboard access halted by VT switching. Besides, Linux is still lacking support for multiple keyboards in a well defined way. Let's wait for 2.5.x tree to see what will be done...
    My solution
    My hack is surely not the best one, I know thousands of things that could be better implemented in XFree86 and Linux Kernel to support true dual-head (and dual-input) in a clean way. But it works for me. Don't blame me if you spend your money and time buying videocards, monitors, keyboards, mouses and it doesn't work. You've been warned.

    Although I would love to see XFree86 supporting simultaneous layouts (without another instance) and a brand new keyboard driver, I don't have the necessary understanding of the project to implement it by myself. Anyway, my regards to the XFree86 developers for this great piece of software!

    My idea is to have two instances of XFree86. The first will be using a normal XFree86 server, it will initialize the main video card and attach it to a VT. It will also use the standard system AT keyboard and something (PS/2, serial, USB emulated as PS/2, whatever you want) as a mouse.

    The second instance of XFree will be my modified X server. It does not support VT switching at all because it's been used to control a hardware that is not normally used by any other VT. Read my lips, this is very important: The video card can't be the primary one, the mouse can't be the same used by gpm and the keyboard must be USB and must not generate scancodes to the normal Linux console!

    As the keyboard doesn't look like a normal AT keyboard (no keys to standard console) the keyboard driver of my modified X server must take care of USB events translating them to normal scancodes.

    Procedure (step by step)

    1) You need to get XFree 4.0.x (RedHat 7.0 and a lot of recent distros comes with it) and configure it for two video cards and monitors. I suggest that you first try it with Xinerama extension following this HowTo: http://linuxdocs.org/HOWTOs/Xinerama-HOWTO.html

    Then modify your XF86Config or XF86Config-4 to separate your screens in two layouts, instead of using them with Xinerama extension. Don't know what I am talking about? Then it's time to read XF86Config, do a ``man XF86Config''

    With two layouts your XF86Config should look like this:

    Section "ServerLayout"
    Identifier "Layout0"
    Screen 0 "Screen0"
    InputDevice "Mouse0" "CorePointer"
    InputDevice "Keyboard0" "CoreKeyboard"
    EndSection

    Section "ServerLayout"
    Identifier "Layout1"
    Screen 0 "Screen1"
    InputDevice "Mouse0" "CorePointer"
    InputDevice "Keyboard0" "CoreKeyboard"
    EndSection

    Section "InputDevice"
    Identifier "Keyboard0"
    Driver "keyboard"
    # this is for supporting deadkeys
    Option "XkbRules" "xfree86"
    Option "XkbModel" "pc101"
    Option "XkbLayout" "us_intl"
    EndSection

    Section "InputDevice"
    Identifier "Mouse0"
    Driver "mouse"
    Option "Device" "/dev/mouse"
    Option "Protocol" "IMPS/2"
    Option "Emulate3Buttons" "off"
    Option "ZAxisMapping" "4 5"
    EndSection

    Section "Monitor"
    Identifier "Plex17"
    VendorName "Unknown"
    ModelName "Unknown"
    HorizSync 31.5 - 79.0
    VertRefresh 50-90
    EndSection

    Section "Monitor"
    Identifier "Syncmaster3"
    HorizSync 31.5 - 79.0
    VertRefresh 50-70
    EndSection

    Section "Device"
    Identifier "FireGL 1000 PRO"
    Driver "glint"
    BusID "pci:1:0:0"
    BoardName "Unknown"
    EndSection

    Section "Device"
    Identifier "Voodoo"
    Driver "glide"
    BusID "pci:0:12:0"
    EndSection

    Section "Screen"
    Identifier "Screen0"
    Device "FireGL 1000 PRO"
    Monitor "Plex17"
    DefaultDepth 16
    Subsection "Display"
    Depth 16
    Modes "1024x768"
    EndSubSection
    EndSection

    Section "Screen"
    Identifier "Screen1"
    Device "Voodoo"
    Monitor "SyncMaster 3"
    DefaultDepth 16
    SubSection "Display"
    Depth 16
    Modes "800x600"
    EndSubSection
    EndSection

    This should be trivial to do because it's almost the same as Xinerama configuration but with two layouts. Then switch your box to runlevel 3 (init 3) and try both layouts, one at a time:

    # XFree86 -layout Layout0
    # XFree86 -layout Layout1

    Pay attention to BusID settings as described in howto. Note that a dualhead board (like Matrox G400) should NOT work through the next steps, as we will be using 2 instances talking to the same hardware. But I haven't tried myself (I'd be happy to try it if any reader wants to donate such video card...).

    Not all video cards can be used with XFree86 dualhead support. Don't email me saying that you couldn't get your cards to work up to here or you will burn in hell! Read the Xinerama HowTo instead, thanks.

    2) Plug your second mouse on the system and configure XF86Config to use it in the second layout. This mouse must not be used by any other program, like gpm. XF86Config will look like this (only the changed sections):

    Section "ServerLayout"
    Identifier "Layout1"
    Screen 0 "Screen1"
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard0" "CoreKeyboard"
    EndSection

    Section "InputDevice"
    Identifier "Mouse1"
    Driver "mouse"
    Option "Device" "/dev/ttyS1"
    Option "Protocol" "Microsoft"
    EndSection

    Again, test this layout to make sure it's working.

    3) Get Linux Kernel 2.4.0 so we can play with USB support. Some 2.2.x kernels may work as they have backported USB support, but in doubt, stick with 2.4.0.

    In the kernel configuration, enable USB support (CONFIG_USB) and keyboard (either CONFIG_USB_HID or CONFIG_USB_KBD if your don't need USB mouse support). You must enable "input core support" (CONFIG_INPUT) and MUST NOT enable "keyboard support" (CONFIG_INPUT_KEYBDEV) as we don't want the USB one to be the system keyboard. Also enable "event interface" (CONFIG_INPUT_EVDEV) as I will use it to receive scancodes.

    Compile and install the kernel. Now plug your USB keyboard, once the kernel enters you should not see any pressed keys from it at the console. Now try reading the keyboard events (assuming the keyboard is the only USB device you have):

    # cat /dev/input/event0

    You should see some garbage on the screen as you type. That's all right, your keyboard is working. If you don't see anything or get "No such device", something is wrong with your USB system. Read Documentation/usb in your kernel sources for more information.

    4) Get the sources of your XFree86 4.0.x if you haven't already done so. The sources are available from www.xfree86.org. There should be 3 or 4 big .tgz files, but you will only need the first one.

    Expand the tree and apply my patch, which can be downloaded here (4.0.1) and here (4.0.2). Follow the instructions from the package to build the X server (make World). You should get a new XFree86 executable on directory xc/programs/Xserver. Copy it to your /usr/X11R6/bin with another name (like XFree86-2nd).

    Or if you like the easy way, try one of my XFree86-2nd servers (compiled against glibc-2.1):

    XFree86-4.0.1-2nd.gz

    XFree86-4.0.2-2nd.gz

    This server supports only USB keyboards and do not grab a VT. The only VT code it has is to switch to a given console through XFree86-2nd vtxx parameter.

    Applying the patch is intended only for developers that can help me improving this scheme. It will also require you hundreds of MB of disk space. If my provided X servers doesn't work with your system there's little I can do about it. If you can, try to discover the problem and fix it.

    5) Modify the second layout to use the USB keyboard. This will require you to use the protocol "usbev" I created and specify the /dev/input/eventx you like as the device. The XF86Config should now look like this (only the changed sections):

    Section "ServerLayout"
    Identifier "Layout1"
    Screen 0 "Screen1"
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
    EndSection

    Section "InputDevice"
    Identifier "Keyboard1"
    Driver "keyboard"
    Option "Protocol" "usbev"
    Option "Device" "/dev/input/event0"
    EndSection

    Now try this X server with the command:

    # XFree86-2nd -layout Layout1

    It should initialize your second video card, the second mouse and the usb keyboard without interfering with your console. You can even do this from a xterm window inside your running X server. Yes! It works! Now move on to the grand finale...

    6) If you use gdm as display manager and to provide you a graphical login, you can edit the file /etc/X11/gdm/gdm.conf as follows:

    [servers]
    0=/usr/bin/X11/XFree86-2nd -delay -layout layout1 vt07
    1=/usr/bin/X11/X vt07

    Getting this one to work may be a major challenge. It took me a lot of trial and error until I got this stable configuration. I had to add a option "-delay" (my hack) to cause a 10 second delay at one of the servers so they would not initialize the hardware at the same time. I don't know why this is needed. Playing with the order they are initialized (by exchanging 0= and 1=) also does the trick.

    Known Bugs

    This thing mess up with my text console. I have to switch between the VTs a couple of times before the text looks good again. Fell free to give me a solution.

    Also a main problem may be that the whole thing does not work with other hardware and you may be wasting your time reading all this. But the idea is here and I can guarantee that it worked for me. So it must be some little issue that I'm sure will be quickly resolved by another developer somewhere....

    Updates

    Price study

    Brad Midgley pointed that support for Matrox G400 and similar dualhead cards should be possible using framebuffer interface. I still don't have the hardware to do any tests on this, but if you want to try please note that I may have removed something important for framebuffer from the init routines. Please check for any mistakes the patch might have. Any updates on this issue are greatly appreciated...

    Daniel Tarbuck reported success with XFree86 4.1.0 with an additional patch:
    "I have implemented your patch on XF86 4.1.0 and I found that I had to comment out the following line:
    /*((pciArg*)arg)->func(((pciArg*)arg) ->tag, PCI_CMD_STAT_REG, ((pciArg*)arg)->ctrl); */
    in xc/programs/Xserver/hw/xfree86/common/xf86pciBus.c . (pciIoAccessDisable function)

    I don't know what the problem was, and I don't know why my fix worked for me. I also don't know if there will be serious problems as a result of my fix.
    Here is a few details on my setup:
    primary card: ATI Mach64 GT+ (PCI)
    secondary card: S3 VirgeDX (AGP)
    kernel 2.4.5 (Redhat 7.0)"

    Jan "Yenya" Kasprzak did some tests with Daniel's patch and got two hardware configurations to work:

    S3 ViRGE VX PCI (primary)
    SIS 6xxx AGP (secondary - USB keyb.)
    I was not able to set up the AGP card as primary.

    Matrox G450 AGP (primary)
    S3 ViRGE VX PCI (secondary - USB keyb.)
    I was not able to set up the S3 card as primary.

    Yenya wrote: "I still have one problem: IMHO the above patch should be applied to primary X server as well, because otherwise it locks up the secondary card when the user on the primary display logs out."

    Another success report, thanks Nathan Hoult for the information:

    "Geforce2pro 64meg AGP (MSI)-slave,AGP" and a "TNT 16 meg (Diamond Viper550)-master,PCI"
    Nathan wrote: "I used the official NVIDIA drivers too and get OpenGL to work on both quite well... well except i have permission problems all over the place but just got it working anyhow." (Mandrake8.1, XFree 4.1, linux 2.4.16)

    I rebuilt the patch against XFree86-4.1.0 (from rawhide sources XFree86-4.1.0-0.9.11.src.rpm). Applying Daniel's patch to both X servers, now we have XFree86-1st and XFree86-2nd (I hope everybody knows how to use them!).

    The 2nd server is using usbev keyboard as usual (thanks to Vojtech Pavlik help now we should have keyboard leds working). Please note that binary files where compiled under RedHat 7.1, so you need glibc >= 2.2.2.

    Precompiled XFree86 4.1.0-1st server.
    Precompiled XFree86 4.1.0-2nd server.
    Patch for XFree86 4.1.0-1st
    Patch for XFree86 4.1.0-2nd

    Notes:
    1) This binaries were tested over RedHat Linux 7.1. The gdm provided by ximian gnome desktop refused to work with my dual login, I had to downgrade to RH7.1 gdm package.
    2) My usbev keyboard got wrong key mapping if I don't specify XkbModel and XkbLayout. Something seems to have changed since 4.0.2, so don't forget these settings (specially if you get a working server with no keyboard...).
    3) When testing the XFree86-4.1.0-2nd inside the first instance I got errors of xauthorization. Calling the 2nd server with "-ac" may help.
    4) Usb keyboard leds still don't work. I will debug it as soon as I have time to do so, there must be some mistake.

    Matrox G450 DH users should read this.

    http://cambuca.ldhs.cetuc.puc-rio.br/multiuser/

  • It's the old thin client very thick mainframe model of the bad old days. We moved away from it for a variety of good reasons. Not the least of which is the fact that it costs a lot more to get the computing power of 20 cheap desktops in 1 mainframe type machine. It's the same reason Beowulf clusters, COWs, and the like were created.

    Interestingly enough, the internet model aproaches the thin client model, but I stray from the topic

    • Not the least of which is the fact that it costs a lot more to get the computing power of 20 cheap desktops in 1 mainframe type machine.

      But really, how much of the CPU time on your desktop do you use at any given time? Computing power has advanced dramatically since the days of the mainframe, and right now, most of the clock cycles are wasted on your average desktop. You no longer need the full computing power of one computer for one desktop user with basic needs. (Games, development, etc, are another story.) It's a lot more cost efficient to use 50% of one CPU than 5% of 10 CPUs. That's why projects like these are beginning to make sense once again.

      They made sense long ago, when everything was CLI, and you didn't need all that much processing power to check your e-mail, so sharing CPU time was feasible. Now, many people use GUIs, so why not use all the proccessor time you're wasting with your Athlon 2GHz with a gig of RAM? I've said it before... but this is the reason why projects like the Linux Terminal Server Project [ltsp.org] exist.

  • Lots of people these days are praising USB for this sort of thing. Plug in 2 or more keyboards and mice into a hub, assign each pair to a user and let them share the box. Although nice and simple in theory, it becomes tricky to determine who owns what hardware.

    Even more tricky is shielding each user from the other(s). USB being a shared bus, if one user has access to a USB device, he can theoretically access all of them, thus messing or snooping on the other user's interactions. Sure, this is handled in the kernel, but what if they're using different mice ? What if one user wants to plug in another USB device such as a sketch pad ? There are many problems when working with shared resources.

    Perhaps a solution to this would be to design a breakout-box that presents each user with a separate set of ports, but that would probably require separate buses as well, to avoid getting them confused in kernel-space (and prevent USB-packet spoofing?!).

    Considering the cost of desktop hardware, I don't really see the point in all this anyways. One can easily build a low-end PC for about 500$ (CDN) these days, just add some Cat-5 and you're all set.

Life is a game. Money is how we keep score. -- Ted Turner

Working...