X Window系统简明介绍

尘息Dust

2018-08-24 11:38:23

Tech. & Eng.

勘误:

2018.10.17 经评论区指正,原KFCE已改为Xfce

感谢提出问题的同学(已解决)

你能在本文学到什么

首先声明一下,这是一篇蒟蒻中的蒟蒻——我一时灵感来临写的QwQ。如果你有什么不懂的问题以及本文的错误可以在下方评论,或私信我,不保证什么都懂,更多请参阅Google。

本文主旨在于学习关于X的理论知识以及其启动过程,帮助各位在Linux GUI开发中打下基础。本文属于知识框架型,部分内容非特别细致,还需劳烦各位感兴趣的使用搜索引擎。望各位喜欢!

注意:本文大部分命令需要root权限,请用sudo或在root下执行!

X是什么

X Window系统(X Window System,也常称为X11或X)是一种以位图方式显示的软体视窗系统。最初是1984年麻省理工学院的研究,之后变成UNIX、类UNIX、以及OpenVMS等操作系统所一致适用的标准化软体工具套件及显示架构的运作协定。X Window系统透过软体工具及架构协定来建立作业系统所用的图形用户界面,此后则逐渐扩展适用到各形各色的其他作业系统上。现在几乎所有的作业系统都能支援与使用X。更重要的是,今日知名的桌面环境——GNOME和KDE也都是以X Window系统为基础建构成的。

由于X只是工具套件及架构规范,本身并无实际参与运作的实体,所以必须有人依据此标准进行开发撰写。如此才有真正可用、可执行的实体,始可称为实现体。目前依据X的规范架构所开发撰写成的实现体中,以X.Org最为普遍且最受欢迎。X.Org所用的协定版本,X11,是在1987年9月所发布。而今最新的参考实作(参考性、示范性的实作体)版本则是X11 Release 7.7(简称:X11R7.7),而此专案由X.Org基金会所领导,且是以MIT授权和相似的授权许可的自由软体。

——引自维基百科

总而言之,如果你在使用*nix系统的桌面环境,那么你就与X Window系统的关系十分密切,包括Linux。你所使用的桌面环境带有GUI的应用程序的绝大部分都依靠着X Window系统。

注意:不包括直接调用硬件的游戏或软件!

X在经过MIT(麻省理工学院)及各厂商大学等的无数版本迭代后,1987年,X的版本来到了X11,这是一个具有明显进步的版本,并取得了明显成功,几乎后来所有的分支都是基于X11开发的。时至今日,X开发的主导者有MIT、MIT X协会、X协会公司、X.Org、XFree86项目、X.Org基金会等等(依照时间排序),期间有许多授权纠纷等各种各样的问题。为了避免太长不看,此部分感兴趣的可以查看参照中维基百科的条目。

主要部分

X的结构

X采用C/S架构(Client/Server,主从式架构),分为X服务器(X Server)和X客户端(X Client)。与我们的常识稍有不同,X服务器是属于控制方面的,控制显示器、鼠标、键盘等甚至显卡都属于X服务器的职责,显示的内容与X窗口管理器(X Window Manager)却属于X客户端。所以应服务器运行X客户端程序,客户机运行X服务器,正好相反。

X客户端可以通过网络明文与X服务器联系,于是你甚至可以在Windows机器运行X 服务器与Linux机器,我就可以说我的Windows正在运行Linux程序啦(然而是事实可以的)!你只需在准备打开X客户端的终端输入 export DISPLAY=[X服务器地址]:[显示界面号] 即可。

(本图来自鸟哥的私房菜)

为什么我要强调明文呢?明文代表着隔壁老王能很轻松并很清楚地知道你与远程服务器的PY交易在干什么,甚至银行密码等需要键盘输入的东西都能被截获!还可以发起中间人攻击!于是现在你可以通过sshtelnet (这玩意也是明文) 等远程终端进行转发,得到不被老王监控的环境。

X服务器

X服务器作为X的重要部分,掌管着显示图形界面接受用户输入字体渲染的重任,Xorg是一种常见的X服务器。简而言之,其流程如下:

输入

  1. 接受来自用户的信号(鼠标、键盘、触摸屏等);
  2. 通过网络明文传送给X客户端;
  3. 需要时传送给中转单位(ssh等应付加密需求)。

输出

  1. 需要时从中转单位获得信息;
  2. 通过网络明文接收X客户端数据;
  3. 显示X客户端的内容。

很容易就能发现流程基本上是相反的,所以其实X服务器和X客户端是双向、相互依存、不可分割的。

X服务器的硬件决定了图形的渲染,例如:X服务器的显卡没有3D图形加速,那么X客户端就无法使用这项技术了。但是,许多高性能应用及显卡驱动决定直接控制本机显卡,此时X服务端就不会受到这些信息了!

X客户端

X客户端也是X的重要组成部分,每一个需要在X服务器显示的程序都可以称之为X客户端(有时甚至会有许多个!)。

