Setting up USB multiseat with DisplayLink on Linux (GDM up to 2.20)

Four $99 UD-160-A Terminals off a single $299 netbookSoon, we’ll be able to plug inexpensive zero-state USB docks/terminals into new Linux systems, and a new graphical login will pop up in a completely plug and play fashion. Many users can then simultaneously share any single Linux PC. This is great for education, libraries, internet cafes, etc — anywhere where you have clusters of client machines with light 3D/video app demands, and want the simplicity and savings of just one server machine with many terminals connected.

[Update August 8, 2010 - Further work on this has moved to the Google Summer of Code 2010 project for USB Multiseat]

Until this is in the distros, we have to assemble a few pieces ourselves to get everything installed for this scenario. Some major components (GDM/ConsoleKit) are changing the way this kind of thing will be done, so for now the instructions here are designed only for distributions with GDM 2.20 or earlier (Ubuntu < 9.10; Fedora < F12; Debian < 5.0; etc). The instructions have been tested most extensively on Ubuntu 9.04.

gdm –version

will show what version you have on your current system. Any tweaks to make things work with your specific distro are definitely welcome in the comments.

The first step is hardware. You need a USB hub with a DisplayLink USB device and free USB ports for keyboard and mouse. You can get this in one package in the form of devices like the Plugable DC-125, or buy independent USB devices like the UGA-125 combined with any USB hub. USB Audio and other devices can be made to work also, but these instructions just cover basic display, keyboard, and mouse.

With that, you're ready to start configuring your Linux setup ...

1. DisplayLink framebuffer driver

udlfb is in the staging tree of Linux kernels 2.6.32 and later. We'll install the latest version here. First, make sure you have git installed with "sudo apt-get install git-core", and create a directory which will host all the source code you download with git (e.g. ~/git/).

sudo apt-get install module-assistant
sudo module-assistant prepare
git clone http://git.plugable.com/webdav/udlfb/
cd udlfb
make
sudo make install
sudo depmod -a

Now, when you plug in a DisplayLink device, you should see a "green screen" as the driver successfully loads and sets the graphics mode to match your monitor.

2. DisplayLink X server

This will get the X server installed, ready for use by later scripts.

sudo apt-get install pkg-config xorg-dev
cd ~git
git clone http://git.plugable.com/webdav/xf-video-udlfb/
cd xf-video-udlfb
./configure
make
sudo make install

We now need to create or modify a few scripts and configuration files. You'll need to use sudo to edit files in these system directories. You can cut/paste the text below, or download the files with "git clone http://git.plugable.com/webdav/misc-udlfb/" and copy each to the right location, and fix up ownership and permissions on the files.

3. udev script

Create a file called /lib/udev/rules.d/50-usbseat.rules owned by user root, with the following contents.

# set all DisplayLink devices to configuration 1
# see http://libdlo.freedesktop.org/wiki/DeviceQuirks for more info
ATTR{idVendor}=="17e9", ATTR{bConfigurationValue}=="2", RUN="/bin/echo 1 > /sys%p/bConfigurationValue"

# aliases for display, kbd, mouse attached to specific hubs

KERNEL=="fb*",SUBSYSTEMS=="usb",PROGRAM="/bin/cat /sys/%p/../../../devnum",SYMLINK+="usbseat/%c/display",RUN+="usbseat.sh %c"
KERNEL=="mouse*", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="02", PROGRAM="/bin/cat /sys/%p/../../../../../devnum",SYMLINK+="usbseat/%c/mouse",RUN+="usbseat.sh %c"
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="01",PROGRAM="/bin/cat /sys/%p/../../../../../devnum",SYMLINK+="usbseat/%c/keyboard",RUN+="usbseat.sh %c"
KERNEL=="control*", SUBSYSTEM=="sound", SUBSYSTEMS=="usb", PROGRAM="/bin/cat /sys/%p/../../../../../devnum", SYMLINK+="usbseat/%c/sound"

