简述

这篇文章说的是如何实现multiseat,必须的条件和步骤等等。

首先简介一下multiseat。multiseat又叫做多座电脑,和瘦客户端(thinclient)一样,是一种降低电脑平均使用成本的方案。基本思路是,买一台稍好的物理机,然后买两个显示器和键盘鼠标,让两个(或者多个)人同时使用一台电脑。和瘦客户端一样,multiseat一般只用于对电脑计算能力要求不高的场合,打游戏的一般就别考虑了。和瘦客户端不同的是,multiseat的处理都在近程,所以在体验上会略好一些,部署时也不依赖于中心化网络。不过这些年网络设备都在改善,相差也不多。

硬件解说

显示系统

显示系统通常分为显卡和显示器两部分。multiseat至少需要两个显示器,但是两台显示器输出有多种情况。

  1. 单卡单核心双输出。一块显卡,一块核心,pci上就一个物理设备,但是可以输出到两台显示器上。例如笔记本,一个输出到本子上,一个输出到投影上。大部分机器都是这种情况。
  2. 单卡双核心单输出。又叫做单卡双核心交火。交火是一个ati术语,在nv那里叫做sli。是指用两块显卡为同一个显示进行加速,达到比一块显卡更快的情况。这一般是顶级显卡。
  3. 单卡双核心双输出。在单卡双核心单输出的卡上,一般都有两个输出。如果接入两个设备,那就是双核心双输出了。
  4. 双卡双核心单输出。又叫做双卡交火,在pci上有两个物理设备。同样是为了游戏而生的电脑。
  5. 双卡双核心双输出,两个pci-e。在上面的基础上,多接一台显示器。
  6. 双卡双核心双输出,一个pci。很少见,一般都是图形工作站。

之所以在这个问题上说这么细,是因为多X方案必须工作在两个以上核心上,每个核心分别输出一路。也就是说,上文中的3, 5, 6三种情况。我们最常见的1是不可以用多X方案的。而方案5, 6,是这么分的。一般的显卡都是pci-e的,而一块主板上只有一个pci-e插槽。所以普通主板是配不上两块普通显卡的。也不要考虑板载显卡和外接显卡的问题,卖电脑的说,大部分主板上都做了自动屏蔽。外接显卡一插上去,板载显卡自动屏蔽。

键盘和鼠标

multiseat至少两套键盘和鼠标,这是常识。

声音和外设

做的好的multiseat,尤其是搭配硬件卖的商业方案,一般都会做声音和外设隔离。你接上去的u盘不会出现在另一个人的电脑里。不过有些方案的隔离就不是那么完美,有可能只有主座有声音拉,或者是声音不能用拉。或者是自己指定声音输出到哪个设备,然后再抢耳机拉,或者是干脆多装一块声卡拉。这个问题自己留心。

windows

windows下可以用softxpand[2]或者betwin[3],俗称拖机软件,不过两者的破解都不是很好找,尤其是win7可用的。windows下拖机的后果可能是,D3D加速有问题,两个人同时用的时候CPU使用率升高,其中一个人没有声音等。具体情况你设法下到试试再说。

linux

以下linux,没特别说明的话都是指debian,默认的发行版本是wheezy。

多X方案

所谓多X,就是开启两个以上的X,每个显卡一个X。这样形成的multiseat保留了原生的一切能力,包括3D加速。只要你原生显卡支持,都可以做到。多X方案的第一个显卡可以看到console,第二个只能看到图形界面,不能通过C-M-F1切换到console。

但是多X的条件也非常严格,上面列的情况1是没戏的。大部分人的电脑都被划到了这种情况。即使你有幸,弄到了3, 5, 6三种情况中的一个,也要注意,两块显卡必须是同一厂家,最好是同一型号。这点尤其对pci显卡更需要注意,pci显卡和pci-e显卡显然不能是同一型号,但是必须是同一厂家

这个方案最鸡肋的地方在于,3, 5两种情况只有在针对游戏特别配置的电脑上才有效,而这种电脑本身是非常昂贵的。这和降低系统成本的初衷相违背。

Xephyr方案

Xephry是一个X的模块,他的目的是使用内存作为X的输出设备。因此Xephry做出来的X可以将显示内容再显示到其他地方,例如作为其他X中的一个窗口出现,等等。

利用这个特点来做multiseat的思路基本是这样的。首先我们将两个显示器合并成一个虚桌面,如同我们常规做的那样,左边的窗口拖一下可以到右边。然后再开两个Xephry,每个里面包含一个标准的X,包括display manager,session,window manager等等。最后每个X分别用一套键盘/鼠标。这样出现的效果和multiseat是完全一样的。

这个方案的优点是,支持众多的机器,尤其是我们最常见的1情况。但是,其缺点和优点一样明显。由于我们操作的是Xephry,而不是实际的显卡,因此会缺少一些X扩展,例如3D。而且相比原生设备,Xephry方案会有少量延迟。贝壳做过实际测量,至少在播放普通视频的时候,60Hz的刷新率没什么问题,播放无卡顿。

这个方案有一个封装好的实现,帮你做了整个过程。(不过我没有测试)叫做MDM[4]。

虚拟化拖机

无论是windows还是linux,都有一个不算方案的方案。安装一套vmware,然后将vmware在其中一个显示器全屏,再把其中一个鼠标和键盘指定给这台虚拟机。这样也可以做到multiseat的效果。使用Virtualbox/Vitrual

PC也是完全一样的原理。

vmware中原生是不可以将鼠标/键盘指定给虚拟机的。关于这点,文档[6]给出了完整的解决方案。在.vmx中加入下面一行即可。

usb.generic.allowHID = "TRUE"

参考

  1. Multiseat Documentation in x.org
  2. Softxpand
  3. BeTwin
  4. Multiseat Display Manager
  5. ourbetwin
  6. VMware拖机方法