大名鼎鼎的X Window大家肯定不陌生。都知道它是Unix/Linux下面的窗口系统,也都知道它基于Server/Clinet架构。在网上随便搜一搜,也可以找到不少X Window的介绍。有不少文章为了给用户留一个直观的印象,往往先让系统进入纯文本界面,然后使用startx来启动图形界面,或者直接使用X来启动X Server,再然后运行一个xterm来做示范。我觉得以上这些文章对X Window的理解有限,不够深入,而且也不够新。所以,我这里写一篇《X Window究竟是什么》,以最新的Ubuntu-14.04 Desktop为例,展示如何学习X Window。
先说一点题外话。在上一篇《打造属于自己的Vim》发表后,评论中有人让共享一下配置文件。当时我说:配置文件又不长,自己照着图片敲一下代码嘛。结果这个“照着图片敲代码”的事情我今天自己干了一遍,好在没花多少时间,几分钟而已。原因是因为我今天折腾X Window的时候,把系统给挂掉了,然后重装系统,然后,就只好再设置一遍Vim了。
了解自己机器上的X Window
X Window其实是一种规范,它有很多不同的实现,在Linux系统下最流行的是实现Xorg和XFree86,微软Windows系统下也有X Window的实现,苹果的Mac也是X Window的一种。要了解自己机器上运行的X Window究竟是哪一个,可以使用查看进程的ps命令,如下图:
从上图可以看出,Ubuntu 14.04使用的X Window是Xorg。如果使用ps -ef命令,还可以看到Xorg运行时的命令行参数。
想了解X Window,下面这些文档需要看一遍先:
下面来说一下也许是众所周知的基础知识:X Window是一个分层的架构,它分为Serve和Client。X Server负责图形界面的显示,(也负责用户的输入),而Client程序需要连接到X Server,然后请求X Server绘制图形界面,同时从X Server接受用户的输入。在桌面系统上,X Server和Client程序往往安装在同一台机器上,日常使用基本感觉不到它是分层的。但是很显然,X Server和Client也可以分别运行在不同的机器上,在一台机器上运行程序,而在另外一台机器上显示图形界面。
X Window中的Server和Client的概念和我们平时接触到的“Server/Client”概念刚好相反。很多熟悉Internet原理的人,第一次接触X Window的这两个概念都会搞错。比如,我在一台本地机器上运行Ubuntu 14.04桌面版,而在另外一台远程机器上运行CentOS 5.10(纯字符界面),当我用ssh从Ubuntu连接到CentOS的时候,Ubuntu是Client,而CentOS是Server。在X Window中,Server偏偏是我面前的这台Ubuntu,X Server运行在Ubuntu上。我可以在CentOS中运行GVim,但是窗口显示在Ubuntu中,这时,GVim是一个Client程序,它在远程机器上运行,而它的窗口显示在本地。
理解display和虚拟控制台
前面提到网上很多介绍X Window的文章都是先让系统进入字符界面,然后手动启动一个X Server。其实这完全没有必要,因为在同一台机器上完全可以运行多个X Server,只需要让每个X Server的display不同即可。那么display究竟是什么?
在X Window中,可以通过hostname:display_number.screen_number来指定一个屏幕。可以这样理解:一台计算机可以有多个display,一个display可以有多个屏幕。所以,display相当于是计算机配备的一套输入输出设备,一般情况下,一台电脑只配一套键盘鼠标和一个显示器,特殊情况下,可以配多个显示器。
现在问题出来了,我的电脑只有一套键盘鼠标和一个显示器,也就是只有一个display,那又怎么能运行多个X Server呢?那是因为在Linux中,还有虚拟控制台这样的高级特性。只需要同时按下Ctrl+Alt+F1、Ctrl+Alt+F2、...、Ctrl+Alt+F7,就可以在不同的虚拟控制台中进行切换。在Ubuntu 14.04中,虚拟控制台1到6运行的getty,也就是字符界面,虚拟控制台7运行的是Xorg。(Fedora中不一样,虚拟控制台1运行的是图形界面,其它的是字符界面。)
我们可以直接运行X Server程序来启动X Server。/usr/bin/X和Xorg都是X Server程序。其实/usr/bin/X是Xorg的符号链接,用哪一个都是一样的。
启动X Server的时候可以指定display参数,因为可以省略掉hostname和screen_number,所以可以用:0,:1这样的格式来指定display。在我的机器上,本来就有一个X Server在运行,display :0已经被占用了,所以我使用sudo X :1 -retro来在display :1上再运行一个X Server,如下图:
其中的-retro参数是为了让X Server的背景显示为斜纹,否则背景为纯黑色,那就看不出来是否启动了X Server。启动X Server后的效果如下图:
按Ctrl+Alt+F7回到display :0,再用ps命令看一下,会发现系统中有两个Xorg在运行,一个运行在虚拟控制台7,一个运行在虚拟控制台8。如下图:
在新启动的X Server中运行一个GVim看看效果。运行GVim时,使用-display :1参数指定窗口显示在新启动的X Server上,使用-geometry参数指定窗口的大小和位置。然后按Ctrl+Alt+F8切换虚拟控制台,看效果。命令见上图,程序运行效果见下图: