跳轉到內容

多座位配置/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

[編輯 | 編輯原始碼]

確保您的核心已編譯了 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 安裝

[編輯 | 編輯原始碼]

我們將介紹使用 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

修改後的 Xnest (multiXnest) 下載

[編輯 | 編輯原始碼]

1. 下載 multiXnest 二進位制檔案(版本 0.1.3)此處。該二進位制檔案應放在目錄 /usr/local/bin 中。您可以下載 Xnest 的補丁(來自 Xorg 6.8.2)此處。2. 下載執行 Xnest 所需的包裝器指令碼:multiXnest.sh。該指令碼必須複製到 /usr/sbin 中。

X(XOrg) 配置

[編輯 | 編輯原始碼]

要使用 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

XKB 配置

[編輯 | 編輯原始碼]

現在需要為每個 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"

GDM 配置

[編輯 | 編輯原始碼]

最後一步是配置登入管理器以啟動主 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
華夏公益教科書