多座位配置/Xnest
本文介绍了一种使用Xnest创建多终端的方法。有关其他方法,请参阅多终端。
Xnest 中有一些修改,使它能够用于实现多终端系统。该系统配置为运行一个控制所有显卡的 X 服务器,以及每个屏幕一个 Xnest,运行在主 X 服务器之上。
虽然正常的 Xnest 从其父 X 服务器接收事件,但 multiXnest(修改后的 Xnest)直接从内核事件接口读取输入设备事件,绕过 X。
Debian Sarge(但它很容易适应其他Linux 发行版)。
Xnest 是一个在另一个 X 服务器内部运行的 X 服务器。Xnest 同时是 X 客户端和 X 服务器。Xnest 是真实 X 服务器的客户端,但也是其自身客户端的服务器。Xnest 通常用于允许同时在两个或多个桌面上工作,但是,我们对其代码进行了修改,使它能够用于实现多终端系统。
该系统以以下方式工作。只运行一个“真实”的 X 服务器,配置为使用多个屏幕,每个屏幕都与一个显卡相关联。X 启动后,每个屏幕中都会运行一个 Xnest。每个用户将以透明的方式使用一个 Xnest。
原始 Xnest 从其父 X 服务器获取输入设备事件。但是,为了允许 Xnest 用于多终端,我们必须修改其源代码,使其直接从内核事件接口读取事件,绕过 X。
这种方法的最大优势是可以使用任何组合的显卡创建多终端,只要这些显卡受 X 支持即可。
确保您的内核已编译了 evdev 支持。
此外,安装 udev,它提供了动态 /dev 目录,根据连接的设备进行更新
apt-get install udev
Udev 需要内核 2.6.12 或更高版本。
现在,您需要检查您的输入设备(鼠标和键盘)是否已被内核正确检测到。为此,请分析文件 /proc/bus/input/devices,该文件显示有关内核检测到的输入设备的详细信息。
下面显示了此文件的示例。只有两个字段是相关的:每个设备的名称,显示在以“N: Name=”开头的行中,以及与每个设备相关的文件的名称,显示在以“H: Handlers”开头的行中。
I: Bus=0011 Vendor=0001 Product=0001 Version=ab41 N: Name="AT Translated Set 2 keyboard" P: Phys=isa0060/serio0/input0 H: Handlers=kbd event0 B: EV=120013 B: KEY=4 2000000 3802078 f840d001 f2ffffdf ffefffff ffffffff fffffffe B: MSC=10 B: LED=7 I: Bus=0011 Vendor=0002 Product=0005 Version=0000 N: Name="ImPS/2 Generic Wheel Mouse" P: Phys=isa0060/serio1/input0 H: Handlers=mouse0 event1 B: EV=7 B: KEY=70000 0 0 0 0 0 0 0 0 B: REL=103 I: Bus=0003 Vendor=0a81 Product=0101 Version=0110 N: Name="CHESEN USB Keyboard" P: Phys=usb-0000:00:10.2-1/input0 H: Handlers=kbd event2 B: EV=120003 B: KEY=10000 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe B: LED=7 I: Bus=0003 Vendor=0a81 Product=0101 Version=0110 N: Name="CHESEN USB Keyboard" P: Phys=usb-0000:00:10.2-1/input1 H: Handlers=kbd event3 B: EV=3 B: KEY=1f 0 20000 3878 d801d101 1e0000 0 0 0 I: Bus=0003 Vendor=04fc Product=0013 Version=06b0 N: Name="USB OpticalWheel Mouse" P: Phys=usb-0000:00:10.2-2/input0 H: Handlers=mouse1 event4 B: EV=7 B: KEY=70000 0 0 0 0 0 0 0 0 B: REL=103
请注意,该文件似乎表明存在 3 个键盘,尽管实际系统只有两个。这是因为许多 USB 键盘都有特殊按键(例如,用于控制多媒体或访问互联网),这些按键会被内核检测为第二个键盘,其物理地址以“input1”结尾。您只需要配置主键盘,其物理地址以“input0”结尾。
给出的示例显示了 2 个“主”键盘的存在,分别与文件 /dev/input/event0 和 /dev/input/event2 相关联,以及 2 个鼠标,分别与文件 /dev/input/event1 和 /dev/input/event4 相关联。
我们将介绍使用 Xorg 配置多终端所需的步骤,但也可以使用 XFree86,只需做很少的更改。要在 Debian Sarge 上安装 XOrg,请执行以下操作
1. 备份并删除文件 /etc/init.d/xfree-common。2. 在文件 /etc/apt/sources.list 中添加以下行
deb http://people.debian.org/~nobse/xorg-x11/ sarge main deb-src http://people.debian.org/~nobse/xorg-x11/ sarge main
3. 安装 xserver-xorg 软件包
apt-get update apt-get install xserver-xorg apt-get upgrade
1. 下载 multiXnest 二进制文件(版本 0.1.3)此处。该二进制文件应放在目录 /usr/local/bin 中。您可以下载 Xnest 的补丁(来自 Xorg 6.8.2)此处。2. 下载运行 Xnest 所需的包装器脚本:multiXnest.sh。该脚本必须复制到 /usr/sbin 中。
要使用 N 个终端配置多终端,请编辑文件 /etc/X11/xorg.conf,并执行以下操作
1. 定义一个具有 N 个屏幕的布局。
Section "ServerLayout"
Identifier "Layout"
Screen "Default Screen 1"
Screen "Default Screen 2" Below "Default Screen 1"
Screen "Default Screen 3" Below "Default Screen 2"
.
.
Screen "Default Screen N" Below "Default Screen N-1"
InputDevice "Generic Keyboard 1"
EndSection
2. 每个显卡定义一个 Device Section
Section "Device"
Identifier "Video Card 1"
Driver "sis"
BusID "PCI:0:5:0"
Screen 0
EndSection
#
# Change the video card driver and the BusID according to you hardware.
#
# The BusID option identifies your video card. To obtain the BusIDs of your video cards,
#use the command "lscpi | grep VGA".
# Beware: the lscpi command shows address in hexadecimal, while X expects decimal numbers.
#The command "echo $((0xHEX_NUMBER))" is your friend.
.
.
.
Section "Device"
Identifier "Video Card N"
Driver "sis"
BusID "PCI:0:6:0"
Screen 0
EndSection
3. 定义 Monitor Sections。
Section "Monitor"
Identifier "Monitor 1"
HorizSync 30-71
VertRefresh 50-160
Option "DPMS"
EndSection
.
.
.
Section "Monitor"
Identifier "Monitor N"
HorizSync 30-71
VertRefresh 50-160
Option "DPMS"
EndSection
4. 定义 Screen Sections
Section "Screen"
Identifier "Screen 1"
Device "Video Card 1"
Monitor "Monitor 1"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
.
.
.
Section "Screen"
Identifier "Screen N"
Device "Video Card N"
Monitor "Monitor N"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
5. Xorg.conf 应该只有一个 keyboard 部分,如下所示
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
EndSection
鼠标部分可以删除,建议这样做,但您必须在 ServerFlags 部分添加 AllowMouseOpenFail 选项,如下所示,否则 X 服务器将无法启动。
6. 确保 ServerFlags 部分具有以下选项
Section "ServerFlags"
...
# These options keep the X Server from entering in power saving mode:
Option "BlankTime" "0"
Option "StandbyTime" "0"
Option "SuspendTime" "0"
Option "OffTime" "0"
# Allow the server to start without mouse
Option "AllowMouseOpenFail" "yes"
# Disable VT Switching
Option "DontVTSwitch" "yes"
# This disallows the use of the Ctrl+Alt+Backspace sequence
Option "DontZap" "yes"
...
EndSection
现在需要为每个 multiXnest 创建一个 XKB 配置文件。第一个 multiXnest 的 XKB 配置应放置在文件 /usr/X11R6/lib/X11/xkb/X1-config.keyboard 中,第二个 multiXnest 的 XKB 配置应放置在文件 /usr/X11R6/lib/X11/xkb/X2-config.keyboard 中,依此类推。您可以在下面看到一个 XKB 配置文件的示例。
rules = "xorg"
model = "pc105"
layout = "us"
最后一步是配置登录管理器以启动主 X 服务器,并运行将打开 Xnest 的包装器脚本。我们将解释如何在 GDM 上执行此操作,但其他管理器(如 XDM 和 KDM)可以通过类似的方式进行配置。
在服务器部分编辑文件 /etc/X11/gdm.conf,添加以下内容
[servers]
0=Hardware
# Hardware is the main X server
1=multiXnest1
2=multiXnest2
3=multiXnest3
.
.
N=multiXnestN
[server-Hardware]
name=Hardware
command=/usr/X11R6/bin/X
handled=false
flexible=false
[server-multiXnest1]
name=multiXnest1
command=/usr/sbin/multiXnest.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -geometry 1024x768+0+0
-kbd /dev/input/event0 -ptr /dev/input/event1 -dpi 92
handled=true
flexible=false
#
# The options -kbd and -ptr identify, respectively, to which keyboard and which mouse the Xnest will be associated.
#
# multiXnest.sh is the wrapper that runs Xnest server.
.
.
.
[server-XnestN]
name=XnestN
command=/usr/sbin/multiXnest -display :0.N -xauthority /var/lib/gdm/:0.Xauth -geometry 1024x768+0+0
-kbd /dev/input/eventXX -ptr /dev/input/eventYY -dpi 92
handled=true
flexible=false