x window的奥秘

阅读目录html

  大名鼎鼎的 X Window 你们确定不陌生。都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构。在网上随便搜一搜,也能够找到很多 X Window 的介绍。有很多文章为了给用户留一个直观的印象,每每先让系统进入纯文本界面,而后使用 startx 来启动图形界面,或者直接使用 X 来启动 X Server,再而后运行一个 xterm 来作示范。我以为以上这些文章对 X Window 的理解有限,不够深刻,并且也不够新。因此,我这里写一篇《X Window 的奥秘》,以最新的 Ubuntu-14.04 Desktop 为例,展现如何学习 X Window。linux

  先说一点题外话。在上一篇《打造属于本身的Vim》发表后,评论中有人让共享一下配置文件。当时我说:配置文件又不长,本身照着图片敲一下代码嘛。结果这个“照着图片敲代码”的事情我今天本身干了一遍,好在没花多少时间,几分钟而已。缘由是由于我今天折腾 X Window 的时候,把系统给挂掉了,而后重装系统,而后,就只好再设置一遍 Vim 了。ubuntu

了解本身机器上的 X Window

  X Window 实际上是一种规范,它有不少不一样的实现,在 Linux 系统下最流行的是实现 Xorg 和 XFree86,微软 Windows 系统下也有 X Window 的实现,苹果的Mac 也是 X Window 的一种。要了解本身机器上运行的 X Window 到底是哪个,可使用查看进程的ps命令,以下图:
vim

  从上图能够看出,Ubuntu 14.04 使用的 X Window 是 Xorg。若是使用 ps -ef 命令,还能够看到 Xorg 运行时的命令行参数。安全

  想了解 X Window,下面这些文档须要看一遍先:
session

  下面来讲一下也许是众所周知的基础知识: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 程序,它在远程机器上运行,而它的窗口显示在本地。ssh

理解 display 和虚拟控制台

  前面提到网上不少介绍 X Window 的文章都是先让系统进入字符界面,而后手动启动一个 X Server。其实这彻底没有必要,由于在同一台机器上彻底能够运行多个 X Server,只须要让每一个 X Server 的 display 不一样便可。那么 display 到底是什么?tcp

  在 X Window 中,能够经过 hostname:display_number.screen_number 来指定一个屏幕。能够这样理解:一台计算机能够有多个 display,一个 display 能够有多个屏幕。因此,display 至关因而计算机配备的一套输入输出设备,通常状况下,一台电脑只配一套键盘鼠标和一个显示器,特殊状况下,能够配多个显示器。学习

  如今问题出来了,个人电脑只有一套键盘鼠标和一个显示器,也就是只有一个 display,那又怎么能运行多个 X Server 呢?那是由于在 Linux 中,还有虚拟控制台这样的高级特性。只须要同时按下 Ctrl+Alt+F一、Ctrl+Alt+F二、...、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 切换虚拟控制台,看效果。命令见上图,程序运行效果见下图:

远程链接 X Server

  若是能让远程机器上的 GVim 也把窗口显示在本地机器的屏幕上,那就比较过瘾了。因此,使用 ssh 链接到 CentOS-5.10,而后使用 gvim -display ubuntu-14:1 命令,但愿将 GVim 显示到 Ubuntu 的 display :1 上。因为是远程链接,因此 hostname 不能省略,需写成 ubuntu-14:1,也可使用 IP 地址,写成 192.168.1.103:1。以下图:

  很惋惜,链接失败。

  失败的缘由是远程访问 X Server 须要安全认证。这个能够理解,就像登录邮箱须要输入用户名和密码同样,若是 X Server 不要认证就能够随便链接的话,那岂不是桌面上垃圾窗口满天飞?安全认证的方式有不少种,具体请参考 man Xsecurity。安全认证可使用 xhost 和 xauth 这两个程序来进行,具体使用方法参考它们的文档。

  先用 xhost 来受权,这个比较简单。为了运行 xhost,须要在 X Server 上有一个终端,因此运行一个 xterm,以下图:

  在 xterm 中输入 sodu xhost +192.168.1.109,这样,CentOS-5.10 中运行的 GUI 程序均可以链接到这个新开启的 X Server 了。以下图:

  在 CentOS-5.10 中运行 GVim,以下图:

  窗口显示在 Ubuntu 中,以下图:

  新启动的 X Server 界面比较丑陋,咱们仍是想让远程机器上的 GUI 程序直接显示在 Ubuntu 的桌面环境中。因此,指定 display 为 :0,以下图:

  结果很不幸,没法打开 display。链接不上,为何呢?是安全认证的问题吗?不是,是 lightdm 的问题,请继续往下看。

