X窗口系统(X Window System),也叫 X11,或简称为 X。X窗口系统分为几个关键组件:显示管理器(display manager),主要任务是验证用户身份,并由启动脚本启动一个初始的环境,还要启动 X服务器 和 窗口管理器(window manager)。
X服务器 定义了抽象接口可以访问系统的位图化显示设备和输入设备。窗口管理器 可以让用户移动、缩放窗口,还可以管理多个独立的虚拟桌面。
最底层,应用软件被链接到一个widget库,这个库实现了上层用户界面的各种机制,如按钮和菜单。
这种服务器的设计可以原生的支持远程桌面,而且还可以允许服务器支持各种不同的窗口管理器和widget库。
25.1 X 显示管理器
显示管理器要启动初始环境,可以通过图形化的登录界面,也可以通过命令行直接启动。常见的显示管理器包括:xdm(X display manager)、gdm(GNOME display manager)、kdm(KDE display manager)。
/etc/X11
下有存放xdm、gdm或者kdm配置文件的子目录,这些配置文件规定了显示管理器该怎样运行。显示管理器最后的任务是执行一般在 /etc/X11
下的脚本 Xsession
,这个脚本建立起用户的桌面环境,是系统级的启动脚本。然后执行用户个人的启动脚本 ~/.xession
,进而启动窗口管理器,任务栏,帮助程序等。
当执行完 ~/.xsession
之后,用户就被退出系统(如果 ~/.xsession
里所有的命令都在后台执行,那么这个脚本会立即结束,于是用户在刚登陆之后立即又被退出系统),所以一般最后一个执行的程序是窗口管理器,保持在前台避免退出系统。
25.2 运行一个X应用程序
25.2.1 环境变量 DISPLAY
X应用程序通过查询环境变量 DISPLAY 的值,才知道到哪里显示自己。这个变量包括服务器的主机名或者IP地址、显示号(标识要连接上的一个具体的X服务器实例),还有一个可选的屏幕号(用于有多个显示器的情况)。
# 把X应用程序指向了主机servername.domain.com,显示10和屏幕2.
DISPLAY=servername.domain.com:10.2;
25.2.2 客户机身份认证
基本思想为,在登陆过程一开始的时候,X显示管理器生成一个随机数,叫做一个 cookie
,这个服务器的cookie被写到该用户的主目录下,一个叫做 ~/.Xauthority
的文件里。
任何客户端程序,只要知道这个 cookie
,就会得到允许,可以连接该服务器。用户可以运行 xauth
命令查看已有的cookie,还可以向这个文件添加新的cookie。
要把X应用程序显示到旁边的机器上,可以执行:
xprogram -display server:0
# 如果没有正确的cookie,就会显示如下:
Xlib: connection to "server:0.0" refused by server
xprogram: unable to open display 'server:0'
使用 xauth list
命令查看服务器上的 cookie
,服务器上的每个网络接口都有一个 cookie
,将服务器上的 cookie
,用 xauth add
命令添加到客户机上,就能远程显示了。
25.2.3 用SSH转发X连接
一般情况下,是从运行 X服务器 的机器,通过 ssh 登录到想要运行 X应用程序 的机器上。DISPLAY
变量和验证信息由 ssh 自动设置。显示号从 :10.0 开始,每增加一条转发 X流量 的 ssh 连接,这个值就加1。
ssh 转发 X11应用程序 的流量,必须在 ssh 的服务器和客户端都启用 X转发功能,而且客户机依然必须要有x服务器正确的 cookie。
25.3 配置 X服务器
Xorg 的配置文件一般可以在 /etc/X11/xorg.conf
找到。有几个程序能够帮助用户配置 X (如,xorgconfig)。
可以运行 Xorg-probeonly
命令查看输出的显示卡芯片组和其它探测到的值(虚拟机的Ubuntu 22.10上并没有这个命令)。可以运行 Xorg -configure
命令,让服务器根据探测到的值创建一个初始的配置文件。
xorg.conf
文件的内容被组织成几段,每一段配置以关键字 Section
开头,以 EndSection
结尾。
xorg.conf
文件的配置段:
配置段 | 说明 |
---|---|
ServerFlags | 列出一般性的 X 服务器配置参数 |
Module | 指定为加速图形显示、平滑字体等功能而动态加载的扩展模块 |
Device | 配置显卡、驱动程序和硬件信息 |
Monitor | 描述显示器的物理参数,包括刷新率和显示分辨率 |
Screen | 把一台显示器和一个显卡(Device)联系起来,规定在该配置中能采用的分辨率和颜色深度 |
InputDevice | 指定输入设备,如键盘和鼠标 |
ServerLayout | 把输入设备绑定到一组屏幕上,并且定出屏幕彼此之间的相对位置 |
一台物理上的显示器(Monitor)加一块显卡(Device)就构成了一个屏幕(Screen)。一组屏幕(Screen)再加上若干输入设备(InputDevice)就构成了一个服务器布局(ServerLayout)。
25.3.1 Device段
一个 Device 段描述一块特定的显卡。必须提供一个字符串来标识这块显卡,还要给它提供一个正确的驱动程序。只有当相应的 Section 段用到这个设备的时候,才加载这个驱动程序。典型的 Device 段可能像下面这个样子:
Section "Divice"
Identifier "Videocard0"
Driver "radeon"
option value
...
EndSection
25.3.2 Monitor段
Monitor 段描述连接到计算机的显示器。它能够指定详细的刷新率。对于比较老的硬件来说,需要有刷新率的信息,但是现在的显示器大都可以通过探测得到这个值。典型的 Device 段可能像下面这个样子:
Section "Monitor"
Identifier "ViewSonic"
Option "DPMS"
HorizSync 30-65
VertRefresh 50-120
EndSection
和所有配置段一样,Identifier 行给显示器分配一个名字,以后可以用这个名字来代表这台显示器。我们在这里打开了DPMS(Display Power Management Signaling,显示器电源管理)功能,所以当我们偷偷离开去吃点心喝咖啡的时候,X服务器会关闭显示器的电源。
HorizSync 和 VertRefresh 两行只适用于CRT显示器,它们应该填上显示器的正确值。这两个值可以用频率范围或者逗号隔开的多个频率值来指定。
理论上,驱动程序可以探测到它所支持的显示器型号的值,但是指定这两个参数可以避免驱动程序使用不支持的频率。
25.3.3 Screen 段
Screen 段把一个设备(显卡)联系到一台显示器,这台显示器有特定的颜色深度和特定的一组显示分辨率。下面的例子使用了上面提到的显卡和显示器。
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
Monitor "ViewSonic"
DefaultDepth 24
Subsection "Display"
Depth 8
Modes "640x400"
EndSubsection
Subsection "Display"
Depth 16
Modes "640x400" "640x480" "800x600" "1024x768"
EndSubsection
Subsection "Display"
Depth 24
Modes "1280x1024" "1024x768" "800x600" "640x400" "640x480"
EndSubsection
EndSection
同样,Identifier 配置了屏幕的名字,并且提到了前面定义的显卡和显示器。这段配置里,有配置子段,为每一种颜色深度定义了一个子段,默认子段用 DefaultDepth 指定。
一个 X服务器 的实例只能以一种颜色深度来运行。X服务器 在的启动的时候要判断该颜色深度所支持的分辨率。
25.3.4 InputDevice段
每个设备有自己的 InputDevice 段,所有的设备都可以在配置文件中定义,但是只会使用在 ServerLayout 段中指出的那些设备。
# 一个键盘,AutoRepeat 选项指出一个键需要按下多久才开始重复,以及重复的速度有多快
Section "inputDevice"
Identifier "Generic Keyboard"
Driver "keyboard"
Option "AutoRepeat" "500 30"
Option "XkbModel" "pc104"
Option "XkbLayout" "us"
EndSection
# 一个鼠标,CorePointer 选项把这个鼠标指定为系统首要的指示设备。和这个鼠标关联的硬件文件用一个 Option 来指定。
# 通信协议(protocol)取决于具体的鼠标品牌、鼠标的功能、以及鼠标的接口。可以把它设置为 auto,这样服务器会尝试替用户检测用什么协议。如果鼠标滑轮不工作,那么试试协议改为 IMPS/2。如果鼠标有好几个按键,那么可以试试用 ExplorerPS/2 这个协议。
# Emulate3Buttons 这个选项通过定义同时点鼠标双键等于点鼠标中键的方式,让一个双键鼠标去模拟一个三键鼠标。
# 有时候需要 ZAxisMapping 这个选项,以便支持滚轮或者游戏杆设备。
Section "inputDevice"
Identifier "Generic Mouse"
Driver "mouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "IMPS/2"
Option "Emulate3Buttons" "off"
Option "ZAxisMapping" "4 5"
EndSection
常见的鼠标设备文件:
操作系统 | 设备文件 |
---|---|
Linux | /dev/input/mice |
Solaris | /dev/mouse |
HP-UX | /dev/deviceFileSystem/mouseMux |
AIX | /dev/mouse0 |
25.3.5 ServerLayout 段
ServerLayout 段是配置的最高层结点。这段配置把其它所有配置段结合到一起,用来表示一个 X 显示(display)。它把一组屏幕(screen)和这个布局关联起来。如果多个显示器分别连接到不同的显卡上,那么在指定每个屏幕的同时,还可以带一些可选的方向说明,表明这些屏幕在物理上是怎样摆放的。本例中,屏幕1(Screen1)在左边,而屏幕2(Screen)在右边。
# 有些显卡能够一次驱动多台显示器,这种情况下,在ServerLayout 段只能指定一个Screen。
Section "ServerLayout"
Identifier "Simple Layout"
Screen "Screen 1" LeftOf "Screen 2"
Screen "Screen 2" RightOf "Screen 1"
InputDevice "Generic Mouse" "CorePointer"
InputDevice "Generic Keyboard" "CoreKeyboard"
Option "BlankTime" "10" # Blank the screen in 10 minutes
Option "StandbyTime" "20" # Turn off screen in 20 minutes(DPMS)
Option "SuspendTime" "60" # Full hibernation in 60 minutes(DPMS)
Option "OffTime" "120" # Turn off DPMS monitor in 2 hours
EndSection
25.3.6 xrandr: X 服务器的配置工具
XRandR(X Resize and Rotate Extension)可以让客户机动态的改变其X服务器屏幕的大小,方向和倒影。xrandr
是这一扩展功能的命令行工具。
当然可以手动调整 xorg.conf
文件,但是使用xrandr可以极大的提高效率。不带参数的运行 xrandr
的话,它会显示可用的显示及可能的分辨率。
可以给每个显示指定要用的分辨率,还有该显示相对于其它显示的摆放位置。例如:
xrandr --auto --output VGA-0 --mode 800x600 --right-of DVI-0
参数 --auto
打开所有可以用的显示器。 --output
和 --mode
两个参数把 VGA 的显示分辨率设为 800x600,
--right
这个参数指定 VGA 显示器在物理上位于 DVI 显示器的右边。
如果想让 xrandr
在启动 X服务器 之后自动运行,可以把这条命令放到自己的 ~/.xprofile
文件里,X服务器在启动的时候会执行这个文件。
25.3.7 内核模式设定
为了更好的显示效果,现在设定图形显示的初始模式这一责任,通过KMS(kernel mode setting,内核模块设定)落到了Linux内核身上。
显卡的配置文件在 /etc/modprobe.d
这个目录下,通过这些配置文件的设定,就可以启用或者禁用KMS。
25.4 故障排查和调试
25.4.1 X的特殊键盘组合
Control + Alt + (F1-F6)
,X服务器会进入基于文本 的虚拟终端。
如果监视器和显卡的视频信号不同步,那么就要试着修改屏幕的分辨率。配置文件中 Screen 段可以设置分辨率,默认使用激活的 Modes 行中的第一个显示分辨率。可以使用 Control + Alt + (+/-)
来切换分辨率。
按下 Control + Alt + Backspace
会立即杀死X服务器。
如果从一个主控台运行了 X服务器,当服务器退出时,就会发现自己返回到了主控台。
如果是一个显示管理器启动了 X服务器,当服务器退出时,会重新派生出一个新的服务器,再次提示输入登录名和口令。
25.4.2 X服务器出问题
进入终端之后就能调查 X服务器到底出了什么问题,X服务器的日志偶尔能在 虚拟终端1(Control + Alt + F1
) 上看到。最常见的是日志被记录在 /var/log/Xorg.0.log
这样的日志文件中。
日志的每一行开头都有一个特征分类符号:出错(EE)、警告(WW),还能判断出 X服务器如何找到每一种信息:通过默认配置(==)、在一个配置文件里(**)、自动检测到的(–)、由X服务器的命令行指定的(++)
根据日志的报错修复 X服务,当X启动并运行之后,就可以使用 xdpyinfo
命令获得更多有关 X服务器配置的信息。
25.5 桌面环境简述
25.5.1 KDE
KDE代表 K Desktop Environment(K桌面环境),用C++语言编写,在Qt工具集库上构建的环境。比较漂亮,热衷于全方位定制自己环境的用户最喜欢这个桌面。为KDE编写的应用程序几乎总在名字里面有个字母 K。
KDE支持一套全面的开发工具,其中包括一个集成开发环境(IDE)。
25.5.2 GNOME
GNOME用C语言编写,基于GTK + widget库的另一种桌面。没有KDE那么花哨,也没有KDE配置性强。大多数Linux发行版使用GNOME作为自己默认的桌面。