<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Plugable &#187; Terminal</title>
	<atom:link href="http://plugable.com/category/scenario/terminal/feed/" rel="self" type="application/rss+xml" />
	<link>http://plugable.com</link>
	<description>Do more with one simple USB cable</description>
	<lastBuildDate>Fri, 02 Jul 2010 19:23:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>The Nexus One Phone-Top</title>
		<link>http://plugable.com/2010/06/09/the-nexus-one-phone-top/</link>
		<comments>http://plugable.com/2010/06/09/the-nexus-one-phone-top/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 18:09:13 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[UD-160-A]]></category>
		<category><![CDATA[udlfb]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=959</guid>
		<description><![CDATA[Sven Killig has a sense of where computing is headed: Powerful computers are everywhere, including in your pocket. And he has the skills to push things ahead, to show us glimpses of what&#8217;s coming. Last year, he demoed turning your router into a full-fledged computer. This year, it&#8217;s the Google Nexus One phone as a [...]]]></description>
			<content:encoded><![CDATA[<p>Sven Killig has a sense of where computing is headed:  Powerful computers are everywhere, including in your pocket. And he has the skills to push things ahead, to show us glimpses of what&#8217;s coming.</p>
<p>Last year, he demoed turning <a href="http://sven.killig.de/openwrt/slugterm_dl.html">your router into a full-fledged computer</a>.</p>
<p>This year, it&#8217;s the <a href="http://sven.killig.de/android/N1/2.2/usb_host/">Google Nexus One phone as a full computer</a> &#8212; with attached external keyboard, mouse, display, and more.</p>
<p>The Nexus One demo is using the <a href="http://plugable.com/category/project/udlfb/">udlfb</a> Linux kernel module to talk with the DisplayLink device, and it will work with any DisplayLink device, including Plugable&#8217;s.  </p>
<p>Note the version of udlfb in the 2.6.34 staging tree unfortunately didn&#8217;t work for Sven. So he&#8217;s now using the latest udlfb from <a href="http://git.plugable.com/">http://git.plugable.com/</a>, which will likely get merged in for kernel 2.6.36.</p>
<p>Also, he used a dual headed cable to get enough power.  A powered hub or a docking station/terminal like the <a href="http://plugable.com/products/UD-160-A">UD-160-A</a> won&#8217;t need that &#8212; it supplies its own power from AC &#8211; all the hardware needed is in the one package.</p>
<p>It&#8217;s exciting to have all this open source work come together in interesting demos like this.</p>
<p>There was a question recently why udlfb doesn&#8217;t use the same compression technique as the Windows drivers.  Among other reasons, one is that the RL compression used by udlfb scales down to devices like the ones Sven has been working on &#8212; it&#8217;s as light as possible on CPU load, while getting decent compression.  </p>
<p>Stepping back, it&#8217;s clear Apple (and now Microsoft) are making a mistake by limiting the hardware ecosystem around their devices.  Android and the other Linux variants have an opportunity here &#8212; and considering the Apple juggernaut, they definitely need every advantage.</p>
<p>Sven&#8217;s demos show how powerful these scenarios can be.  The hardware is ready. Devices like Plugable&#8217;s are designed with these scenarios in mind. Now we need to get the software refined and included in standard distributions, so normal consumers can take advantage of all the possibilities and benefits here.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/06/09/the-nexus-one-phone-top/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Summer of Code Work Kicks Off</title>
		<link>http://plugable.com/2010/05/24/google-summer-of-code-work-kicks-off/</link>
		<comments>http://plugable.com/2010/05/24/google-summer-of-code-work-kicks-off/#comments</comments>
		<pubDate>Mon, 24 May 2010 23:28:43 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[UD-160-A]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=934</guid>
		<description><![CDATA[Today is the kickoff of coding work for Google SoC 2010 projects. We&#8217;re very excited about the Google funded project to refine USB multiseat on Linux, with the winning proposal from Lucas Nascimento Ferreira at the Federal University of Parana in Brazil. In addition to providing mentoring, Plugable is also providing donated hardware for this [...]]]></description>
			<content:encoded><![CDATA[<p>Today is the kickoff of coding work for Google SoC 2010 projects.</p>
<p>We&#8217;re very excited about the Google funded project to refine USB multiseat on Linux, with the winning proposal from Lucas Nascimento Ferreira at the Federal University of Parana in Brazil.</p>
<p>In addition to providing mentoring, Plugable is also providing donated hardware for this project. Two <a href="/products/ud-160-a/" target="_blank">Plugable Universal Docking stations</a> with recent enhancements for use as a terminal, were just picked up by Lucas in Brazil today.  By next month, we expect to have updated versions of the <a href="/products/uga-125-hub/" target="_blank">UGA-125-HUB</a> for terminal use to send down.</p>
<p>For those interested in learning more and potentially following Lucas&#8217; work:</p>
<ul>
<li><a href="http://socghop.appspot.com/document/show/gsoc_program/google/gsoc2010/timeline" target="_blank">Google&#8217;s SoC 2010 Timeline</a></li>
<li><a href="http://www.inf.ufpr.br/lnf07/gsoc.txt" target="_blank">Lucas&#8217; winning USB Multiseat Proposal</a></li>
</ul>
<p>And we&#8217;ll post periodic status updates here.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/05/24/google-summer-of-code-work-kicks-off/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Support For Higher-Res Monitors on Lower-Res DisplayLink Devices</title>
		<link>http://plugable.com/2010/05/21/linux-support-for-higher-res-monitors-on-lower-res-displaylink-devices/</link>
		<comments>http://plugable.com/2010/05/21/linux-support-for-higher-res-monitors-on-lower-res-displaylink-devices/#comments</comments>
		<pubDate>Fri, 21 May 2010 16:40:19 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Display]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UD-160-A]]></category>
		<category><![CDATA[UGA-125]]></category>
		<category><![CDATA[UGA-2K-A]]></category>
		<category><![CDATA[udlfb]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=914</guid>
		<description><![CDATA[On Windows and Mac, if you plug in a monitor with a higher resolution than your adapter supports, the driver will automatically fall back to the best common mode between the two. Linux hasn&#8217;t had that support &#8212; it would try to set the highest mode the monitor is capable of, often resulting in a [...]]]></description>
			<content:encoded><![CDATA[<p>On Windows and Mac, if you plug in a monitor with a higher resolution than your adapter supports, the driver will automatically fall back to the best common mode between the two.</p>
<p>Linux hasn&#8217;t had that support &#8212; it would try to set the highest mode the monitor is capable of, often resulting in a black screen.  Especially common for the DL-125 chip, with its mode limits of 1440&#215;900/1280&#215;1024.</p>
<p>That&#8217;s a shame because the DL-125 chip is a smart choice in many cases &#8211; by limiting itself to those lower modes, it stays more consistently within the limits of the USB 2.0 bus, resulting in more consistent performance.</p>
<p>So coinciding with the launch of Plugable&#8217;s DisplayLink DL-125 based products (<a href="/products/uga-125">UGA-125</a> and <a href="/products/uga-125-hub">UGA-125-HUB</a>), changes have been implemented to bring Linux roughly up to the level of Windows and Mac in this area for DisplayLink devices.  This also helps devices like the <a href="/products/ud-160-a">UD-160-A</a> when running on monitors greater than its limit of 1920&#215;1080.</p>
<p>The kernel framebuffer driver udlfb <a href="http://git.plugable.com/gitphp/index.php?p=udlfb&#038;a=commitdiff&#038;h=1bbba9e8123453ce1677fc247abc356c7040892c">has been enhanced to read the resolution limit from the firmware descriptors of the device, and adhere to it</a>.</p>
<p>On the X server side, we needed a driver which would limit itself to the resulting reduced mode list.  Unfortunately, the existing displaylink X server reads EDID directly, and assumes the adapter can do whatever the monitor can do. </p>
<p>We&#8217;ve been wanting to get rid of the need for a displaylink-specific X server, and the standard xf86-video-fbdev driver runs with the best existing mode, rather than trying to set a higher one in EDID.  So this was a good trigger for converting over.</p>
<p>So <a href="http://git.plugable.com/gitphp/index.php?p=xf86-video-fbdev&#038;a=commitdiff&#038;h=388fd2b6a20eb396ccface5b2cf2ec907ec96ba4">xf86-video-fbdev has been enhanced with X Damage protocol support</a>, ported from Roberto&#8217;s displaylink driver.  This is still a little in-flux from an interface perspective, but from a functional perspective it&#8217;s done and fully performant.  </p>
<p>So it&#8217;s now possible to run with a modified generic fbdev driver, which talks to udlfb, with full performance and without needing defio (although there&#8217;s also some good news in the defio space, which will be posted about later).</p>
<p>You can grab the latest udlfb kernel module with a &#8220;git clone http://git.plugable.com/webdav/udlfb&#8221;. Compile with &#8220;make &#038;&#038; sudo make install &#038;&#038; sudo depmod -a&#8221;</p>
<p>And you can grab the latest modified xf86-video-fbdev with a &#8220;git clone http://git.plugable.com/webdav/xf86-video-fbdev&#8221;.  Compile with &#8220;./autogen.sh &#038;&#038; make &#038;&#038; sudo make install&#8221;</p>
<p>You&#8217;ll need a very recent xorg-macros version (1.4), which in package &#8220;sudo apt-get install xutils-dev&#8221;</p>
<p>To use the new X server, you must turn on the new &#8220;ReportDamage&#8221; option to fbdev. Modify your <a href="http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/">existing xorg conf </a>like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Section <span style="color: #ff0000;">&quot;Device&quot;</span>
  Identifier <span style="color: #ff0000;">&quot;dl&quot;</span>
  Driver <span style="color: #ff0000;">&quot;fbdev&quot;</span>
  Option <span style="color: #ff0000;">&quot;ReportDamage&quot;</span> <span style="color: #ff0000;">&quot;true&quot;</span>
  Option <span style="color: #ff0000;">&quot;fbdev&quot;</span> <span style="color: #ff0000;">&quot;/dev/fb0&quot;</span>
EndSection</pre></div></div>

<p>And you should be all set to go.   This new X server should work with the existing udlfb in the staging tree of kernel 2.6.31+ for now, as it&#8217;s re-using the same original ioctl.  But may require modeset changes that are only in 2.6.34+.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/05/21/linux-support-for-higher-res-monitors-on-lower-res-displaylink-devices/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google Summer of Code &#8211; USB Multiseat</title>
		<link>http://plugable.com/2010/04/06/google-summer-of-code-usb-multiseat/</link>
		<comments>http://plugable.com/2010/04/06/google-summer-of-code-usb-multiseat/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 00:17:11 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[UD-160-A]]></category>
		<category><![CDATA[amazon:asin=B002PONXAI]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=788</guid>
		<description><![CDATA[Plugable is offering mentoring and donated hardware for USB graphics projects that are funded as part of Google Summer of Code 2010. Plugable is working through X.Org as a sponsoring organization. The main focus is USB multiseat, and the details are on the xorg wiki for SoC 2010 With all the pieces that are just [...]]]></description>
			<content:encoded><![CDATA[<p>Plugable is offering mentoring and donated hardware for USB graphics projects that are funded as part of Google Summer of Code 2010.  Plugable is working through X.Org as a sponsoring organization.</p>
<p>The main focus is USB multiseat, and the details are on the <a href="http://www.x.org/wiki/SummerOfCodeIdeas">xorg wiki for SoC 2010</a></p>
<p>With all the pieces that are just coming together now, there is a potential here to do a project with huge impact, without a massive amount of engineering.  There is already a very solid proposal coming from a student in Brazil who has previously been involved with the MDM multiseat project.  </p>
<p>Google&#8217;s deadline for applications <a href="http://socghop.appspot.com/document/show/program/google/gsoc2009/timeline">is now just a few days away: April 9th</a>.</p>
<p>If there&#8217;s interest from other parties, we&#8217;ll get everyone talking &#8211; or there are other related proposals that we might be able to get in at the last minute. Foremost among those is conversion of the DisplayLink USB driver udlfb and matching X server from a fbdev driver to the KMS model. </p>
<p>Here&#8217;s the basics of the USB multiseat opportunity:</p>
<blockquote><p>USB Multiseat Refinement</p>
<p>Linux Multiseat setups have potential to significantly reduce the cost of computing, but can be hard to configure. Some progress has been made on USB multiseat, where all components of the &#8220;terminal&#8217; (display, keyboard, mouse, and more) are on USB, so configuration can be fully plug and play &#8211; you can just assume that all devices on the same USB hub constitute a terminal.</p>
<p>Some early prototypes of this are working (see http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/). The underlying kernel drivers and X servers are largely in place.</p>
<p>But recent changes to the X Server, ConsoleKit, and other components open the possibility for a cleaner implementation.</p>
<p>This SoC project would constitute the refinement/creation of configuration scripts to enable a standard Linux or *nix computer to automatically launch additional seats when a USB terminal is plugged in</p>
<p>* udev rules to detect hubs/devices which should be collectively treated as terminals<br />
* udev attributes to label the set of devices with a common seat id<br />
* udev triggers for on-demand generation of the appropriate Xorg config files, to allow seats to coexist with the primary display/devices.<br />
* ConsoleKit scripts to launch independent GDM/X sessions for each USB terminal seat<br />
* InputClass rules to cause the primary X session to ignore multiseat-assigned devices, and the appropriate seat to use them<br />
* udev rules and X init scripts to grant access to audio, storage, and other devices to the person logged into the matching seat </p>
<p>The one-sentence goal of this project: To make USB multiseat fully plug and play for the end-user, and ready for any distro to safely and cleanly drop in at any time.</p></blockquote>
<p>Know any aspiring software engineering students that might be interested?  Check <a href="http://code.google.com/soc/">SoC info from Google</a> and the <a href="http://wiki.x.org/wiki/GSoCApplication">SoC guidelines from xorg</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/04/06/google-summer-of-code-usb-multiseat/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>xorg-server 1.8.0 released</title>
		<link>http://plugable.com/2010/04/02/xorg-server-1-8-0-released/</link>
		<comments>http://plugable.com/2010/04/02/xorg-server-1-8-0-released/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 18:14:11 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[UD-160-A]]></category>
		<category><![CDATA[UGA-2K-A]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=770</guid>
		<description><![CDATA[xorg-server 1.8.0 has been released. There will still be some bugs and issues to resolve &#8212; but this release has most of the features, specifically related to input handling and udev-based dynamic configuration, of a more solid USB multiseat solution. In short: udev rules, which already can detect a grouping of USB devices that constitute [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://lists.freedesktop.org/archives/xorg/2010-April/049784.html">xorg-server 1.8.0 has been released</a>.  </p>
<p>There will still be some bugs and issues to resolve &#8212; but this release has most of the features, specifically related to input handling and udev-based dynamic configuration, of a more solid <a href="http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/">USB multiseat</a> solution.</p>
<p>In short:</p>
<ul>
<li> udev rules, which already can detect a grouping of USB devices that constitute a terminal, can now tell X to ignore or use particular devices more easily through udev attributes and more dynamic/independent xorg.conf.d scripts.</li>
<li> udev is now the default configuration mechanism (the torch has been passed from the less flexible hal)</li>
</ul>
<p>So the challenges to explore are now more in the area of ConsoleKit integration and whether we can use these new capabilities support not just pure-USB multiseat setups, but also a mix of seats with PCIe attached graphics, and with fully USB seats.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/04/02/xorg-server-1-8-0-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>X.Org Server 1.8 Release Candidate 2</title>
		<link>http://plugable.com/2010/03/22/x-org-server-1-8-release-candidate-2/</link>
		<comments>http://plugable.com/2010/03/22/x-org-server-1-8-release-candidate-2/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 15:21:37 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[UD-160-A]]></category>
		<category><![CDATA[UGA-2K-A]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=735</guid>
		<description><![CDATA[X.Org has announced RC2 of the 1.8 server release for Linux and other *nix operating systems. 1.8 contains several new features and configuration capabilities that will form the foundation of future USB multiseat work. In effect, USB multiseat has been waiting for this work to stabilize and get into the distros (of which Fedora 13 [...]]]></description>
			<content:encoded><![CDATA[<p>X.Org has announced RC2 of the 1.8 server release for Linux and other *nix operating systems.  1.8 contains several new features and configuration capabilities that will form the foundation of future USB multiseat work.  In effect, USB multiseat has been waiting for this work to stabilize and get into the distros (of which Fedora 13 will be one of the first).</p>
<p>You can read more about the <a href="http://who-t.blogspot.com/2010/01/new-configuration-world-order.html">new 1.8 configuration features</a> which multiseat will use at Peter Hutterer&#8217;s blog.</p>
<p>And read more about the RC itself at <a href="http://www.phoronix.com/scan.php?page=news_item&#038;px=ODA4OQ">Phoronix</a></p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/03/22/x-org-server-1-8-release-candidate-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux USB multiseat audio support</title>
		<link>http://plugable.com/2010/01/20/linux-usb-multiseat-audio-support/</link>
		<comments>http://plugable.com/2010/01/20/linux-usb-multiseat-audio-support/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 06:09:48 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Installing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UD-160-A]]></category>
		<category><![CDATA[udlfb]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=353</guid>
		<description><![CDATA[Here&#8217;s how to add audio support on top of the previous instructions for getting USB multiseat running on Linux, with a Plugable UD-160-A type device. Add the following line to the bottom of the /lib/udev/rules.d/50-usbseat.rules file created per the previous instructions. KERNEL==&#34;control*&#34;, SUBSYSTEM==&#34;sound&#34;, SUBSYSTEMS==&#34;usb&#34;, PROGRAM=&#34;/bin/cat /sys/%p/../../../../../devnum&#34;, SYMLINK+=&#34;usbseat/%c/sound&#34; Then create a new /etc/X11/Xsession.d/50usbseat file which will [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s how to add audio support on top of the previous instructions for <a href="http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/">getting USB multiseat running</a> on Linux, with a Plugable UD-160-A type device.</p>
<p>Add the following line to the bottom of the /lib/udev/rules.d/50-usbseat.rules file created per the previous instructions.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;control*&quot;</span>, <span style="color: #007800;">SUBSYSTEM</span>==<span style="color: #ff0000;">&quot;sound&quot;</span>, <span style="color: #007800;">SUBSYSTEMS</span>==<span style="color: #ff0000;">&quot;usb&quot;</span>, <span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../../../devnum&quot;</span>, SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/sound&quot;</span></pre></div></div>

<p>Then create a new /etc/X11/Xsession.d/50usbseat file which will be run at Xsession create time, with the following contents</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">oldIFS</span>=<span style="color: #007800;">$IFS</span>
<span style="color: #007800;">IFS</span>=:
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">$DISPLAY</span>
<span style="color: #007800;">IFS</span>=.
<span style="color: #000000; font-weight: bold;">set</span> $<span style="color: #000000;">2</span>
<span style="color: #007800;">SEAT_ID</span>=$<span style="color: #000000;">1</span>
<span style="color: #007800;">LN</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-al</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>usbseat<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$SEAT_ID</span><span style="color: #000000; font-weight: bold;">/</span>sound<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">IFS</span>=C
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">$LN</span>
<span style="color: #007800;">CARD_ID</span>=$<span style="color: #000000;">2</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ALSA_CARD</span>=$<span style="color: #000000;">2</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">ALSA_PCM_CARD</span>=$<span style="color: #000000;">2</span>
<span style="color: #007800;">IFS</span>=<span style="color: #007800;">$oldIFS</span></pre></div></div>

<p>Each of the users who might need access to the USB devices needs to be added to the &#8216;audio&#8217; group.  On Ubuntu 9.04, this can be done with these commands to backup and then modify the groups (replace MY_USERNAME, of course) &#8230;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>group <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>group_backup
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> a-wx <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>group_backup
<span style="color: #c20cb9; font-weight: bold;">sudo</span> adduser MY_USERNAME audio</pre></div></div>

<p>See <a href="https://help.ubuntu.com/community/SoundTroubleshooting">Ubuntu Sound TroubleShooting</a> for details on that step.</p>
<p>Now, as you connect UD-160-A terminals, a new X instance and GDM login will pop up as before, but also each of them will have /dev/usbseat/%SEAT_ID%/sound linking to their sound device, and the ALSA_CARD environment variable for all processes off of that X session, set to the matching sound card ID.  For apps which support ALSA/Pulse (like most browsers, flash, etc.), audio will now come out the correct terminal &#8212; all in a completely plug-and-play fashion.</p>
<p>If you&#8217;re wondering what the strange IFS stuff is in the above script, it&#8217;s bash&#8217;s built-in Internal Field Separator variable, which is an easy way to split strings without having to launch a separate sed or awk process.</p>
<p>Note, as before, these instructions are specific to and tested on an older version of Ubuntu: 9.04, and may need to be ported to other distros until the distros themselves integrate these scripts.</p>
<p>Thanks to Alexander Todorov&#8217;s <a href="http://code.google.com/p/alexx/source/browse/multi-seat#multi-seat/sumu">earlier work on multiseat sound support</a>, which demonstrated how to match the USB audio devices in udev, and which ALSA_ environment variables to set.  Alexander reported some problems reliably matching the audio devices, but with these scripts (with limited testing so far), things are working as expected.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2010/01/20/linux-usb-multiseat-audio-support/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Explaining multiseat benefits</title>
		<link>http://plugable.com/2009/11/19/explaining-multiseat-benefits/</link>
		<comments>http://plugable.com/2009/11/19/explaining-multiseat-benefits/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 23:39:42 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Evaluating]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=299</guid>
		<description><![CDATA[Following on the announcement of Windows Multipoint Server 2010, HP has announced their first product to connect with it: The HP MultiSeat thin client T100. It&#8217;s a DisplayLink-based device with VGA, PS/2 keyboard and mouse ports, and audio. It&#8217;s a focused competitor to the product that Plugable sells here, and they do a great job [...]]]></description>
			<content:encoded><![CDATA[<p>Following on the announcement of Windows Multipoint Server 2010, HP has announced their first product to connect with it: The HP MultiSeat thin client T100.  It&#8217;s a DisplayLink-based device with VGA, PS/2 keyboard and mouse ports, and audio.  It&#8217;s a focused competitor to the product that Plugable sells here, and they do a great job of explaining the benefits in video form <a href="http://government.hp.com/solutions_detailtabs.asp?sid=79&#038;agencyid=135">here</a> and <a href="http://government.hp.com/solutions_detailtabs.asp?sid=77&#038;agencyid=135">here</a>.</p>
<p><a href="http://www.displaylink.com/thin_client.html">DisplayLink&#8217;s new thin client materials</a> also provide a bunch of additional detail, with good bullet points on why simple USB connectivity provides real value for this scenario.</p>
<p>Companies like Sun, nComputing, Miniframe, and Userful have sold products for Windows and Unix in this space for some time.  The unix world has had various forms of multiseat capability forever &#8212; not to speak of traditional X terminals and all the thin client network protocols like RDP, ICA, and VNC on Windows and Unix, which people think of first when they think of terminals.</p>
<p>But when it comes to true multiseat (locally connected devices, treated as terminals), Linux has had it first, has lots of advantages in terms of licensing cost and performance, has gotten hundreds of thousands of seats in use &#8212; and yet hasn&#8217;t quite make it easy enough for end users for it to reach its full audience.  </p>
<p>So these new product launches, now with Microsoft on board, definitely have the ability to raise more awareness of the potential of this scenario.  It&#8217;s a challenge to the Unix and Linux crowd to leverage their built in advantages &#8212; and continue working on the shortcomings of Linux as a client desktop &#8212; in order to continue to provide compelling competition in this market.</p>
<p>Either way, the additional exposure is great for communicating the potential of multiseat.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2009/11/19/explaining-multiseat-benefits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up USB multiseat with DisplayLink on Linux (GDM up to 2.20)</title>
		<link>http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/</link>
		<comments>http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 23:55:17 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[Installing]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[UD-160-A]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=268</guid>
		<description><![CDATA[Soon, we&#8217;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 &#8212; anywhere where you have clusters of [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://plugable.com/wp-content/uploads/2009/10/2009-09-22-195134-fourseats.JPG"><img src="http://plugable.com/wp-content/uploads/2009/10/2009-09-22-195134-fourseats-150x150.jpg" alt="Four $99 UD-160-A Terminals off a single $299 netbook" title="Four $99 UD-160-A Terminals off a single $299 netbook" width="150" height="150" class="alignright size-thumbnail wp-image-153" /></a>Soon, we&#8217;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 &#8212; 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.</p>
<p>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.
<pre>gdm &#8211;version</pre>
<p> will show what version you have on your current system. Any tweaks to make things work your specific distro are definitely welcome in the comments.</p>
<p><a href="http://plugable.com/products/ud-160-a/" target="_blank"><img src="http://plugable.com/wp-content/uploads/2010/02/plugable-ud-160-a1-150x150.png" alt="" title="plugable-ud-160-a" width="150" height="150" class="alignleft size-thumbnail wp-image-415" /></a>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 <a href="/products/ud-160-a/" target="_blank">Plugable Universal Docking Station</a>, or buy independent devices like the <a href="/products/uga-125-hub/" target="_blank">UGA-125-HUB</a> bundle.  USB Audio and other devices can be made to work also, but these instructions just cover basic display, keyboard, and mouse.</p>
<p>With that, you're ready to start configuring your Linux setup  ...</p>
<h3>1. DisplayLink framebuffer driver</h3>
<p>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/).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> module-assistant
<span style="color: #c20cb9; font-weight: bold;">sudo</span> module-assistant prepare
git clone http:<span style="color: #000000; font-weight: bold;">//</span>git.plugable.com<span style="color: #000000; font-weight: bold;">/</span>webdav<span style="color: #000000; font-weight: bold;">/</span>udlfb<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> udlfb
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> depmod <span style="color: #660033;">-a</span></pre></div></div>

<p>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.  </p>
<h3>2. DisplayLink X server</h3>
<p>This will get the X server installed, ready for use by later scripts.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> pkg-config xorg-dev
<span style="color: #7a0874; font-weight: bold;">cd</span> ~git
git clone http:<span style="color: #000000; font-weight: bold;">//</span>git.plugable.com<span style="color: #000000; font-weight: bold;">/</span>webdav<span style="color: #000000; font-weight: bold;">/</span>xf-video-udlfb<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #7a0874; font-weight: bold;">cd</span> xf-video-udlfb
.<span style="color: #000000; font-weight: bold;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>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.</p>
<h3>3. udev script</h3>
<p>Create a file called /lib/udev/rules.d/50-usbseat.rules owned by user root, with the following contents.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># set all DisplayLink devices to configuration 1</span>
<span style="color: #666666; font-style: italic;"># see http://libdlo.freedesktop.org/wiki/DeviceQuirks for more info</span>
ATTR<span style="color: #7a0874; font-weight: bold;">&#123;</span>idVendor<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;17e9&quot;</span>, ATTR<span style="color: #7a0874; font-weight: bold;">&#123;</span>bConfigurationValue<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;2&quot;</span>, <span style="color: #007800;">RUN</span>=<span style="color: #ff0000;">&quot;/bin/echo 1 &gt; /sys%p/bConfigurationValue&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># aliases for display, kbd, mouse attached to specific hubs</span>
&nbsp;
<span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;fb*&quot;</span>,<span style="color: #007800;">SUBSYSTEMS</span>==<span style="color: #ff0000;">&quot;usb&quot;</span>,<span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../devnum&quot;</span>,SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/display&quot;</span>,RUN+=<span style="color: #ff0000;">&quot;usbseat.sh %c&quot;</span>
<span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;mouse*&quot;</span>, <span style="color: #007800;">SUBSYSTEMS</span>==<span style="color: #ff0000;">&quot;usb&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceClass<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;03&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceProtocol<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;02&quot;</span>, <span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../../../devnum&quot;</span>,SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/mouse&quot;</span>,RUN+=<span style="color: #ff0000;">&quot;usbseat.sh %c&quot;</span>
<span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;event*&quot;</span>, <span style="color: #007800;">SUBSYSTEM</span>==<span style="color: #ff0000;">&quot;input&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceClass<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;03&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceProtocol<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;01&quot;</span>,<span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../../../devnum&quot;</span>,SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/keyboard&quot;</span>,RUN+=<span style="color: #ff0000;">&quot;usbseat.sh %c&quot;</span>
<span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;control*&quot;</span>, <span style="color: #007800;">SUBSYSTEM</span>==<span style="color: #ff0000;">&quot;sound&quot;</span>, <span style="color: #007800;">SUBSYSTEMS</span>==<span style="color: #ff0000;">&quot;usb&quot;</span>, <span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../../../devnum&quot;</span>, SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/sound&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># 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</span>
<span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;event*&quot;</span>, <span style="color: #007800;">SUBSYSTEM</span>==<span style="color: #ff0000;">&quot;input&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceClass<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;03&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceProtocol<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;01&quot;</span>,<span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../../../../devnum&quot;</span>,SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/keyboard&quot;</span>,RUN+=<span style="color: #ff0000;">&quot;usbseat.sh %c&quot;</span>
<span style="color: #007800;">KERNEL</span>==<span style="color: #ff0000;">&quot;mouse*&quot;</span>, <span style="color: #007800;">SUBSYSTEMS</span>==<span style="color: #ff0000;">&quot;usb&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceClass<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;03&quot;</span>, ATTRS<span style="color: #7a0874; font-weight: bold;">&#123;</span>bInterfaceProtocol<span style="color: #7a0874; font-weight: bold;">&#125;</span>==<span style="color: #ff0000;">&quot;02&quot;</span>, <span style="color: #007800;">PROGRAM</span>=<span style="color: #ff0000;">&quot;/bin/cat /sys/%p/../../../../../../devnum&quot;</span>,SYMLINK+=<span style="color: #ff0000;">&quot;usbseat/%c/mouse&quot;</span>,RUN+=<span style="color: #ff0000;">&quot;usbseat.sh %c&quot;</span></pre></div></div>

<p>The udev subsystem will run this script automatically each time a USB device is attached. </p>
<h3>4. usbseat.sh script</h3>
<p>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.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;"># takes the &quot;seat number&quot; as parameter $1</span>
<span style="color: #666666; font-style: italic;"># the seat number is the kernel device id of the hub the seat's devices are sitting off of</span>
<span style="color: #666666; font-style: italic;"># called once for every usb device that MIGHT be part of a seat, when they arrive or remove </span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span><span style="color: #7a0874; font-weight: bold;">&#40;</span>-n <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">pidof</span> gdm<span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">seat_running</span>=<span style="color: #000000; font-weight: bold;">`/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gdmdynamic <span style="color: #660033;">-l</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-n</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;/:$1,/p&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># $ACTION environment variable is set by udev subsystem</span>
<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$ACTION</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
	<span style="color: #ff0000;">'remove'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;{<span style="color: #007800;">$seat_running</span>}&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gdmdynamic <span style="color: #660033;">-v</span> <span style="color: #660033;">-d</span> $<span style="color: #000000;">1</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
	<span style="color: #000000; font-weight: bold;">*</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
                <span style="color: #666666; font-style: italic;"># A device which might be part of a seat has been added</span>
&nbsp;
		<span style="color: #666666; font-style: italic;"># if we already have a running seat for this #, exit</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${seat_running}</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>usbseat<span style="color: #000000; font-weight: bold;">/</span>$<span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>keyboard <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #660033;">-e</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>usbseat<span style="color: #000000; font-weight: bold;">/</span>$<span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>mouse <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #660033;">-e</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>usbseat<span style="color: #000000; font-weight: bold;">/</span>$<span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">/</span>display <span style="color: #7a0874; font-weight: bold;">&#93;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
&nbsp;
			<span style="color: #666666; font-style: italic;"># We have a newly complete seat. Start it.</span>
			<span style="color: #007800;">TMPFILE</span>=<span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">mktemp</span><span style="color: #000000; font-weight: bold;">`</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
			<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">&quot;s/%ID_SEAT%/$1/g&quot;</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>udev<span style="color: #000000; font-weight: bold;">/</span>usbseat-xf86.conf.sed <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$TMPFILE</span>
			<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gdmdynamic <span style="color: #660033;">-v</span> <span style="color: #660033;">-t</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-s</span> <span style="color: #000000;">1</span> <span style="color: #660033;">-a</span> <span style="color: #ff0000;">&quot;$1=/usr/X11R6/bin/X -br :$1 -audit 0 -nolisten tcp vt07 -config <span style="color: #007800;">$TMPFILE</span>&quot;</span>
			<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>gdmdynamic <span style="color: #660033;">-v</span> <span style="color: #660033;">-r</span> $<span style="color: #000000;">1</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
		<span style="color: #000000; font-weight: bold;">;;</span>
<span style="color: #000000; font-weight: bold;">esac</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></pre></div></div>

<h3>5. X config file</h3>
<p>Create file /lib/udev/usbseat-xf86.conf.sed with contents</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;ServerFlags&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;AutoEnableDevices&quot;</span>	<span style="color: #0000ff;">&quot;false&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;AutoAddDevices&quot;</span>	<span style="color: #0000ff;">&quot;false&quot;</span>
	<span style="color: #990000;">Option</span>  <span style="color: #0000ff;">&quot;DefaultLayout&quot;</span>		<span style="color: #0000ff;">&quot;seat&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;DontZoom&quot;</span>		<span style="color: #0000ff;">&quot;true&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;DontZap&quot;</span>		<span style="color: #0000ff;">&quot;true&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;AllowMouseOpenFail&quot;</span>	<span style="color: #0000ff;">&quot;yes&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;Module&quot;</span>
	<span style="color: #990000;">Load</span> <span style="color: #0000ff;">&quot;ddc&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;Files&quot;</span>                                                                                                              
    ModulePath      <span style="color: #0000ff;">&quot;/usr/lib/xorg/modules&quot;</span>
    ModulePath      <span style="color: #0000ff;">&quot;/usr/local/lib/xorg/modules&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;Device&quot;</span>
	<span style="color: #990000;">Identifier</span> <span style="color: #0000ff;">&quot;dl&quot;</span>
	<span style="color: #990000;">driver</span>	   <span style="color: #0000ff;">&quot;displaylink&quot;</span>
	<span style="color: #990000;">Option</span> <span style="color: #0000ff;">&quot;fbdev&quot;</span>	<span style="color: #0000ff;">&quot;/dev/usbseat/%ID_SEAT%/display&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;InputDevice&quot;</span>
	<span style="color: #990000;">Identifier</span> <span style="color: #0000ff;">&quot;keyboard&quot;</span>
	<span style="color: #990000;">Driver</span>	<span style="color: #0000ff;">&quot;evdev&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;CoreKeyboard&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;Device&quot;</span>	<span style="color: #0000ff;">&quot;/dev/usbseat/%ID_SEAT%/keyboard&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;XkbModel&quot;</span>	<span style="color: #0000ff;">&quot;evdev&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;XkbLayout&quot;</span>	<span style="color: #0000ff;">&quot;us&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;InputDevice&quot;</span>
	<span style="color: #990000;">Identifier</span> <span style="color: #0000ff;">&quot;mouse&quot;</span>
	<span style="color: #990000;">Driver</span>	<span style="color: #0000ff;">&quot;mouse&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;CorePointer&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;Protocol&quot;</span> <span style="color: #0000ff;">&quot;ImPS/2&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;Device&quot;</span>	<span style="color: #0000ff;">&quot;/dev/usbseat/%ID_SEAT%/mouse&quot;</span>
        <span style="color: #990000;">Option</span>  <span style="color: #0000ff;">&quot;Buttons&quot;</span> <span style="color: #0000ff;">&quot;5&quot;</span>
	<span style="color: #990000;">Option</span>	<span style="color: #0000ff;">&quot;ZAxisMapping&quot;</span> <span style="color: #0000ff;">&quot;4 5&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;Monitor&quot;</span>
	<span style="color: #990000;">Identifier</span> <span style="color: #0000ff;">&quot;monitor&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;Screen&quot;</span>
	<span style="color: #990000;">Identifier</span> <span style="color: #0000ff;">&quot;screen&quot;</span>
	<span style="color: #990000;">Device</span> <span style="color: #0000ff;">&quot;dl&quot;</span>
	<span style="color: #990000;">Monitor</span> <span style="color: #0000ff;">&quot;monitor&quot;</span>
<span style="color: #b1b100;">EndSection</span>
&nbsp;
<span style="color: #b1b100;">Section</span> <span style="color: #0000ff;">&quot;ServerLayout&quot;</span>
	<span style="color: #990000;">Identifier</span> <span style="color: #0000ff;">&quot;seat&quot;</span>
	<span style="color: #990000;">Screen</span>	<span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">&quot;screen&quot;</span> <span style="color: #cc66cc;">0</span> <span style="color: #cc66cc;">0</span> 
	<span style="color: #990000;">InputDevice</span> <span style="color: #0000ff;">&quot;keyboard&quot;</span> <span style="color: #0000ff;">&quot;CoreKeyboard&quot;</span>
	<span style="color: #990000;">InputDevice</span> <span style="color: #0000ff;">&quot;mouse&quot;</span> <span style="color: #0000ff;">&quot;CorePointer&quot;</span>
<span style="color: #b1b100;">EndSection</span></pre></div></div>

<h3>6. fbcon workaround</h3>
<p>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.</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">blacklist font
blacklist tileblit
blacklist bitblit
blacklist fbcon</pre></div></div>

<p>This file will not take effect until you run</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> update-initramfs <span style="color: #660033;">-u</span></pre></div></div>

<p>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.</p>
<h3>7. xrandr workaround</h3>
<p>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.</p>
<p>Add these lines into /etc/gdm/Init/Default, right after the definition of gdmwhich()</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">XRANDR</span>=<span style="color: #000000; font-weight: bold;">`</span>gdmwhich xrandr<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;x<span style="color: #007800;">$XRANDR</span>&quot;</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #ff0000;">&quot;x&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
  <span style="color: #007800;">$XRANDR</span> <span style="color: #660033;">-o</span> <span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<h3>8. /etc/rc.local script</h3>
<p>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.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">oldIFS</span>=<span style="color: #007800;">$IFS</span>
<span style="color: #007800;">IFS</span>=<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #000000; font-weight: bold;">for</span> seat <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>usbseat<span style="color: #000000; font-weight: bold;">/*</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #007800;">$seat</span>
	<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>udev<span style="color: #000000; font-weight: bold;">/</span>usbseat.sh $<span style="color: #000000;">4</span>
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #007800;">IFS</span>=<span style="color: #007800;">$oldIFS</span></pre></div></div>

<h3>9. /etc/init.d/gdm patch</h3>
<p>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.</p>
<p>Add these lines to your /etc/init.d/gdm script, just after the section to "Allow cdd to override the config" (around line 35).</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Allow usbseat to override the config</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>gdm<span style="color: #000000; font-weight: bold;">/</span>gdm-usbseat.conf <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #000000; font-weight: bold;">for</span> usbseat <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>usbseat<span style="color: #000000; font-weight: bold;">/*</span>; <span style="color: #000000; font-weight: bold;">do</span>
		<span style="color: #007800;">seatid</span>=<span style="color: #800000;">${usbseat##*/}</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;/dev/usbseat/<span style="color: #007800;">$seatid</span>/keyboard&quot;</span> <span style="color: #660033;">-a</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;/dev/usbseat/<span style="color: #007800;">$seatid</span>/mouse&quot;</span> <span style="color: #660033;">-a</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;/dev/usbseat/<span style="color: #007800;">$seatid</span>/display&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">CONFIG_FILE</span>=<span style="color: #ff0000;">&quot;--config=/etc/gdm/gdm-usbseat.conf&quot;</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
	<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div>

<h3>10. Create /etc/gdm/gdm-usbseat.conf</h3>
<p>This is the alternative gdm.conf that will be used when a USB terminal is present at boot:</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;"><span class="br0">&#91;</span>daemon<span class="br0">&#93;</span>
DynamicXServers=true
FlexibleXServers=<span style="color: #cc66cc;">0</span>
Greeter=/usr/lib/gdm/gdmgreeter
&nbsp;
<span class="br0">&#91;</span>security<span class="br0">&#93;</span>
&nbsp;
<span class="br0">&#91;</span>xdmcp<span class="br0">&#93;</span>
&nbsp;
<span class="br0">&#91;</span>gui<span class="br0">&#93;</span>
&nbsp;
<span class="br0">&#91;</span>greeter<span class="br0">&#93;</span>
&nbsp;
<span class="br0">&#91;</span>chooser<span class="br0">&#93;</span>
&nbsp;
<span class="br0">&#91;</span>debug<span class="br0">&#93;</span>
&nbsp;
<span class="br0">&#91;</span>servers<span class="br0">&#93;</span>
<span style="color: #cc66cc;">0</span>=inactive</pre></div></div>

<p>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.</p>
<p><a href="http://plugable.com/wp-content/uploads/2009/10/2009-09-22-200342-Edubuntu.JPG"><img src="http://plugable.com/wp-content/uploads/2009/10/2009-09-22-200342-Edubuntu-300x200.jpg" alt="usb multiseat with Edubuntu" title="usb multiseat with Edubuntu" width="300" height="200" class="aligncenter size-medium wp-image-162" /></a></p>
<p>See my video from <a href="http://video.linuxfoundation.org/video/1590">Linux Plumbers 2009</a> for more thoughts and background on USB multiseat.</p>
<h3>Unsolved Problems</h3>
<p>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:</p>
<p><strong>input duplication</strong></p>
<p><em>[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]</em></p>
<p>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.</p>
<p><strong>mouse scroll wheel doesn't work</strong></p>
<p><em>[Update Feb 19, 2010 - fixed by changing Protocol from "auto" to "ImPS/2" in the xorg.conf]</em></p>
<p>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.</p>
<p><strong>unplug terminal doesn't tear down (or reconnect)</strong><br />
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.</p>
<p>Comments on other distros (e.g. yum vs. apt-get), better solutions, and other problems are very much appreciated.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2009/11/16/setting-up-usb-multiseat-with-displaylink-on-linux-gdm-up-to-2-20/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>Microsoft Windows Multipoint Server 2010 Announced</title>
		<link>http://plugable.com/2009/11/12/microsoft-windows-multipoint-server-2010-announced/</link>
		<comments>http://plugable.com/2009/11/12/microsoft-windows-multipoint-server-2010-announced/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 04:52:31 +0000</pubDate>
		<dc:creator>Bernie Thompson</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Terminal]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://plugable.com/?p=261</guid>
		<description><![CDATA[Microsoft has announced their Windows solution that&#8217;s similar to Linux multiseat: Windows Server Multipoint 2010. Architecturally, it&#8217;s actually similar to running several VNC clients in loopback mode on the same Linux server. See Microsoft&#8217;s &#8220;Unlimited Potential&#8221; blog for more information from Microsoft. &#8220;Unlimited&#8221; is over the top, but there&#8217;s certainly unfulfilled potential for multiseat (my [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft has announced their Windows solution that&#8217;s similar to Linux multiseat: Windows Server Multipoint 2010.  Architecturally, it&#8217;s actually similar to running several VNC clients in loopback mode on the same Linux server.</p>
<p>See <a href="http://blogs.technet.com/unlimitedpotential/archive/2009/11/12/expanding-education-s-access-to-technology-with-windows-multipoint-server-2010.aspx">Microsoft&#8217;s &#8220;Unlimited Potential&#8221; blog</a> for more information from Microsoft.</p>
<p>&#8220;Unlimited&#8221; is over the top, but there&#8217;s certainly unfulfilled potential for multiseat (<a href="http://video.linuxfoundation.org/video/1590">my talk on this</a>), so raising awareness of the opportunity to lower the cost of computing this way is a good thing, whether you care about both Windows and Linux, or just one.  Clusters of computing terminals that are cheaper to buy and much less expensive to maintain is a great thing for education and many other scenarios.</p>
<p>Let&#8217;s all make it happen.</p>
]]></content:encoded>
			<wfw:commentRss>http://plugable.com/2009/11/12/microsoft-windows-multipoint-server-2010-announced/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
