Skip to main content

X Window System

· 4 min read
orange
programmer on jvm platform

X Window System(简称X), 因为其最新版本为11, 所以也被称为X11.

这是一个为图形桌面系统设计的规范框架, 涵盖了以下关键功能:

  • 屏幕图像的渲染和显示
  • 鼠标和键盘的交互处理

Linux环境下, X Window System的实现是X.Org.

架构概述

X采用客户端/服务器(C/S)架构, 由X Server和多个X Client组成.
这意味着X ServerX Client可以分别在不同的设备上运行.
常见应用场景如SSH X11 Forwarding, 其中SSH客户端运行X Server , 图形应用则在SSH服务器上运行, 所有图形交互都在SSH客户端完成.

主要组件

X Server

X Server作为桥梁, 连接底层硬件设备和上层X Client, 提供与硬件交互的接口. 硬件设备包括:

  • 鼠标
  • 键盘
  • 触摸板
  • 屏幕

这些设备按功能分为输入设备输出设备.

X Client

X ClientX Server的客户端, 常见的X Client包括:

  • Firefox
  • Chromium
  • Thunderbird

X Window Manager

Window Manager是一个特殊类型的X Client, 负责管理其他Client, 如调整窗口大小和缩放. 常见的Window Manager包括:

  • GNOME
  • KDE
  • XFCE

X Display Manager

X Display Manager负责用户登录控制, 验证用户身份(如用户名和密码或指纹), 并决定是否启动图形系统.

常见的Display Manager包括:

  • GDM
  • SDDM
  • LightDM
  • KDM

启动流程

X的启动入口为startx命令(此命令位于/bin/startx)

#
# This is just a sample implementation of a slightly less primitive
# interface than xinit. It looks for XINITRC and XSERVERRC environment
# variables, then user .xinitrc and .xserverrc files, and then system
# xinitrc and xserverrc files, else lets xinit choose its default.
# The system xinitrc should probably do things like check for
# .Xresources files and merge them in, start up a window manager, and
# pop a clock and several xterms.
#
# Site administrators are STRONGLY urged to write nicer versions.
#

这个命令是对xinit命令的封装, 它会根据X ServerX Client的配置, 启动X ServerX Client.

xinit命令负责初始化X ServerX Client.

X Server

X Server初始化脚本位于/etc/X11/xinit/xserverrc, 内容比较简单, 只是启动X Server.

X Client

X Client初始化脚本位于/etc/X11/xinit/xinitrc(或$HOME/.xinitrc, 取决于用户目录是否有对应文件).
此脚本中负责初始化X Client, 这里要初始化的X Client通常为桌面.

由于发行版的不同, X Client具体逻辑也会不同.

REHL

基于RedHat的发行版, 例如CentOS, 脚本内部调用/etc/X11/xinit/Xclients进行初始化, 在较旧的系统中(CentOS 6.9, CentOS 7.5), 仅支持GNOMEKDE.
如果需要使用其他桌面, 需手动配置此文件, 将PREFERRED变量设置为相应桌面的完整二进制文件路径.

Debian

基于Debian的发行版, 例如Ubuntu, 脚本内部调用/etc/X11/Xsession进行初始化,

在这个脚本中会调用/etc/X11/Xsession.d/目录下的脚本进行初始化, 在/etc/X11/Xsession.d/50x11-common_determine-startup中推断STARTUP变量, 值通常为/usr/bin/x-session-manager

这个文件是一个link, 通过readlink /usr/bin/x-session-manager可以看到link的位置为/etc/alternatives/x-session-manager/etc/alternatives/x-session-manager也是一个link, 通过readlink /etc/alternatives/x-session-manager可以得到最终的link位置, 例如: /usr/bin/startxfce4

最终/etc/X11/Xsession.d/99x11-common_start通过$STARTUP变量启动桌面, 完成图形系统的初始化.

Arch

基于Arch的发行版, 例如Manjaro, xinitrc位于$HOME/.xinitrc,

脚本内部调用/etc/X11/xinit/xinitrc.d目录下的脚本进行初始化.
这个脚本内部的get_session函数用于获取桌面的启动路径, 支持常见的桌面, 例如:

  • awesome
  • bspwm
  • budgie
  • deepin
  • enlightenment
  • fluxbox
  • gnome
  • i3/i3wm
  • jwm
  • kde
  • lxde
  • lxqt
  • mate
  • xfce
  • openbox
  • gnome

通过DEFAULT_SESSION变量可以设置默认的桌面, 此变量默认值为gnome-session

参考资料