Peter_Matthew的博客

【转载】X Window系统简明介绍

2018-10-16


X Window系统简明介绍


声明:本文为转载文章,转载自洛谷日报#72,原作者为尘息。


你能在本文学到什么

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

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

**注意:本文大部分命令需要root权限,请用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

## 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服务器地址]:[显示界面号]``` 即可。

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

![鸟哥的Linux私房菜 23.1.1](http://linux.vbird.org/linux_basic/0590xwindow//x_ser_cli.gif)

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

### 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、KFCE、Unity、twm等。X不需要X窗口管理器也能正常运作。X窗口管理器提供以下功能:
1. 提供各种~~奇奇怪怪~~的主题样式给X服务器;
2. 管理虚拟桌面(Virtual Desktop);
3. 提供窗口管理工具,还有类似Dock、任务栏之类的东西;
4. 提供X客户端的各种参数,窗口大小等等的数据;

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

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

![只有X](http://linux.vbird.org/linux_basic/0590xwindow//centos7_xwin_test_4.jpg)

### 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):
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS)
- 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11控制台,登陆后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

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

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

DISPLAY

我们在桌面环境运行shell,输入

1
2
3
4
5

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

### startx与xinit
`startx`、`xinit`和`X`(本体)均是启动X的方式,理论上`startx`是`xinit`的壳子,而`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

X客户端:

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

无参数则直接执行xterm

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

xterm

至此,你可以自己尝试从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则是已有的往后推。

你学到了什么

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

  • X是什么,X Window系统分为什么
  • X服务器和客户端扮演着怎样的角色
  • X使用明文or密文传输
  • 如何防止隔壁老王偷窥
  • 学会如何从tty启动X
  • 学会显示界面号和监听端口的关系
  • 还有更多

参照

X窗口系统-维基百科
鸟哥的Linux私房菜 第二十三章、X Window 设置介绍

版权声明

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

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章