其流程与X服务端相反,不必多说,以免有人说我水文章。X客户端有一个特性,他们之间其实是相互隔离不知道其它X客户端的存在的!好处就是不需要管X服务器的硬件如何、不需要管其它X客户端在干什么,只用管好自己的事就可以了。缺点也很明显,X客户端就不知道有没有其它东西覆盖在自己上面,十分被动,更不要讲什么根据手机壳颜色改变用户主题了(然而可以让X服务器告诉你)

怎么处理这种问题呢,并且窗口全部叠在一起怎么用啊,那么就有了下面这个东西——X窗口管理器(X Window Manager)。

X窗口管理器

X窗口管理器是现代X的控制管理者——但它其实是一种特殊的X客户端!我们常见的X窗口管理器有:GNOME、KDE、Xfce、Unity、twm等。X不需要X窗口管理器也能正常运作。X窗口管理器提供以下功能:

  1. 提供各种奇奇怪怪的主题样式给X服务器;
  2. 管理虚拟桌面(Virtual Desktop);
  3. 提供窗口管理工具,还有类似Dock、任务栏之类的东西;
  4. 提供X客户端的各种参数,窗口大小等等的数据;

借助X窗口管理器,能够提供Linux很多桌面电脑的功能,让Linux也能成为生产力工具。PS:桌面不一定是由X窗口管理器提供的。

(twm窗口管理器,来自鸟哥的Linux私房菜)

X显示管理器

X显示管理器(XDM, X Display Manager)提供显示的第一界面,也就是登录用户的地方。往往有两种方式能在本地计算机启动X——在tty里输入startx或开机后我们看到的登录界面,这就是X显示管理器的作用。常见的有GNOME内置的gdm等。

X终端

X终端(XTerm)就是在X界面中虚拟终端(Virtual Terminal)的一种实现。这一点没什么好说的,就是我们打开的“终端”。

X的启动

下文将会教授X的启动方式和原理,及其相关基础知识。

TTY是什么

TTY原指电传打字机(Teletype),在这里指虚拟控制台,也就是不启动X时的只有文本的界面。Debian系发行版默认开启tty1~tty6六个TTY,你可以使用Ctrl+Alt+F1~F6进行切换。(各发行版会有不同,根据实际操作)

运行级别

Linux拥有7个运行级别(runlevel):

我们启动X便就是从运行级别3启动X服务器,转至运行级别5。

启动X需要在运行级别3(默认),切换运行级别:init [运行级别],查看运行级别:runlevel

DISPLAY

我们在桌面环境运行shell,输入set查看当前变量,可以发现有一个是DISPLAY=:0.0的变量,这决定了当前环境下X客户端在哪个X服务器上显示——这对于想要远程控制的朋友是很重要的(但是本文暂时不讲)。格式是DISPLAY=[主机名]:[显示界面号].[屏幕号]。主机名不需要多讲,可以为IP地址,为空代表本地主机;显示界面号是每个X服务器对应的号码,从0数起;屏幕号正如其名,多数情况不用管,常为0。

PS:在原用户使用xhost +可允许其它用户将X客户端连接原用户的X服务器。

startx与xinit

startxxinitX(本体)均是启动X的方式,理论上startxxinit的壳子,而xinit又是X的壳子。startx能自动帮你读取配置文件的参数。这些参数决定了X服务器的呈现方式DPI显示界面号等,决定了需要启动的X客户端(包括桌面环境)。以下是命令参数:

startx [X客户端参数] -- [X服务端参数]
xinit [X客户端参数] -- [X服务端参数]

是的,这两个命令的参数是一致的,参数各有优先级,如下(顺序排列):

X服务器

  1. 命令后接的参数;
  2. ~/.xserverrc
  3. /etc/X11/xinit/xserverrc

无参数则直接执行X

(只启动X的样式,来自鸟哥的Linux私房菜)

X客户端

  1. 命令后接的参数;
  2. ~/.xinitrc
  3. /etc/X11/xinit/xinitrc

无参数则直接执行xterm

(加上xterm的样式,来自鸟哥的Linux私房菜)

至此,你可以自己尝试从tty启动X了,甚至可以体验自己手动启动X。因篇幅限制,相关参数及更详细的技术细节请查询网络,或自行分析。

显示界面号、tty号和监听端口

假设你是Debian系用户,即默认打开了tty1~tty6,那么就有

第n个 显示界面号 tty号 监听端口
1 0 7 6000
2 1 8 6001
3 2 9 6002
... n 往后推 6000+n

n可以为任意正整数,我也不知道能多大,可在上篇[X服务器参数]中使用-display :n调整显示界面号;端口等于6000+n;tty则是已有的往后推。

你学到了什么

感谢各位看完了本蒟蒻的文章,有意见与建议或是问题的请联系我,我将会解决掉提出的人。你应该能学习到:

参照

版权声明

本作品以 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可