多座配置/faketty
本文介绍了 **使用 Faketty 的多终端** 的工作原理以及如何实现。它使用 Aivils Stoss 开发的 faketty 模块,并且不使用 evdev 协议或内核补丁。它是创建 多终端 的最著名方法之一。
本文介绍了使用 faketty 模块配置多终端系统所需的步骤。faketty 是由 Aivils Stoss 开发的内核模块,它将系统键盘与名为 /dev/fttyXX 的设备文件关联起来(其中 XX 是一个标识键盘的数字),X 使用这些文件读取键盘事件。该模块使用 X 通常用于从键盘读取事件的相同协议,即 TTY 协议,它省略了 evdev 的使用。这种方法的另一个优点是不需要对内核进行任何修补。
缺点是,这种解决方案需要编译一个内核模块,而且这种方法只在少数显卡组合中运行良好(稳定)。
Debian Sarge(您也可以使用其他 GNU/Linux 发行版,只需进行少量更改)
显卡
- 4 块 SiS 315 显卡(也可以是其他卡,但并非所有卡都受支持)。
键盘和鼠标
- 1 个 PS/2 键盘
- 1 个 PS/2 鼠标
- 3 个 USB 键盘
- 3 个 USB 鼠标
有必要安装 udev,它根据连接的设备提供动态更新的目录 /dev。
apt-get install udev
udev 需要内核 2.6.12 或更高版本。
确认您已安装内核(正在使用)的标头。如果您使用的是 Debian,请执行以下命令
apt-get install linux-headers-$(uname -r)
下一步是为您的内核编译 faketty 模块。您可以在此处找到模块源代码: http://www.ltn.lv/~aivils/files/faketty-0.05.tar.bz2
(注意:faketty 的新版本可从 http://www.ltn.lv/~aivils/files/faketty-0.06.tar.bz2 获得,如果您在使用旧版本时遇到任何问题,请尝试使用它)最近是这个版本 http://www.ltn.lv/~aivils/files/faketty-2.6.30.tar.bz2。适合内核 > 2.6.23
解压缩文件,并在包含 "Makefile" 文件的目录中执行以下命令来编译和安装模块
make && make install
要加载内核模块,请执行以下命令
modprobe faketty
有必要检查 /proc/bus/input/devices 文件,以了解每个键盘与哪个 ffty 文件关联。下面显示了 /proc/bus/input/devices 文件的示例
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 ftty1 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 ftty2 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 ftty3 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
您可以注意到显示了三个键盘,其中第一个与 /dev/ftty1 文件关联,第二个与 /dev/ftty2 文件关联。与 input0 不同,其 "P: Phys" 属性以 input1 结尾的键盘(如该文件的第三个键盘),应该重新考虑,因为它指的是某些键盘的特殊键和特殊功能。
您还可以看到示例文件中存在两个鼠标,它们分别与 /dev/input/mouse0 和 /dev/input/mouse1 关联。
X 在初始化时,会打开 /dev/ttyXX 文件来读取键盘事件,其中 XX 是 X 作为参数接收的 VT(虚拟终端)编号。由于无法请求 X 打开其他文件,因此有必要将 /dev/ttyXX 文件链接到 /proc/bus/input/devices 文件中指示的 ftty 文件。在下面的示例中,我们创建了 4 个链接,每个键盘一个,从 /dev/tty50 文件开始。
rm -f /dev/tty5[0-3] ln -s /dev/ftty1 /dev/tty50 ln -s /dev/ftty2 /dev/tty51 ln -s /dev/ftty3 /dev/tty52 ln -s /dev/ftty4 /dev/tty53
1. 将以下行添加到 /etc/apt/sources.list 文件中
deb http://www.winischhofer.net/sis/debian/stable ./
2. 更新系统软件包信息并安装 x-driver-sis 驱动程序
apt-get update apt-get install x-driver-sis
安装 hotplug 软件包
apt-get update apt-get install hotplug
下一步是安装 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
此配置将在多终端运行期间使用。在此文件中,将根据我们配置的终端数量创建额外的节。对于每个终端,我们将为鼠标、键盘、显卡、显示器、屏幕和布局创建节。例如,在具有四个终端的多终端的情况下,该文件将具有四个鼠标节、四个键盘节,以及依此类推。
每个节中建议的“标识符”值并非强制性。它们可以修改,只要保持所有配置中名称的一致性即可。
每个设备的物理地址(选项“Dev Phys”)可以从 /proc/bus/input/devices 文件中获得,如前所述。
以下是每种类型的部分的示例。
Section "InputDevice"
Identifier "Generic Keyboard 0"
Driver "keyboard"
# The options below are adjusted to a brazilian keyboard
# with cedilha (ABNT2).
Option "XkbRules" "xorg"
Option "XkbModel" "abnt2"
Option "XkbLayout" "br"
Option "XkbVariant" "abnt2"
Option "XkbOptions" "abnt2"
Option "CoreKeyboard"
EndSection
Section "InputDevice"
Identifier "Configured Mouse 0"
Driver "mouse"
# Substitute the value of "Device" option by the correspondent
# mouse file, obtained from /proc/bus/input/devices file
Option "Protocol" "ImPS/2"
Option "Device" "/dev/input/mouse0"
# All mouses should have the "CorePointer" option
Option "CorePointer"
Option "ZAxisMapping" "4 5"
EndSection
Section "Device"
Identifier "Placa de Vídeo Genérica 0"
Driver "sis"
Screen 0
# It's mandatory to explicit the BusID of all cards.
# To obtain it, use "lspci | grep VGA". Be carefull with the values,
# while the address supplied by lspci is in hexadecimal base
# the XOrg wait a decimal value. To convert this, use
# "echo $((0xHEXADECIMAL_VALUE))".
BusID "PCI:1:0:0"
# This option disables the VGA and VBE calls of IRQ 10, to
# prevent that some card intervenes with others. See also the
# "xorg.conf.probe" file.
Option "NoInt10" "Yes"
# This option to sis video cards, prevents problems during alternating between
# virtual terminals or while exiting X server.
Option "RestoreBySetMode" "no"
EndSection
# The values below are default. Maintain the configuration that you normally would use
# to your monitors.
Section "Monitor"
Identifier "Monitor Genérico 0"
HorizSync 30-60
VertRefresh 50-75
Option "DPMS"
EndSection
# The screen configuration below also is illustrative, personalize it
# in accordance with your preferences.
Section "Screen"
Identifier "Default Screen 0"
Device "Placa de Vídeo Genérica 0"
Monitor "Monitor Genérico 0"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Section "ServerLayout"
# The Identifier will be used at the call in command line.
Identifier "Layout0"
Screen "Default Screen 0"
InputDevice "Generic Keyboard 0"
InputDevice "Configured Mouse 0"
Option "SingleCard"
EndSection
除了 xorg.conf 默认文件之外,还需要创建一个第二个配置文件,即 xorg.conf.probe。在使用多终端时,我们将禁用 10 通道(IRQ 10)上的中断,以防止一张卡的 VGA 调用(和 VESA VBE)干扰其他卡。但是,禁用这些调用后,辅助卡将无法初始化。为了解决这个问题,在系统初始化过程中,XOrg 将使用 xorg.conf.probe 文件运行。它将对这些卡的存在进行检查(探测),在测试期间激活 IRQ 10,从而初始化它们。
要创建 xorg.conf.probe,请将 xorg.conf 作为基础,删除与主显卡相关的部分(在启动计算机时由 BIOS 初始化),并将 NoInt10 选项更改为“No”。只需要一个布局,但要包括所有辅助卡。例如,请查看上面从 xorg.conf 派生的 xorg.conf.probe 文件的一些片段。
# At all Device sections (of video cards), change the option
# NoInt10 to:
Option "NoInt10" "no"
# Declare only one layout, and without to use the "SingleCard" option.
# All the secondary screens should be included. The
# screens disposal (LeftOf, etc.) isn't important, so little
# the input devices used.
Section "ServerLayout"
Identifier "probe"
Screen "Default Screen 1"
Screen "Default Screen 2" LeftOf "Default Screen 1"
Screen "Default Screen 3" LeftOf "Default Screen 2"
InputDevice "Generic Keyboard 1"
InputDevice "Configured Mouse 1"
EndSection
为了运行测试(探测),提供了 xorg-multiterminal 文件。它以探测模式(仅测试设备并结束)执行 X 服务器,使用 xorg.conf.probe 文件。如上所述,此步骤会初始化辅助显卡。该文件的内容是
file=/etc/X11/xorg.conf.probe [[ -f "file" ]] && /usr/X11R6/bin/X -config "$file" -probeonly 2>/dev/null
将其保存为可执行脚本,并配置初始化系统以运行它。在 Debian 的情况下,补丁应该是 /etc/init.d/xorg-multiterminal,并且存在两种配置系统的方式
- 通过 update-rc.d 命令。此命令适用于使用系统标准 Debian(sysv-rc)的用户以及使用 file-rc 软件包的用户。
update-rc.d xorg-multiterminal start 70 S .
- 手动
在使用标准初始化方案的 Debian 系统中,创建一个链接
ln -s /etc/init.d/xorg-multiterminal /etc/rcS.d/S70xorg-multiterminal
在安装了 file-rc 软件包的 Debian 系统中,在 /etc/init.d/runlevel.conf 文件中的适当位置添加以下行
70 - S /etc/init.d/xorg-multiterminal
最后一步是配置登录管理器以初始化所有 X 服务器。我们将只处理 GDM。其他管理器,如 XDM 和 KDM,可以通过类似的过程进行配置。
需要编辑 /etc/gdm/gdm.conf 文件的“[servers]”部分,使其包含多个输入,例如以下示例中的四个终端
[servers]
0=XServer0
1=XServer1
2=XServer2
3=XServer3
服务器名称是任意的,但需要为每个服务器添加一个部分,其中包含以下内容
[server-XServer0]
name=Standard server
command=/usr/X11R6/bin/X -br -audit 0 -layout Layout0 :0 vt50
flexible=true
[server-XServer1]
name=Standard server
mmand=/usr/X11R6/bin/X -br -audit 0 -layout Layout1 :1 vt51
flexible=true
[server-XServer2]
name=Standard server
mmand=/usr/X11R6/bin/X -br -audit 0 -layout Layout2 :2 vt52
flexible=true
[server-XServer3]
name=Standard server
mmand=/usr/X11R6/bin/X -br -audit 0 -layout Layout3 :3 vt53
flexible=true
请注意,四个服务器分别使用 50、51、52 和 53 VT。因此,X 服务器将使用 /dev/tty50、/dev/tty51、/dev/tty52 和 /dev/tty53 文件来读取键盘事件,这些文件实际上是到 /dev/fttyXX 文件的链接,正如我们之前创建的那样。
可以在 /var/log/Xorg.*.log 文件中分析多终端初始化中的问题。每个终端的 X 服务器将创建其自己的日志文件。