# Handle when keyboard and mouse are one more hub downstream. Relying on pnp order to have already set up mouse, keyboard on upstream hub if we're daisy-chaining
KERNEL=="event*", SUBSYSTEM=="input", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="01",PROGRAM="/bin/cat /sys/%p/../../../../../../devnum",SYMLINK+="usbseat/%c/keyboard",RUN+="usbseat.sh %c"
KERNEL=="mouse*", SUBSYSTEMS=="usb", ATTRS{bInterfaceClass}=="03", ATTRS{bInterfaceProtocol}=="02", PROGRAM="/bin/cat /sys/%p/../../../../../../devnum",SYMLINK+="usbseat/%c/mouse",RUN+="usbseat.sh %c"

The udev subsystem will run this script automatically each time a USB device is attached.

4. usbseat.sh script

Create a file /lib/udev/usbseat.sh owned by user root with the following contents. Make sure to "sudo chmod a+x" to make the file executable.

#!/bin/bash
# takes the "seat number" as parameter $1
# the seat number is the kernel device id of the hub the seat's devices are sitting off of
# called once for every usb device that MIGHT be part of a seat, when they arrive or remove 

if [[ !(-n `/bin/pidof gdm`) ]]; then
    exit 0
fi

seat_running=`/usr/bin/gdmdynamic -l | /bin/sed -n -e "/:$1,/p"`

# $ACTION environment variable is set by udev subsystem
case "$ACTION" in
	'remove')
		if [[ -n "{$seat_running}" ]]; then
			/usr/bin/gdmdynamic -v -d $1
		fi
		;;
	*)
                # A device which might be part of a seat has been added

		# if we already have a running seat for this #, exit
		if [[ -n "${seat_running}" ]]; then
			exit 0
		fi

		if [[ -e /dev/usbseat/$1/keyboard && -e /dev/usbseat/$1/mouse && -e /dev/usbseat/$1/display ]]; then

			# We have a newly complete seat. Start it.
			TMPFILE=`/bin/mktemp` || exit 1
			/bin/sed "s/%ID_SEAT%/$1/g" < /lib/udev/usbseat-xf86.conf.sed > $TMPFILE
			/usr/bin/gdmdynamic -v -t 2 -s 1 -a "$1=/usr/X11R6/bin/X -br :$1 -audit 0 -nolisten tcp vt07 -config $TMPFILE"
			/usr/bin/gdmdynamic -v -r $1
		fi
		;;
esac

exit 0

5. X config file

Create file /lib/udev/usbseat-xf86.conf.sed with contents


Section "ServerFlags"
	Option	"AutoEnableDevices"	"false"
	Option	"AutoAddDevices"	"false"
	Option  "DefaultLayout"		"seat"
	Option	"DontZoom"		"true"
	Option	"DontZap"		"true"
	Option	"AllowMouseOpenFail"	"yes"
EndSection

Section "Module"
	Load "ddc"
EndSection

Section "Files"                                                                                                              
    ModulePath      "/usr/lib/xorg/modules"
    ModulePath      "/usr/local/lib/xorg/modules"
EndSection

Section "Device"
	Identifier "dl"
	driver	   "displaylink"
	Option "fbdev"	"/dev/usbseat/%ID_SEAT%/display"
EndSection

Section "InputDevice"
	Identifier "keyboard"
	Driver	"evdev"
	Option	"CoreKeyboard"
	Option	"Device"	"/dev/usbseat/%ID_SEAT%/keyboard"
	Option	"XkbModel"	"evdev"
	Option	"XkbLayout"	"us"
EndSection

Section "InputDevice"
	Identifier "mouse"
	Driver	"mouse"
	Option	"CorePointer"
	Option	"Protocol" "ImPS/2"
	Option	"Device"	"/dev/usbseat/%ID_SEAT%/mouse"
        Option  "Buttons" "5"
	Option	"ZAxisMapping" "4 5"
EndSection

Section "Monitor"
	Identifier "monitor"
EndSection

Section "Screen"
	Identifier "screen"
	Device "dl"
	Monitor "monitor"
EndSection

