多座位配置/Xephyr
在这里,我们将描述如何使用 Xephyr 创建一个 **多终端系统**。已经有很多种创建 **多终端系统**(也称为 **多座位**)的方法,并且不断有新的方法被开发出来。
这里描述的方法是在 **Xephyr** 上进行修改,使其能够用来实现多终端系统。该系统被配置为运行一个 **X** 服务器来控制所有视频卡,并且每个屏幕运行一个 Xephyr,就像 Xnest 一样,在主 X 服务器之上运行。
虽然正常的 Xephyr 从其父 X 服务器接收事件,但修改后的 Xephyr 现在能够直接从内核事件接口读取输入设备事件。
Debian Etch(但很容易移植到其他 Linux 发行版)。
Xephyr 是一个在另一个 X 服务器中运行的 X 服务器。Xephyr 同时是 X 客户端和 X 服务器。Xephyr 是真实 X 服务器的客户端,但也对其自己的客户端是服务器。Xephyr 通常用于允许同时使用两个或多个桌面。但是,我们已经对其进行了修改,以便使用 Xephyr 来实现多终端系统。
该系统按以下方式工作。只运行一个“真实”X 服务器,配置为使用多个屏幕,每个屏幕都与一个视频卡相关联。X 启动后,在每个屏幕内运行一个 Xephyr。每个用户将以透明的方式使用一个 Xephyr。
原始的 Xephyr 从其父 X 服务器获取输入设备事件。然而,为了让 Xephyr 能够在多终端系统中使用,我们必须修改其源代码,使其能够直接从内核事件接口读取事件,绕过 X。为了读取鼠标和键盘事件,使用了 evdev 协议。
这种方法的巨大优势在于能够使用任意组合的视频卡来创建多终端系统,只要这些视频卡得到 X 的支持。除此之外,Xephyr 比 Xnest 有几个优势:Xephyr 正在维护中,比 Xnest 更快,并且更容易支持 X 扩展的实现。
以下是在使用 XOrg X 服务器配置多终端系统的步骤,尽管可以进行少量修改来使用 XFree86。为了使用 XOrg,您应该使用 Debian Etch 或更高版本,因为 Debian Sarge 没有 XOrg,只有 XFree86。如果您使用的是 Debian Sarge,请按照这些说明将其升级到 Etch。
注意:对于大多数步骤,您需要成为系统根用户。为此,请使用命令“su”,然后输入根用户密码。
1. 将文件 /etc/apt/sources.list 中出现的“sarge”或“stable”改为“etch”,例如:
deb http://ftp.debian.org/debian sarge main contrib non-free
应该变成:
deb http://ftp.debian.org/debian etch main contrib non-free
2. 更新系统并安装 xserver-xorg 包:
apt-get update apt-get upgrade apt-get install xserver-xorg
确保您的内核已编译了 evdev 支持。此外,安装 udev,它提供了一个动态的 /dev 目录,根据连接的设备进行更新。
apt-get install udev
Udev 需要内核 2.6 或更高版本。
现在,您需要检查您的输入设备(鼠标和键盘)是否已被内核正确检测到。为此,请分析文件 /proc/bus/input/devices,该文件显示有关内核检测到的输入设备的详细信息。使用以下命令在终端中查看此文件的内容:
$ cat /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”结尾。因此,将忽略与辅助键盘的物理地址“usb-0000:00:10.2-1/input1”相对应的部分。
给出的示例显示了 2 个“主”键盘,分别与文件 /dev/input/event0 和 /dev/input/event2 相关联,以及 2 个鼠标,分别与文件 /dev/input/event1 和 /dev/input/event4 相关联。这些文件很重要,因为它们用于将多终端系统的每个头与正确的输入设备相关联。
将以下行添加到文件 /etc/ld.so.conf 中:(在 Ubuntu 8.04 中不需要)
/usr/local/lib
之后,运行 ldconfig:
ldconfig
- 从 这里 下载 Xephyr 二进制文件。解压缩到目录 /usr/local。您可以单击 这里 (Xorg 7.2 的较新版本,Xorg 7.3 已经包含了所需的补丁[1]) 查看补丁,但只有在用户要编译时才需要补丁。
- 下载运行 Xephyr 所需的包装器脚本:Xephyr.sh。该脚本必须复制到 /usr/sbin 并具有可执行权限。要授予文件可执行权限,请运行以下命令:
chmod +x /usr/sbin/Xephyr.sh
对于 Ubuntu 8.04,以下命令将安装并更新 Xephyr 二进制文件:
# apt-get install xserver-xephyr
要配置一个具有 N 个终端的多终端系统,请编辑文件 /etc/X11/xorg.conf,并执行以下操作:
1. 定义具有 N 个屏幕的布局。
Section "ServerLayout"
Identifier "Layout"
Screen "Screen 1"
Screen "Screen 2" Below "Screen 1"
Screen "Screen 3" Below "Screen 2"
.
.
Screen "Screen N" Below "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 your hardware.
#
# The BusID option identifies your video card. To obtain the BusIDs of your video cards,
#use the command "lspci | grep VGA".
# Beware: the lspci 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 中已经存在的定义相同,但是请确认 Identifier 与布局部分中定义的 Identifier 相同(“Generic Keyboard”)。这对于让鼠标指向设备 /dev/input/mice 是必要的。
Section "InputDevice"
Identifier "Configured Mouse 1"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "ImPS/2"
EndSection
6. Xorg.conf 应该只有一个键盘部分,如下所示:
Section "InputDevice"
Identifier "Generic Keyboard 1"
Driver "kbd"
EndSection
7. 为了避免因鼠标无法识别而导致 X 服务器初始化出现问题,您可以毫无问题地包含以下部分
Section "ServerFlags"
Option "AllowMouseOpenFail" "yes"
EndSection
Ps:这不会影响多终端,因为键盘/鼠标设备将作为参数传递给 Xephyr。
8. 最后,要禁用 VT 更改和 Ctrl+Alt+Backspace 键,请验证「ServerFlags」部分是否包含以下选项
Section "ServerFlags"
...
# Disable VT Switching
Option "DontVTSwitch" "yes"
# This disallows the use of the Ctrl+Alt+Backspace sequence
Option "DontZap" "yes"
...
EndSection
由于内核进行的输入设备检测(鼠标、键盘)(请参阅“输入设备”部分)并不总是遵循相同的顺序,因此内核可能会在每次初始化时将相同的设备与不同的文件关联,这可能会“打乱”键盘和鼠标。
为了避免这个问题,我们制作了脚本来自动执行鼠标和键盘与其相应显示器的关联过程。您只需要配置一次布局(哪个键盘和鼠标与哪个显示器关联),脚本就会将此“布局”保留在文件 /etc/X11/devices.conf 中。要使用脚本,请执行以下步骤
1. 安装 xdialog 包
apt-get install xdialog
2. 将文件 xkb-evdev.tar.gz 解压缩到目录 /etc/X11。
3. 删除或重命名文件 /etc/gdm/gdm.conf
mv /etc/gdm/gdm.conf /etc/gdm/gdm.conf.backup
[2007 年 11 月 4 日编辑] 也许应该将修改编辑到 /etc/gdm/gdm.conf-custom 文件中,这样就不会被更新覆盖。
4. 解压缩文件 public.tgz 并将文件“configura_layout”和“select.out”复制到目录“/usr/local/sbin”。然后将文件“configuracao_automatica”复制到目录“/etc/init.d”。
5. 配置 configuracao_automatica 以在系统初始化时执行
update-rc.d configuracao_automatica start 70 S .
6. 执行以下命令以配置系统布局。脚本将询问每个显示器的相关问题,以确定哪个键盘和鼠标与哪个显示器关联。
PS:在执行此操作之前,您必须停止“gdm”。以 root 身份登录并输入“/etc/init.d/gdm stop”。
invoke-rc.d configuracao_automatica start
如果文件不存在,脚本将自动生成文件 /etc/gdm/gdm.conf,以及 XKB 配置文件(/usr/X11R6/lib/X11/xkb/XX-config.keyboard)。脚本将在 /dev/input 目录中创建链接,分别命名为 kbd0mt、kbd1mt 等,分别指向第一个终端的键盘、第二个终端的键盘等。脚本还将创建名为 mouse0mt、mouse1mt 等的链接,分别指向第一个终端的鼠标、第二个终端的鼠标等。
回答完问题后,脚本将生成 /etc/X11/devices.conf 文件,其中包含每个终端的鼠标和键盘关联,以及键盘配置(规则、模型、布局)。
另一种获得物理输入设备与事件编号之间正确匹配的方法是修改 Xephyr 包装脚本。包装脚本已修改以从物理设备地址获取事件 ID。您可以在此处查看修改后的脚本:[1]
如果您使用的是“使用脚本”部分中的脚本,请不要执行以下步骤。但是,阅读本节将有助于您了解脚本的工作原理。
为了允许 Xephyr 使用 XKB 扩展,您应该将文件 xkb-evdev.tar.gz 解压缩到目录 /etc/X11。之后,需要为每个 Xephyr 创建一个 XKB 配置文件。第一个 Xephyr 的 XKB 配置应放置在文件 /usr/X11R6/lib/X11/xkb/X1-config.keyboard 中,第二个 Xephyr 的 XKB 配置应放置在 /usr/X11R6/lib/X11/xkb/X2-config.keyboard 中,依此类推。您可以在下面看到一个 XKB 配置文件示例。
rules = "evdev"
model = "pc105"
layout = "us"
最后一步是配置登录管理器以启动主 X 服务器,并运行将打开 Xephyr 的包装脚本。我们将解释如何在 GDM 上执行此操作,但其他管理器(如 XDM 和 KDM)也可以通过类似的方式进行配置。
编辑文件 /etc/X11/gdm.conf 中的 servers 部分,添加以下内容
[servers]
0=Hardware
# Hardware is the main X server
1=Xephyr1
2=Xephyr2
3=Xephyr3
.
.
N=XephyrN
# Xephyr{1..N} is each one of the Xephyr servers
[server-Hardware]
name=Hardware
command=/usr/X11R6/bin/X
handled=false
flexible=false
# The handled=false option hinders the login manager to be loaded on the main X server.
[server-Xephyr1]
name=Xephyr1
command=/usr/sbin/Xephyr.sh -display :0.0 -xauthority /var/lib/gdm/:0.Xauth -geometry 1024x768+0+0
-keyboard /dev/input/event0 -mouse /dev/input/event1,5 -use-evdev -dpi 92
handled=true
flexible=false
#
# The options -keyboard and -mouse identify, respectively, to which keyboard and mouse Xephyr will be associated,
#as seen in the file /proc/bus/input/devices. If the mouse option finishes with ",5", as in
#the example, the mouse wheel will be activated.
#
# Xephyr.sh is the wrapper that runs Xephyr server.
.
.
.
[server-XephyrN]
name=XephyrN
command=/usr/sbin/Xephyr.sh -display :0.(N-1) -xauthority /var/lib/gdm/:0.Xauth -geometry 1024x768+0+0
-keyboard /dev/input/eventXX -mouse /dev/input/eventYY[,5] -use-evdev -dpi 92
handled=true
flexible=false