X窗口系统(X Window System)是Linux主流使用的图形界面系统,如果准备或者正在使用Linux图形界面,有必要了解一下其基本概念、工作原理和历史。

  • 中文名称:X窗口系统
  • 英文名称:X Window System
  • 英文简称:X
  • 官方网址:https://x.org
  • 介  绍:是一种以像素方式显示的软件窗口系统架构和协议规范。
  • 作  者:Bob Scheifler、Jim Gettys
  • 授权方式:MIT
  • 发布日期:1984年5月
  • 最新版本:X11R7.7

基本概念

X窗口系统经过了将近40年的发展,存在很多技术或非技术的概念让人迷糊,先简单梳理一下:

X窗口系统(X Window System):简称X,诞生于1984年。其存在的作用是允许多个图形应用程序共享一组输入设备(鼠标和键盘)和输出设备(显卡和显示器)。注意X窗口系统仅是一种架构和协议规范,并不是可独立运行的图形软件系统。

X11:X的第11个版本,发布于1987年。此版本主要改善了协议的兼容性,使其获得了广泛应用和厂商支持。

X.org:X11版本的一个开源实现,几乎所有主流Linux发行版都预置了X.org软件安装包。

Freedesktop.org:专注X窗口系统在不同操作系统之间的互操作性和技术共享。互操作性实际上是指制定规范,使所有的软件协调一致地运行,例如自动启动(Autostart)、桌面项(Desktop entries)等。技术共享主要是指开发和代码托管,例如大名鼎鼎的DBus、NetworkManager、fontconfig均托管于此,实际上X.org的源代码也托管在这里。

Cross-Desktop Group(XDG):常出现在Freedesktop.org的规范中,用于规定跨软件通用的变量和配置等。例如:基本目录(basedir)规范中定义了环境变量XDG_CONFIG_HOME表示用户配置文件主目录。

扩展窗口管理器提示规范(EWMH):此规范定义了窗口管理器、合成管理器和应用程序之间的交互。例如:要读取一个软件运行实例的名称怎么办呢?只要遵循此规范中定义的名为_NET_WM_NAME通用窗口属性就可以了。

工作原理

Linux GUI Window System

图1: X窗口系统架构

X基于C/S模型,其核心组件是X服务(X Server)和X库(X Library)。X服务通过设备库(Device Library)输出显示和回传输入,并多路复用给所有X客户应用程序。X客户应用程序是指具体的图形应用程序,通过X库与X服务相连,例如窗口管理软件、网页浏览软件和文本编辑软件等都属于X客户应用。

一句话概括就是:X服务是输入输出硬件的控制器,X客户应用实现各种各样的用户功能。 对于使用者最关心的窗口是指屏幕上可以进行绘图的区域。X将窗口以树状层次结构进行组织,就像一张桌子上放了许多书或堆叠或平铺,如下图所示:

Linux GUI Window System

图2: X窗口组织结构

上图中1是根窗口,与整个屏幕对应;2和3是顶层窗口;4和5是2的子窗口。超出父窗口的部分(虚线)不会显示出来。

特点

  • 支持广泛的硬件平台和操作系统
  • 网络协议透明性
  • 版本向后兼容,具有扩展性

局限

  • 开源驱动质量参差不齐,需要额外安装厂商提供的闭源驱动
  • 安全性方面,网络连接数据未加密,需要借助ssh软件实现数据加密

体验X.org

本次仅体验X.org,没有任何的窗口管理系统或桌面系统,让读者对X.org有一个完整的视觉感受。

体验的硬件配置是2核心2.1MHz的CPU、2GB内存、10GB磁盘、键盘、鼠标、显示器,操作系统是Fedora。需要先安装好操作系统并登录到终端命令行屏幕。

1、安装X.org


sudo dnf install xorg-x11-server-Xorg \
                 xorg-x11-xinit \
                 xorg-x11-drv-libinput \
                 xorg-x11-drv-qxl \
                 xterm

以上是最小化安装所需核心软件包(dnf会自动安装依赖的其它软件包),xorg-x11-server-Xorg是X服务,xorg-x11-xinit是启动X的辅助程序,xorg-x11-drv-libinput是输入设备驱动,xorg-x11-drv-qxl是输出显示设备驱动,本次试验在qemu虚拟机中进行因此安装qxl显示驱动,读者安装时根据自己显卡类型安装合适驱动,主流的nvidia、amdgpu、ati、intel显卡都有对应的预置安装包,最后那一个软件包xterm是终端模拟器,本次体验用到的图形应用程序。

2、本地运行


xinit

xinit主要干两件事,第一件是启动X服务,第二件是运行~/.xinitrc文件中配置的X客户程序,如果没有配置默认启动xterm。运行顺利的话会看到如下的屏幕界面:

Linux GUI Window System

左上灰色和白色界面区域是xterm终端模拟软件,是顶层窗口。整个黑色窗口包括被xterm遮蔽的部分是根窗口,根窗口在启动X服务时创建。

此时可以在xterm中运行命令,或者启动另一个X客户应用程序。但是无法移动、调整窗口,如果存在多个窗口的话也不能调整窗口堆叠顺序。要实现这样的功能有两种方式,第一种方式安装窗口管理软件或桌面系统,另一种方式是在X客户应用程序中开发实现。

X服务运行资源使用情况:


 PID USER PR NI   VIRT   RES   SHR S %CPU %MEM   TIME+ COMMAND
8866 root 20  0 111.1m 17.4m 11.6m S  0.3  0.9 0:02.28 /usr/libexec/Xorg :0

可以看出X服务运行时占用资源非常少(CPU 0.3%,内存 0.9%),可以留下大部分资源运行用户应用程序。

3、远程运行

这种方式的优点是只要远程主机中安装有需要运行的X客户应用程序,就可以将其输入输出重定向到本机,达到远程运行本地输入输出的目的。

出于安全考虑,默认未开启远程端口,需要手工增加参数-listen启动X服务:


xinit -- -listen tcp

启动后默认监听6000端口。注意,对于“远程运行”模式,本机是X服务端,远程主机是X客户端。要运行远程主机的程序,需要先通过ssh登录到远程主机:

ssh -X vm @ 192.168.122.250

这里的-X参数表示启用“远程运行”模式,也就是远程主机会连接到本机X服务监听的6000端口。登录远程主机成功后,启动仅在远程主机安装的galculator计算器软件:


galculator

成功运行之后效果如下:

Linux GUI Window System

可以看到在本机出现了计算器软件的界面,显示效果和操作与本机运行无异。

结语

在了解了X窗口系统的工作原理之后,可以更容易地找出需求的解决办法,例如:不喜欢根窗口那个黑色背景,只需要通过工具软件或编程给根窗口填充一张漂亮的图片即可。

如果仅仅安装X.org,还无法满足日常图形界面操作的所有需求,但可以满足例如POS机、展示机和服务台这样只需要启动固定应用程序的应用场景,以实现尽可能地节约资源,如果能合理利用远程运行也可以降低系统维护成本。