理解 lightdm 和 X Window 桌面环境的启动过程

  X Server 的启动方式有两种,一种是经过显示管理器启动,另外一种是手动启动。在前面的例子中,我经过直接运行 /usr/bin/X :1 来启动了一个 X Server。直接启动 X Server 的方法还有运行 startx 或者 xinit。手动启动 X Server 的缺点就是启动的 X Server 很差看。而显示管理器启动的不只有 X Server,还有一大堆的 Client 程序,构成了一个完整的桌面环境,界面固然就漂亮多了。

  显示管理器(Display Manager)是什么呢?前面我讲到 display 就是一个电脑配备的一套键盘鼠标和显示器,那么显示管理器就是这一套设备的管理器了。显示管理器能够直接管理这些设备,因此它能够控制 X Server 的运行,由它来启动 X Server 那是再合适不过了。系统启动过程是这样的:内核加载-->init程序运行-->显示管理器运行--> X Server 运行-->显示管理器链接到 X Server,显示登陆界面-->用户登陆后,登陆界面关闭,加载桌面环境。从上面的流程能够看出,显示管理器是 X Server 的父进程,它负责启动 X Server,当 X Server 启动后,它又变成了 X Server 的一个 Client 程序,链接到 X Server 显示欢迎界面和登陆界面,最后,显示管理器又是全部桌面环境的父进程,它负责启动桌面环境须要的其它 Client 程序。

  在 Ubuntu 14.04 中,使用 lightdm 取代了传统的 xdm、gdm 等显示管理器。简单来讲,就是由 lightdm 负责启动 X Server 和其它的 X 程序。不知道为何,lightdm 在启动 X Server 的时候,给 X Server 加上了 -nolisten tcp 参数,因此远程计算机就没有办法链接到 Ubuntu 的桌面了。(从第 1 张图片能够看到该参数。)

  下一步的目标就是更改 lightdm 的配置,去掉这个 -nolisten tcp 参数。不过要达成这个目标还真是艰难啊,个人系统挂掉而后重装就是在这里折腾出来的。在这里我要狠狠滴吐槽一下 freedesktop.org,在 X Window 所用的软件中,freedesktop.org 贡献很大,好比 lightdm、xft、fontconfig、freetype 都是这个组织贡献的,但是,你就不能把文档写详细点吗?不只是 lightdm 的文档不行,xft、freetype 的文档也都不行。

  lightdm 的 man page 很是简略,使用 sudo dpkg -L lightdm 也找不出该软件包中有价值的东西。没办法,另辟蹊径吧。在使用 sudo dpkg -L lightdm 查看该软件包的文件时,发现它的 log 文件放在 /var/log/lightdm 文件夹下,过去看看:

  终于,从 log 文件中看到了 lightdm 启动的全过程。首先,看到它从哪几个目录加载配置文件,接着,看到它启动 X Server。从下图光标所在的行能够看到 X Server 启动的全部参数,包括 -nolisten tcp 选项。

  继续看 log 文件,下面光标所在的行显示 lightdm 怎么启动 gnome-session:

  同时,我发现 /etc/lightdm/ 目录下没有 lightdm.conf 文件,而 /usr/share/doc/lightdm/ 目录下有一个 lightdm.conf.gz 文件,把该文件当文档看了一下,发现里面果真就是 lightdm 的配置的解释。赶快将该文件复制到 /etc/lightdm/ 目录下并解压,以下图:

  而后用 Vim 编辑 /etc/lightdm/lightdm.conf 文件,将 xserver-allow-tcp=false 一行前面的注释去掉,而且改成 xserver-allow-tcp=true。以下图:

  最后,重启系统。再用 ps 查看进程,发现 -nolisten tcp 选项已经没有了。

搞定 xauth

  搞定了 -nolisten tcp 以后,要想从远程计算接链接到 Ubuntu 桌面,仍是须要安全认证。在前面的例子中,我使用了 xhost。xhost 是最简单的认证方式。在这里我要试一下别的认证方式,好比 MIT-MAGIC-COOKIE-1。如上图,先使用 xauth list 命令查看一下当前的受权记录,发现只有一条,并且 display 是 ubuntu-14/unix:0,很显然,这是一个本地受权,因此须要使用 xauth add 命令添加一个使用 ip 地址的受权,后面的 key 照抄就好了。最后,使用 xauth extract 和 xauth merge 配合管道和 ssh 将该受权记录合并到 CentOS-5.10 中。

  在 CentOS-5.10 中启动 GVim,指定 display 为 192.168.1.103:0,GVim 窗口就出如今了 Ubuntu中。以下图:

X Server 的配置

  可使用不一样的方法对 X Server 进行配置,前面的例子是直接指定命令行参数。除了指定命令行参数,还可使用环境变量和配置文件。X Server 的配置文件为通常是 /etc/X11/xorg.conf 或 /etc/X11/xorg.conf.d/ 目录下的 .conf 文件,固然,配置文件也能够放在其它的目录中,具体信息,请参看 man xorg.conf。

  若是没有配置文件,X Server 将在启动的时候自动检测硬件,而后生成一个内置的配置。Ubuntu 系统就没有配置文件。不过不要紧,若是须要使用配置文件的时候,能够经过 X Server 的 -configure 参数生成一个配置文件,里面包含当前自动检测出的配置。若是须要任何个性化的配置,对该文件进行修改便可。

现有的图形界面中能够运行嵌套的 X Server

  咱们上面运行的 X Server 都是直接占用了计算机的整个显示器和键盘鼠标,事实上,在现有的图形界面中,还能够以窗口模式运行另一个 X Server,称为 nested X Server。最经常使用的 nested X Server 是 Xephyr,在 Ubuntu 中能够经过以下命令安装它:

sudo aptitude install xserver-xephyr

  Xephyr 的使用很是简单,能够经过 man Xephyr 命令查看它的使用手册。若是输入 Xephyr :1 命令,就能够在现有图形界面中打开一个窗口模式的 X Server,以下图:

  之后再启动 GUI 程序,就能够经过程序的 -display 选项让程序运行在这个嵌套的 X Server 中,以下图:

  怎么样,是否是很好玩呢?除了好玩,还颇有用,好比调试窗口管理器啊、链接远程桌面啊什么的都用得着。固然,我这里只是简单展现一下原来 X Window 还能够这么玩。

总结:

  1.在一个 Linux 系统中存在多个虚拟控制台,因此能够启动多个 X Server;

  2.启动 X Server 的方式有两种,一种是使用 /usr/bin/X、startx、xinit 手动启动,一种是经过显示管理器启动;

  3.Ubuntu 使用的显示管理器是 lightdm,这是一个比较新的、轻量级的显示管理器,可是文档不够详细;

  4.远程计算机链接本地的 X Server,须要 X Server 开放 TCP 端口,还要搞定安全认证;

  5.X Server 的配置,能够经过命令行参数,能够经过环境变量,还能够经过配置文件;

  6.能够在现有的图形界面下以窗口模式运行嵌套的 X Server,经常使用的软件是 Xephyr;

相关文章
相关标签/搜索