Section "ServerLayout"
	Identifier "seat"
	Screen	0 "screen" 0 0 
	InputDevice "keyboard" "CoreKeyboard"
	InputDevice "mouse" "CorePointer"
EndSection

6. fbcon workaround

[update: this step is no longer needed with the latest udlfb from git or in kernels 2.6.37+]

fbcon is a standard Linux kernel module, which aggressively assumes it can open any framebuffer device and take it over for use as a text terminal. Unfortunately, that's not what we want if we're going to be using that framebuffer to run its own X server. So we need to add a file /etc/modprobe.d/fbcon.conf to disable fbcon and leave our framebuffers free for other uses.

blacklist font
blacklist tileblit
blacklist bitblit
blacklist fbcon

This file will not take effect until you run

sudo update-initramfs -u

Now, when you reboot and run "lsmod" you should not see fbcon in the loaded modules. And in /sys/class/graphics you should see fb0, instead of fbcon.

7. xrandr workaround

[update: this workaround is not needed when running xf86-video-fbdev or with recent displaylink X servers with this patch]

The DisplayLink X server currently has limited RANDR support, but later versions of GDM assume better. So for the time being, a workaround is required to get GDM applications (including gdmlogin) to display properly within the actual screen area -- otherwise they tend to think the screen has a strange rotation, and display themselves completely off it.

Add these lines into /etc/gdm/Init/Default, right after the definition of gdmwhich()

XRANDR=`gdmwhich xrandr`
if [ "x$XRANDR" != "x" ]; then
  $XRANDR -o 0
fi

8. /etc/rc.local script

Add the following lines to your /etc/rc.local script to check for attached usb terminals that were attached (at boot), and udev found them before GDM was running.

oldIFS=$IFS
IFS=/
for seat in /dev/usbseat/*; do
	set $seat
	/lib/udev/usbseat.sh $4
done
IFS=$oldIFS

9. /etc/init.d/gdm patch

In recent versions of X, the system largely assumes that you'll only run one X server, and it will own all devices. So to support multiseat with multiple X servers easily, we need to have two configurations: normal (using only your primary graphics), and multiseat (where your primary graphics isn't used). We do this by detecting whether you have a USB terminal attached and configured, and if so coming up with a different gdm configuration.

Add these lines to your /etc/init.d/gdm script, just after the section to "Allow cdd to override the config" (around line 35).

# Allow usbseat to override the config
if [ -f /etc/gdm/gdm-usbseat.conf ]; then
	for usbseat in /dev/usbseat/*; do
		seatid=${usbseat##*/}
		if [ -e "/dev/usbseat/$seatid/keyboard" -a -e "/dev/usbseat/$seatid/mouse" -a -e "/dev/usbseat/$seatid/display" ]; then
			CONFIG_FILE="--config=/etc/gdm/gdm-usbseat.conf"
		fi
	done
fi

10. Create /etc/gdm/gdm-usbseat.conf

This is the alternative gdm.conf that will be used when a USB terminal is present at boot:

[daemon]
DynamicXServers=true
FlexibleXServers=0
Greeter=/usr/lib/gdm/gdmgreeter

[security]

[xdmcp]

[gui]

[greeter]

[chooser]

[debug]

[servers]
0=inactive

Now, when you boot with USB terminal(s) attached, graphical logins will come up on all of those, while your primary display will remain a text console.

usb multiseat with Edubuntu

See my video from Linux Plumbers 2009 for more thoughts and background on USB multiseat.

Unsolved Problems

Beyond reworking for the new GDM/ConsoleKit versions, and getting all this just "built in" to the distributions, there are at least several major problems yet:

input duplication

[Update Feb 19, 2010 - fixed by removing "-sharevts -novtswitch" from the X start line and substituting a specific vt "vt07". Listing above now has problem resolved]

