0%

基于Xorg的Linux桌面环境(一)

简介

使用Linux桌面环境也两三年了,也曾几次打开介绍Xorg的文章,不过基本都是简单看一眼就过去了,这次打算好好看下基于Xorg的Liunx桌面环境总体构成、运行原理。

X基本知识

基本术语

X: 即 X Window System,提供了用于构建GUI系统所需的基本框架或原语,这仅仅是一个规范,并不是实现
X11: X的最新版本
Xorg: 目前最流行的X实现
下文可能会混用这些词汇,但很多地方可以认为泛指X Window System

组成部分

X采用C/S架构,由 X ServerX Client 组成,两者之间使用 X Protocol 进行通信。
Xorg C/S

C/S架构解释

在Xorg中,Server 和 Client划分可能并不是那么合乎人们的日常认识。

  1. X Server运行在用户端,X Server控制显示器以及外设资源,但是它并不知道要绘制什么样的画面。
  2. X Client是应用程序,可以运行在远程服务器上,它本身并没有显示器资源,它与X Server通信以指示X Server绘制画面,还可以接收X Server发过来的外设操作指令。
  3. 这里的C/S划分是从Xorg的视角说的,根据显示器资源和外设资源而定的,X Server拥有显示器资源和外设资源,并向X Client(应用程序)提供服务。

启动一个X Server并将X Client连接到X Server

平时使用的桌面环境都具有开箱即用的桌面环境,对用户屏蔽了Xorg的工作细节,因此这一次我决定使用Arch Linux从零配置基于Xorg的GUI环境。

系统安装

Arch Linux KVM 虚拟机,基本都是默认配置,按照官方安装指引教程安装即可,网卡也是默认的桥接模式。

关于联网有一点需要注意:在安装好系统之后先不要重启,要在有网环境下在目标系统中安装好 dhcpcd
然后重启进入系统,执行如下命令,再重启,系统就会自动通过dhcpcd为连接到局域网的网卡分配ip了

1
2
systemctl enable dhcpd
systemctl start dhcpd

至于添加用户、配置sudo这种事情就不多说了。

Xorg安装

按照Arch官方指引进行即可

启动X Server

启动X Server,此处仅指定了一个DisplayNumber参数。

1
X :0

启动之后,X Server就会接管显示器和外设资源,并为X Client提供服务。在执行完成上述命令之后,
由于还没有X Client连接至此X Server,虚拟机当中的虚拟显示器会黑屏,无法继续操作,需要有X Client连接上才能恢复(一旦连接,X Client会指示X Server进行UI绘制,然后就可以操作X Client对应的应用程序了)

手动在本地启动X Client并连接至X Server

启动X Server的时候,显示器资源已经被X Server接管了,原本的终端应该已经无法正常使用了,可以使用ssh(当然,在此之前需要安装openssh并启动sshd)连接到虚拟机进行下面的操作。说起连接虚拟机就需要获取虚拟机IP,我所使用的KVM虚拟机可以在主机中用下面的命令获取已分配的IP:virsh net-dhcp-leases default

要想启动X Client,首先要配置DISPALY环境变量:[Address]:{DisplayNumber}.{ScreenNumber} ,
ScreenNumber的具体含义暂不深究,这里使用0是可行的

1
export DISPLAY=:0.0

然后就可以启动X Client了,可以直接启动 xterm,也可以启动 twm

1
2
xterm &
twm &

此时原本被X Server控制的屏幕应该就会出现上面启动的X Client了。
至此,我们已经使用手动的方式启动X Server,并将X Client连接至X Server了,似乎Xorg已经不再那么神秘了呢!

X Forwarding

上面实现了本地X Server和本地X Client之间的连接,那么如何通过网络连接处于不同设备的X Server和X Client呢?

一种方式是使用ssh 的 X Forwarding功能(有没有其它办法我也不知道)。

接下来将说明如何通过X Forwarding功能在我的Ubuntu系统上运行位于Arch虚拟机当中的xterm程序。
架构如下。

  1. 远程机器需要具备运行X Client的环境,但是不需要具备桌面环境
  2. 本地机器需要具有显示器等运行X Server所需要的资源

X Forwarding

配置Arch虚拟机

启用sshd的X Forwarding功能

修改 /etc/ssh/sshd_config

1
2
3
4
5
...
AllowTcpForwarding yes
...
X11Forwarding yes
...

然后重启sshd服务

1
sudo systemctl restart sshd 

安装xauth程序,用于X Forwarding,没有这个软件就无法正常使用

1
sudo pacman -S xorg-xauth 

在Ubuntu桌面环境下上使用ssh X Forwarding启动虚拟机中的xterm

使用ssh -X连接至remote Arch

1
ssh -X user@host

可以看到,在X Forawding正常启动的情况下,remote Arch的 DISPLAY 变量已经被设置好了

然后就可以启动X Client了

1
xterm

不仅xterm,firefox这样的程序也是可以启动的remote Firefox

X Forwarding与VNC、RDP技术的比较

很遗憾,经过查阅资料,得知 X Forwarding 应用领域和可靠性不如另外两种技术。

  1. X Forwarding对的带宽要求比另外两者高,因为X Client需要发送所有的绘制指令至X Server,然后由X Server绘制,而VNC技术直接传输图像,从理论上来说X Forward应该需要更少的网络资源才对,而实际上绘制指令往往比较随机,难以有效压缩,但VNC技术能有效利用现有数据压缩技术减少数据量,参考这篇博文

  2. X Forwarding本身没有断线重连机制,即使可以使用screen对终端进行断线重连,也无法恢复经过X Forwarding的应用程序,参考维基百科

    An X client cannot generally be detached from one server and reattached to another unless its code specifically provides for it (Emacs is one of the few common programs with this ability). As such, moving an entire session from one X server to another is generally not possible.

参考链接