简介
使用Linux桌面环境也两三年了,也曾几次打开介绍Xorg的文章,不过基本都是简单看一眼就过去了,这次打算好好看下基于Xorg的Liunx桌面环境总体构成、运行原理。
X基本知识
基本术语
X: 即 X Window System,提供了用于构建GUI系统所需的基本框架或原语,这仅仅是一个规范,并不是实现
X11: X的最新版本
Xorg: 目前最流行的X实现
下文可能会混用这些词汇,但很多地方可以认为泛指X Window System
组成部分
X采用C/S架构,由 X Server
和 X Client
组成,两者之间使用 X Protocol
进行通信。
C/S架构解释
在Xorg中,Server 和 Client划分可能并不是那么合乎人们的日常认识。
- X Server运行在用户端,X Server控制显示器以及外设资源,但是它并不知道要绘制什么样的画面。
- X Client是应用程序,可以运行在远程服务器上,它本身并没有显示器资源,它与X Server通信以指示X Server绘制画面,还可以接收X Server发过来的外设操作指令。
- 这里的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 | systemctl enable 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 | xterm & |
此时原本被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程序。
架构如下。
- 远程机器需要具备运行X Client的环境,但是不需要具备桌面环境
- 本地机器需要具有显示器等运行X Server所需要的资源
配置Arch虚拟机
启用sshd的X Forwarding功能
修改 /etc/ssh/sshd_config
1 | ... |
然后重启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这样的程序也是可以启动的
X Forwarding与VNC、RDP技术的比较
很遗憾,经过查阅资料,得知 X Forwarding
应用领域和可靠性不如另外两种技术。
X Forwarding对的带宽要求比另外两者高,因为X Client需要发送所有的绘制指令至X Server,然后由X Server绘制,而VNC技术直接传输图像,从理论上来说X Forward应该需要更少的网络资源才对,而实际上绘制指令往往比较随机,难以有效压缩,但VNC技术能有效利用现有数据压缩技术减少数据量,参考这篇博文
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.