Input to any of the terminals will be duplicated to your primary console. This has a bunch of very nasty effects, including often duplicating your login to both your session and the console, and possibly causing strange effects like ctrl-c within any terminal will often cause that whole X session to close. This seems to be http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=525736, which at the bottom reports a workaround involving faketty, which unfortunately didn't work for me. You can also see a short discussion of this bug at https://fedorahosted.org/pipermail/multiseat/2009-April/date.html There ought to be a simple solution here -- any comments on that welcome.

mouse scroll wheel doesn't work

[Update Feb 19, 2010 - fixed by changing Protocol from "auto" to "ImPS/2" in the xorg.conf]

This is a problem with some other ways of doing multiseat: https://fedorahosted.org/pipermail/multiseat/2009-February/000004.html Again, probably a small tweak might resolve this.

unplug terminal doesn't tear down (or reconnect)
Currently, when you physically disconnect a terminal, everything remains running. By default, each user can only be logged in once, which means that you must do gdmdynamic -l to find the zombie instance and sudo gdmdynamic -d $seat to kill it. But the behavior users would really like to see is disconnecting the terminal leaves all apps running, but logging in from that terminal (or any other) reconnects and just transparently starts where the user left off.

Comments on other distros (e.g. yum vs. apt-get), better solutions, and other problems are very much appreciated.

