这篇笔记主要介绍如何为 CentOS 安装图形界面。
(@@) ( ) (@) ( ) @@ () @ O @ O @
( )
(@@@@)
( )
(@@@)
==== ________ ___________
_D _| |_______/ \__I_I_____===__|_________|
|(_)--- | H\________/ | | =|___ ___| _________________
/ | | H | | | | ||_| |_|| _| \_____A
| | | H |__--------------------| [___] | =| |
| ________|___H__/__|_____/[][]~\_______| | -| |
|/ | |-----------I_____I [][] [] D |=======|____|________________________|_
__/ =| o |=-~O=====O=====O=====O\ ____Y___________|__|__________________________|_
|/-=|___|= || || || |_____/~\___/ |_D__D__D_| |_D__D__D_|
\_/ \__/ \__/ \__/ \__/ \_/ \_/ \_/ \_/ \_/
图形界面的运行原理
Linux 各类发行版图形界面的理论支持就是大名鼎鼎的 X Window System ,它是基于 Server/Clinet 架构的一套复杂软件,主要的工作组件是 X Server 和 X Client 。
# X Window System 架构:
+----------+ +----------+ +----------+
| Hardware |<------>| X Server |<------>| X Client |
+----------+ +----------+ +----------+
X Window System 的两个主要组件的工作内容如下:
- X Server:和硬件层面对接,从输入设备(键盘,鼠标)获取输入数据并告知 Client ,在输出设备(显示器)上绘制从 Client 获取的绘图数据。
- X Client:从 Server 获取到硬件的输入数据,处理它们得出对应的绘图数据返回给 Server 。
X Server 是相对固定的一套软件,和硬件交互的主要是各类硬件驱动的使用和管理。
而 X Client 就十分地自由,它可以是浏览器,办公软件,播放器等等。一个 X Client 可以认为是图形界面中的一个软件窗口。
我们经常听到的 KDE , GNOME , Xfce 是特殊的 X Client 套件,通常认为是窗口管理器,因为它们可以统筹管理同一界面下的多个 X Client 。
所以如果要为一台机器安装带图形界面的 Linux 系统,我们会需要安装 X Window System 组件以提供 X Server ,然后安装 KDE 这一类特殊的 X Client 套件,组成一套可用的图形界面。
传统 Server/Clinet 架构和 X Window System 架构的区别
传统 Server/Clinet 架构
在传统的 Server/Clinet 架构中,最经典应用应该是 HTTP 服务。
在 HTTP 服务中, Server 一般是运行在远端的 HTTP 服务器,比如 nginx 或者 Apache 。我们在 PC 端向 Server 发起请求, Server 在接受请求后响应并返回数据到 PC 端。
从使用者的视角来看, Client 很好理解,无疑就是自己使用的 PC 设备,而 Server 就是远端提供服务的设备。
X Window System 架构
当一台 Linux 系统的机器运行图形界面时,它的 X Server 和 X Client 都会运行在自己的本地机器上,这种应用情况在传统的 Server/Clinet 架构中比较少。
此外还有一种情况就是和 HTTP 服务类似, X Server 和 X Client 不在同一台机器上运行,而是通过网络通信,但这种 X Window System 应用情况会比较少。
# 运行在网络上的 X Window System 架构:
+----------+ +----------+
| Input | | Input |
+----------+ +----------+
| |
| +---------------------+ |
v | remote workstation | v
+----------+ Network +----------+----------+ Network +----------+
| X Server |<--------->| X Client | X Client |<--------->| X Server |
+----------+ +----------+----------+ +----------+
| | ........... | |
| +---------------------+ |
v v
+----------+ +----------+
| Output | | Output |
+----------+ +----------+
在 X Window System 架构运行在网络上时, X Server 和 X Client 会通过网络传输数据。虽然 X Server 的服务对象依旧是 X Client ,但这时它们是分开在网络的两端的,站在使用者的角度上,远端不再是常见的 Server ,反而是各类 X Client ,它们会去完成软件的数据计算工作。而我们本地设备则成为了 X Server ,管理着本地硬件并且承担绘制图形的工作。
这就是 X Window System 比较特殊的地方,但它本质上还是遵循着 Server 为 Client 提供服务的原则。
使用 CentOS 图形界面
安装本地图形界面
在市面上的不同 Linux 发行版中,在个人用户中比较受欢迎的是 Ubuntu ,但是我个人习惯使用的 Linux 发行版是 CentOS ,它更多地用于服务器的场景,而且一般不会安装图形界面,所以需要额外去探究一下。
对于发行版的选择,我认为贴近自己的工作场景是比较重要的参考。 CentOS 是稳定的服务器系统,而 Ubuntu 使用的内核比较新,图形界面的支持比较丰富。此外还可以 Debian 或者 Fedora 这些发行版可供选择。
我个人推荐是 CentOS 或 Ubuntu 中任意一款,因为这些发行版的用户相对较多,各类支持和解决方案也相应地比其他发行版来的多。
如前面所提到的,我们需要安装 Server 和 Client 两个组件。
CentOS 如果没有安装过图形界面,需要先安装 X Window System ,它提供了 X Server 的功能。
还需要安装 X Client ,可以选择只安装个人需要的 X Clinet,但一般会都会安装主流的桌面套件提供完整的支持,我的个人选择的桌面套件是 xfce 。
# 前置的软件安装工作:
$ yum group install 'x window system' -y
$ yum group install xfce -y # 这里可选择其他套件:GNOME Desktop or KDE Plasma Workspaces
# 安装完成后,切换到图形界面的两种方式:
$ init 5
$ systemctl isolate graphical.target
# 安装完成后,可以设置默认启动环境为图形界面
$ systemctl get-default # 默认应该为多用户界面
multi-user.target
$ systemctl set-default graphical.target
$ reboot # 修改设置后重启生效
运行时分析
如果安装没有报错,我们在执行切换命令后就会自动切换到图形界面。
在某些版本中,可能会出现无法立即切换图形的情况,解决办法一般是先切换为原来的运行等级,在终端界面会产生文本模式的会话,选择接受 licence 后再尝试切换。
为了更好地了解运行的原理,我们可以抓取进程信息进行分析,看看服务是如何运行的。
# 切换图形界面后的进程信息:
$ ps aux | grep X
root 1002 0.0 0.2 225840 4812 ? Ss 16:55 0:00 /usr/bin/abrt-watch-log -F Backtrace
/var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
root 1597 0.5 2.4 340104 49876 tty1 Ssl+ 16:56 0:01 /usr/bin/X :0 -background none -noreset
-audit 4 -verbose -auth /run/gdm/auth-for-gdm-VsIE6S/database
-seat seat0 -nolisten tcp vt1 # X server 的进程详情
root 2060 0.0 0.0 112812 948 pts/1 S+ 17:00 0:00 grep --color=auto X
如果我们已经启动了图形界面,那么这台机器上必然已有一个 X 进程,这时我们需要关注一个环境变量 DISPLAY ,它为所有的 X Client 提供 X Server 的通信地址。
这里有个地方比较有意思,如果在图形界面下的终端打印这个变量,可以看到格式为 hostname:displaynumber.screennumber 的值,但是如果你切换到命令行界面并打印这个变量,会发现结果为空。那是因为这个变量在命令行界面是无意义的,而它对图形界面运行的 Client 却是不能缺少的,如果没有它, Server 和 Client 之间就无法通信,所以新的 Client 都会继承这个环境变量。
关于 DISPLAY 这个环境变量,我们可以在 X Server 的文档中查到相关的信息:
- hostname 如果是为空,那么它默认会使用本地 X Server 中的最高效通信方式 Unix Socket ,实际使用中这个值经常留空。
- displaynumber 用来界定显示器和输入设备的集合,用于区分不同的显示界面,是不能为空的。
- screennumber 用来界定某个集合中不同的显示器,比如多显示器使用主副屏的情况。考虑到现实情况中,用户通常只有一个显示器, screennumber 留空则默认 0 。
所以可以看到实际中的 DISPLAY 一般是类似于 :0 , :1 , :10 这样的值,系统默认启动的 X 进程 DISPLAY 就是 :0 ,符合前面所描述的使用习惯。此外 displaynumber 一般还会作为这个 X Server 监听的端口号偏移量。
X Server 的默认监听端口是 6000 ,如果是指定了 DISPLAY 的 X Server ,那么除了端口已被占用的情况,一般会在 6000 的 displaynumber 偏移端口上进行监听,当指定 DISPLAY 为 :1 会监听在 6001 端口,指定 DISPLAY 为 :10 会监听在 6010 端口,这个部分可以通过 netstat 查看系统的监听情况。
再说回系统默认启动的 X 进程,我们可以在这个进程参数中看到 DISPLAY 的值为 :0 。如果依前面所述,此时应该可以查询到监听在 6000 端口的 X 进程。但是这时我们通过 netstat 检查端口,会发现这个端口并不会被占用。出现这种现象的原因是系统默认启动的 X 进程带有 -nolisten tcp 参数,禁用了 tcp 监听功能。
如果我们自行启动一个 X 进程,它默认是不带 -nolisten tcp 参数的。我们可以自行定义 DISPLAY 变量,例如 X :1 ,就可以捕捉到监听在 6001 端口的 X 服务。
基于网络运行图形界面
在现实使用中,为用户提供远程桌面连接一般使用基于 RFB 协议的 VNC 或者基于 RDP 协议的 Xrdp ,其实可以直接使用 X Window System 来实现。
在 X Server 和 X Client 同在一台机器上时,它们可以通过 Unix socket 来实现通信。如果要实现 X Server 和 X Client 远程通信,则需要通过 TCP socket 来实现。
远程通信还需要解决安全问题, X Window System 自身提供多种安全认证的机制,但是最安全的方式是使用 OpenSSH X11 Forwarding 。
依据前面的理论,要基于网络运行图形界面,本地机器需要启动 X Server 服务,远端机器提供 X Client ,从远端的 X Client 到本地的 X Server 要使用 X11 Forwarding 来解决安全问题。 X11 Forwarding 实际上就是端口转发。我们可以先进行实践,再进行分析探究。
以下是需要在本地机器和远端机器进行的工作,完成后可以直接启动远程图形界面:
- 远端需要完成的工作
首先需要为远端机器安装 X Client ,可以自行选择安装需要的桌面套件或者只安装需要的 X Client ,然后开启 SSH daemon 的 X11 Forwarding 支持。
$ yum group install xfce -y # 安装 X Client
$ vi /etc/ssh/sshd_config
......
X11Forwarding yes # 开启 X11 Forwarding
......
$ systemctl restart sshd # 开启后重启 daemon 使配置生效
我们平时在使用 SSH 去登录远程机器时,可能会出现 WARNING! The remote SSH server rejected X11 forwarding request. 的报错,这就说明远程机器的 X11 Forwarding 功能被禁用了。如果要在网络上运行图形界面,那么 X Client 所在的远程机器必须打开这个功能。
- 本地需要完成的工作
为了不与现有的图形环境冲突,启动一个新的 X 进程。
X :1 & # 指定 DISPLAY 运行 X ,这里 DISPLAY 可以任意取值,尽量避免端口冲突
然后设置 DISPLAY 环境变量,这个是必须的步骤,它会作为 SSH 设置端口转发的依据。
设置完成后直接发起带 X11 Forwarding 的 SSH 登录请求,在登录成功后就可以启动远程 X Client 了。
$ export DISPLAY=:1 # 这里的值和前面 X 的 DISPLAY 值需要保持一致,这个变量设置错误会导致转发出错
$ ssh -X user@remotehost # -X 启动 X11 Forwarding 功能,远端此时应该已经开启 X11Forwarding yes
...... # 进入远程连接
[user@remotehost ~]$ startxfce4 # 启动 xfce 桌面,此时会在本地 X Server 中显示远程的 xfce 桌面
[user@remotehost ~]$ firefox # 启动单一的 X Client 而不是桌面套件,此时会在本地 X Server 中开启 firefox 浏览器
基于网络的运行时分析
按照以上的步骤,可以建立起两台机器之间的 X Window System 通信。下面进行简单的分析:
-
在 X Server 端所在的机器,如果启动 X 进程而且不关闭 tcp 监听,通过 netstat 抓取到的端口号为 DISPLAY 的 6000 加上 displaynumber 。如果启动的 X 进程关闭了 tcp 监听,就无法抓取到监听端口,作为替换的结果是你可以追踪到一个打开的 Unix Socket 。
-
在本地使用 startxfce4 启动图形界面后,使用命令行可以输出得到 DISPLAY 值为 6000 加上 X11DisplayOffset 。 X11DisplayOffset 和 X11Forwarding 一样定义在 X Client 所在的机器的 /etc/ssh/sshd_config 中。
我们可以知道大概的运行过程是这样:在设置了 DISPLAY 环境变量的 shell 启动 SSH -X 会话后,这个会话启动时会把 DISPLAY 的值进行端口映射,远程的映射信息是在远程的 /etc/ssh/sshd_config 中设置的。 SSH 连接成功就意味着端口转发的建立,在远程机器上的 X Client 并不感知这个端口已经被转发,它会正常地进行通信,并被本地的 X Server 显示。
总结
X Window System 是 Linux 上运行图形界面的基础,这个是使用图形界面必要了解的理论部分。
在本地使用图形界面比较简单,大部分情况下可以之间安装对应软件即可之间使用。比较特殊还是在远程运行图形界面,需要进行一些配置的修改才能成功,但是 X Window System 的性能比较一般,对图形界面有更高的要求一般不使用。
所以这篇笔记适用于最小安装的本地环境或者简单的内网环境。