58 thoughts on “Setting up USB multiseat with DisplayLink on Linux (GDM up to 2.20)”

  1. I was wondering what version of Ubuntu 9.04 you were running. Server or Desktop. Can you explain the pros of or cons of each? I am looking to set up a multiseat using Ubuntu and now DisplayLink for a Java Based Gaming Kiosk. I think this solution fits my needs very well!

    Thanks!

    1. Hi Paul,

      Either can work, as you can always install the packages you’re missing. But presumably with terminals, you’re trying to have many clients off a single machine. I’m running a client version so all the apps and desktop utilities are there right off the bat.

      On gaming, I’d watch it — virtual USB graphics is snappy and indistinguishable from a normal graphics controller for web browsing and information apps. But when every pixel on the screen is changing many times per second (as with full screen video or gaming), you’ll hit bandwidth limits on USB.

      Best wishes,
      Bernie

  2. Hello Bernie,
    Out of the listed “Unsolved Problems”, I got he solution for the first two issue. But I am facing the third issue, which is needed for me to make use of this technology.

    Any idea/suggestion which may shed some lights in this regard ?

    I am using the Ubuntu ( jaunty ) 9.04 and followed this link for setup.

    Waiting for your reply.

    Thanking You

  3. Hi Satish,

    Asolution to the first issue is to replace “-novtswitch -sharevts” options to X in the usbseat.sh file, with assignment to a specific vt. So, for example, just replace with “vt07″ at the same spot on that line.

    What solution have you found for the mouse scroll wheels?

    On the third, there is no answer currently. Work could be done either at the X or framebuffer level, which in combination with the udev based X configuration that’s coming, could get there. But some development work will be needed.

    It’s great that you’ve gotten this running – can you provide any more info about your setup? Links to anything? Thanks!

    Bernie

    1. Hello Bernie,

      Thanks for updating the link.
      I am still in search of solution of third ( now first :-) and only ) unresolved issue.

      Now, sometime I got the login screen after reconnect. And If I logged in with the same user, by which I already logged in; I get the new session. Which I do not want.
      Is there any way to list the number of running sessions; so user will select the session he wants and after picking up the existing session, he will get the same session from where he left off ?

      Thanking You
      Satish Wagh

      1. Hi Satish,

        GDM doesn’t have any built-in UI for that AFAIK. You can get at the raw information from the command line, though.

        sudo gdmdynamic -l

        will list some information about active sessions.

        1. Hello Bernie,
          As I see, there exist a command named “gdmflexiserver” which *almost* serves the mine purpose.

          This command is useful when and only when we have logged in by 2 or more time.

          I am just thinking about how do I use this command, in combination with usbseat.sh, ( may be after little bit customization ) to enlist the used session ( except the Host session ) and also to ask to start a new session.

          Any thought on the same ???

          Thanking You
          Satish Wagh

          1. Hi Satish,

            Actually, I hadn’t thought about using gdmflexiserver.

            That’s used to provide equivalent functionality to Windows’ fast user switching.

            Does it work under the assumption that one user session is enabled at a time — or can it switch between multiple sessions, with multiple sessions active at a time — and with a different xorg configuration per session?

            My guess is it won’t be able to do everything we need – but would be great if it did!

            Thanks,
            Bernie

  4. Is there anyway to get this working with using my primary video card and a Plugable USB Dock? I have tried everything that I know how to.

    I’m almost 100% this would just work if I had the money to buy another Plugable USB Dock but I don’t. Thank you for this guide and if my only option is buying another dock then I’ll try talking the boss into getting another.

    1. Hi Steven,

      Unfortunately, there’s no reliable way right now to get a mix of PCIe and USB displays working in a multiseat configuration. I very much suspect it can be done, but the X configuration issues are difficult enough that I’ve not had a report yet of anyone doing it …

      So have you gotten the UD-160-A up and running as a single seat?

      Best wishes,
      Bernie

      1. I followed this guide and ps aux | grep gdm show’s it’s using the config’s from the guide so yes it would appear it’s working as a single seat.

        Some odd things though:
        I have seen on occasion it use the regular config and a reboot usually has it run the usbseat config but seems to not always happen when the seat is plugged in. Also, I have seen 3 different login screens. Not that it matters. Just pointing out.

        Running Xubuntu 9.04 (was 8.10 but did a do-release-upgrade I believe is the command)

        1. Alright, got my 2nd display link in. Hooked it up. Rebooted and got no change. Was hoping it would just work :P Issue is that I see it is creating /dev/usbseat/{1,2,3} I only have 2 display link devices.

          usbseat/1 shows: keyboard mouse
          usbseat/2 shows: display
          usbseat/3 shows: display keyboard mouse

          ps aux | grep gdm
          I see /usr/sbin/gdm using the gdm-usbseat.conf twice. I see 1 /usr/X11R6/bin/X :3 (assuming X server using the/dev/usbseat/3 since it has all 3) and the gdmgreeter.

          Any thoughts as to why the display in usbseat/2 is not in usbseat/1?

          I have power, ethernet, and both pluggable display links connected to the PC. 1xMonitor, 1xkeyboard, 1xmouse plugged into each pluggable display link device.

          1. I’ve updated the 50-usbseat.rules in this post to resolve what I suspect is the trouble. Let us know if it works.

          2. /bow

            Thank you! That worked perfectly.

            ugh, I’m so excited and not sure how to say thank you enough!

          3. Unknown edid version 0

            On some reboot’s I get that error but rebooting once to a few times and it’s seems to fix. Seems random. Pattern so far: Error, Worked, Worked, Error, Error, Worked, and we are rebooting again to see if it still works.

            Any thoughts?

          4. Unknown edid version 0

            That seems to be the only error that we get.

            It seems like it attempts to start the server again and sometimes succeeds as we have a input box for username/password but it’s also the console. When you type it sends to both the console and the input box. Kind of strange.

          5. Hi Steven Can you “sudo cat /var/log/kern.log | grep -i EDID” and see if the kernel mode drivers tell us any clues? The X failsafe path is very weird – best avoided. So let’s see if we can fix the intermittant EDID reading problem.

          6. Although I don’t know yet what’s causing the problem, there are some things udlfb can do to be more resilient/reliable with EDID handling. Will look at that angle and see if can work around it. Thanks for the detailed info!

  5. Hi guys,

    i have an ASUS EEEtop 1602 (without an external VGA) so i’ve tried to gt an usb Displaylink working to connect my 2nd Display. I am not so familar with ubuntu, i’am new at the linux scene. I tried to figure out (based on your description) to get this stupid display link adapter working. i’ve installed over 15 times an tried nearly everything. Can you give me some hints how to get this thing working? i don’t need multiple users, only a second display! thanks in advance!

  6. Hi Oliver,

    This post and thread is really just about the terminal scenario (multiple users). But in general (as you can see from all the steps above), configuration of this stuff is not easy on Linux – and, worse, it’s very distro dependent.

    It’s even worse with using a USB graphics adapter in the extended desktop scenario, because then it’s also dependent on coordinating things with your primary graphics hardware, and there’s many things changing there in Linux (from some big changes in X to Linux’s new kernel graphics support which isn’t fully stable yet) which mean that there is no “one way” that just works — it’s highly convoluted.

    You can read an interesting recent post from Linus Torvalds, arguing about some of the current compatibility issues with the new DRM/DRI stuff in the kernel, and how (even for Linus) he never wants to touch an xorg.conf again:

    http://marc.info/?l=dri-devel&m=126780713904151&w=2

    Unfortunately, that’s exactly what is needed to configure any graphics controller that’s not on the PCIe bus on Linux today, including USB displays.

    This will all get better in time, but for now unless there’s a specific set of instructions for a specific scenario on a specific distro (like there is in this post), getting things working is going to require some advanced understanding of Linux and X.

    So while other people have gotten it working, and you may be able to, configuring Linux for this is unfortunately not for novice users.

    Best wishes,
    Bernie

  7. ps aux | grep gdm returns this right as it boots up and gives me ssh access:
    /usr/sbin/gdm –config=/etc/gdm/gdm-usbseat.conf
    /usr/sbin/gdm –config=/etc/gdm/gdm-usbseat.conf
    /usr/X11R6/bin/X :2 -br :2 -audit 0 -nolisten tcp vt07 -config /tmp/tmp.LelwHZieoq -auth /var/lib/gdm/:2.Xauth -nolisten tcp
    /usr/sbin/gdm –config=/etc/gdm/gdm-usbseat.conf
    /usr/X11R6/bin/X :3 -br :3 -audit 0 -nolisten tcp vt07 -config /tmp/tmp.emEtWqArRr -auth /var/lib/gdm/:3.Xauth -nolisten tcp

    I ran the ps aux | grep gdm again a few seconds later and the

    /usr/X11R6/bin/X :3 -br :3 -audit 0 -nolisten tcp vt07 -config /tmp/tmp.emEtWqArRr -auth /var/lib/gdm/:3.Xauth -nolisten tcp

    was gone. So we get the error for that X crashing but the login from the other X that is still running.

    1. For the record, we determined that EDID reads were failing intermittently on Steven’s setup. We’ve tried some mititgations, but looks like we need to harden X driver to behave better with no EDID.

  8. Hello Bernie,

    If we do have multiple DL devices (say 10 device) connected to the system and all of them are in use by different user.
    Now, suppose, a user on DL Device #3 unplugged the device, in that case, how the usbseat.sh will come to know which gnome-session to kill ? As there are number of DL devices in use and each of them running separate sessions.
    And we want to kill/exit only that session which was in use by the just Unplugged-device.

    Any thought on the same ?
    Waiting for your positive feedback :-)

    Thanks
    Satish Wagh

    1. Hi Satish,

      In each case, we know the parent hub device number of the DL device that has been removed, and we’ve used that number as a “seat ID”. So it is possible do call gdmdynamic -d on that number to kill the seat.

      That said, that was the intention of the scripts originally, but I never got the device removal actions to trigger as expected. So removal is not getting handled today.

      Also, if we eventually want to support a “disconnect” where we don’t tear down the session when the device is removed, and rather re-connect the open session when the device comes back — in that case, we’ll not want to tear down explicitly.

      But, in any case, teardown isn’t right today. Your thoughts or work here are definitely welcome!

      1. Hello Bernie,
        How are you?

        Any progress for device-removal operation ?
        I am still (re)searching on, the way to save the current session as soon as the device is get dis-connected and greeting the user the same session when he/she logs back.

        Looking forward for your positive feedback.

        Regards
        Satish

        [WORDPRESS HASHCASH] The poster sent us ’0 which is not a hashcash value.

      2. Hello Bernie,

        Now I am getting very close to the desired project.

        But the only problem, I am facing as of now is that, whenever I plug 2+ devices at the same time, then all of these devices share the keyboard and mouse. The mouse and keyboard of the *last* connected device remains in action.

        Same things goes to happened when I connect the 2+ device and then boot the machine, Except that the mouse and keyboard of the HOST machine do not come up.

        Also, If I plug-in and plug-out the device number of times then either that device do not come up and/or the Host machine and all the rest multi-seat sessions get hanged.

        Can you shed some lights in theses issues ?

        ( P.S. Why the twitter account is not updated http://twitter.com/libdlo ? )

        Thanks `n` Regards
        Satish

        [WORDPRESS HASHCASH] The poster sent us ’0 which is not a hashcash value.

        1. Hi Satish,

          No change on device removal behavior. I think it would be interesting to put udlfb in an (optional) mode where it doesn’t tear itself down on device removal if a client has the framebfufer open, rather it keeps a list of DL serial numbers, and reconnects when the same device comes back.

          But it would be great to have a GDM-level temporary disconnect operation, rather than this low-level kind. No idea how to do it, though.

          On your input device behavior – I’ve not seen anything like that. Suspect you’re using different version of xorg. Make sure to *not* use the sharevts option when starting X. And it make take the new Xorg InputClasses support in later distros to make this all clean for multiseat.

          Please post any of your results and progress somewhere. I’m sure people will be interested.

          Best wishes,
          Bernie

          [WORDPRESS HASHCASH] The poster sent us ’0 which is not a hashcash value.

  9. Hi Bernie,
    First, Thanks for the great tutorial. very much appreciated
    Second, Thanks for following up so closely on the comments. one of the few ever.

    I also wanted to ask if there are any news of getting Displaylink working with newer versions of gdm, and how can one help.
    Cheers,
    Rex

    1. Hi Rex,

      Thanks for the kind words. Here’s the latest on multiseat and GDM: http://mail.gnome.org/archives/gdm-list/2010-April/msg00006.html

      So the best help in that area would be to take those unapplied patches and help test and provide feedback on them, especially in combination with the instructions above.

      I’m hoping there’ll be some news soon on Google Summer of Code, which might provide a good push for this work …

      Thanks!
      Bernie

  10. Hello Bernie,

    I started to migrate the project on RHEL-5.3 (32 bit).
    But it seems that RHEL5.3 is not responding the same way Ubuntu does.

    The kernel module ( udlfb ) making the kernel panic ( with no message in /var/log/messages ) and the X module ( displaylink_drv.so ) is not getting compiled at all, giving the error of fb_dev structure and missing xf86Modes.h header file.

    I would like to know, Bernie, that Is there any tree maintained for RHEL-5.3 or any sort of support is available for the same ?

    Thanks
    Satish

    1. Hi Satish – I’ve not done any work with RedHat. RHEL 5.3 was released in Jan 2009, predating any of the DisplayLink work. This thread is the best info I have http://lists.freedesktop.org/archives/libdlo/2010-February/000588.html

      In terms of expertise, Alexander Todorov (http://otb.bg/) has done the most work with RedHat, although mostly 5.4+

      So, sorry, focus is on getting things working on future distros, with no planned effort for older distros.

      1. Hello Bernie,

        Thanks for the update.
        In that case, I will try to go with the distribution like Fedora 13 and/or RHEL-5.5
        I hope, they will work like a charm.

        For Ubuntu, I just followed the link, I have not updated the ubuntu’s any of package. So there must be some issues which need to be resolved.

        Have you tested by booting the ubuntu ( jaunty ) with multiple USB Display-Link connected and getting all of them an individual screen, mouse, keyboard and sound ?

        Also, I am still stuck at the process of maintaining the session of removed-device.

        Please share your thought the same issue.

        Thanking You
        Satish

    2. Hello Satish,
      I’m seeing this a bit late but I can help you with multiseat on RHEL.

      I’m supporting a customized solution based on Plugable USB docks. It started on RHEL 5.4 and is now migrated to RHEL6.

      If you have interest please let me know at atodorov at otb.bg.

  11. Hello Bernie,

    Is it possible to run the dos-application in fullscreen mode on seat ?

    I tried but with no luck.

    Have you tried that ?

    Please let me know.

    Regards,
    Satish

    1. Hi Satish,

      Because udlfb would be getting no notification of which pixels are changing, defio support in udlfb would have to be enabled (compile switch) to use page fault change detection.

      Given that, it would depend on whether the DOS emulator could handle the fact that udlfb only supports a single framebuffer format: 16bpp RGB565. If the DOS emulator was using the standard fbdev interface, and could convert pixels to that format (or the DOS app was using that format natively), there should be nothing preventing it from working.

      But I haven’t done this myself, and haven’t seen any reports from others yet.
      .
      Thanks!
      Bernei

  12. Hi,
    I have some questions:
    - are the unsolved problems solved already?
    - can this work on the more recent versions of Ubuntu (10.10)
    - does this work with any docking station, or is it only for the UGA-125?

    Some background: I am responsible for ICT in a Belgian town. We would like to set up a kind of multiseat system in our public internet places. We are considering several posibilities:
    - multiseats where everything is connected directly to the computer
    - thin client solution
    - the system explained here

    Now, I have some thin client terminals, and we encounter the problem of performance with flash video. Also multiseats with everything connected to the main computer is not 100% what we want. So I would like to test the performance of this method with docking stations. I have 2 sets here, but they are not the UGA-125, but Toshiba Dynadock U10. If possible, I would like to try the system with those 2, and if working well, we could buy the UGA-125 to put in our public places.

    Looking forward for your comments
    Rudy

    1. Hi Rudy,
      I can work with you on the multiseat setup if you are still interested. I have a running class room of 15 seats with simple USB HUB + UGA-125. I’m also working on audio support and other issues and I can make your Toshiba docks work as well. You can find my contact info at http://otb.bg/atodorov

      Regards,
      Alexander.

  13. Hi Bernie,
    I got the interest on multiseat setup in Linux since 2008. I am thanking I found this site and tried to follow the steps. I was able to make the multiseat work on MSI machine with Intel Atom processor installed with Ubuntu 9.04.

    I tried to make a workaround on the third issue and was able to make the USB device-removal/reconnect work by changing some lines in the udev rules and usbseat.sh script and added another script called usbseat-remove.sh.

    My solution cannot retain the current user session. User has to login again after USB device removal and reconnection since X instance is deleted when USB device is removed and instantiated again when the device is plugged in.

    I will post the solution after I made some cleanup of the scripts.

    Rene

  14. Hi Rene – Thank you! it’d be great to get your improvements! If you post them somewhere and have a link, let us know. And/or, we’d be happy to add to the post here. Thank you!!

  15. Thank you for this tutorial. It works perfectly on a Uuntu 11.10.

    At first, is it possible to have a graphical interface instead of the console with this method?
    In a second step, is it possible to extend an existing office with three screens with this method?

    Sorry for my English but I am French ..

    Thank you

    1. Hi Frederic,

      Thanks for your question! Yes, by default with the instructions above, it is assuming an X Windows/GDM GUI.

      But in terms of extending the desktop of one user to extend across 2 or more screens – no, the instructions above do not help with that. And unfortunately, that is not easy with Linux today – we would not recommend it on Linux (whereas on Windows and Mac, that is the normal use, and fully plug and play).

      Hope that helps. Thanks again! Bernie

      1. In fact I have not really GUI on the screen “usb”.

        My screen shows the ubuntu loading logo and then crashes. The two screens connected to the graphics card working (GUI).

        But when I do CTRL + ALT + F1 (or F2, …), the console is displayed on the screen connected with DisplayLink (USB)

  16. Is there a way to use displaylink USB monitors with Linux Mint 15, kernel 3.8+? Wasting a lot of time searching for a solution and trying to connect my Lenovo Thinkvision USB display. Any guidance will be truly appreciated. Many thanks in advance.

Leave a Reply