特别说明:要在个人随笔后写评论的小伙伴们请注意了,个人博客开启了 MathJax 数学公式支持,MathJax 使用
$
标记数学公式的开始和结束。若是某条评论中出现了两个$
,MathJax 会将两个$
之间的内容按照数学公式进行排版,从而致使评论区格式混乱。若是你们的评论中用到了$
,可是又不是为了使用数学公式,就请使用\$
转义一下,谢谢。html
想从头阅读该系列吗?下面是传送门:编程
大名鼎鼎的 X Window 你们确定不陌生。都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构。在网上随便搜一搜,也能够找到很多 X Window 的介绍。有很多文章为了给用户留一个直观的印象,每每先让系统进入纯文本界面,而后使用 startx 来启动图形界面,或者直接使用 X 来启动 X Server,再而后运行一个 xterm 来作示范。我以为以上这些文章对 X Window 的理解有限,不够深刻。因此,我这里写一篇《X Window 的奥秘》,以最新的 Ubuntu-18.10 Desktop 为例,展现如何学习 X Window。vim
10 月是一个比较开心的月份。在这个月中,陆续发布了最新的 Ubuntu 18.10 和 Fedora 29,还有人在个人博客中问关于 CentOS 7 的问题。CentOS 7 当然是一个优秀的发行版,但并非做为桌面系统的首选,Gnome 的版本太旧,官方仓库中的软件包也不够丰富,美化起来比较困难。在这一篇中,我要展现远程链接 X Server 的操做,须要两个外观差距稍微大一点的 Linux 桌面系统,因此选择了 CentOS 7 和 Ubuntu 18.10。安全
Ubuntu 18.10 此次外观大变样,使用了 Yaru 主题,下面的截图展现了其中 Terminal 和 GVim 的外观:
bash
而 CentOS 7 默认的外观实在太丑,因此我给他换上了最流行的 adapta-gtk-theme 和 paper-icon-theme,下面的截图展现了其中 Terminal 和 GVim 的外观:
网络
这两种风格应该是比较好区分的,在后文中,很容易经过外观来判断一个 GUI 程序究竟来自于哪个系统。架构
X Window 实际上是一种规范,它有不少不一样的实现,在 Linux 系统下最流行的是实现 Xorg 和 XFree86,微软 Windows 系统下也有 X Window 的实现,苹果的 Mac 也是 X Window 的一种实现。要了解本身机器上运行的 X Window 到底是哪个,可使用查看进程的ps
命令,以下图:
ssh
从上图能够看出,Ubuntu 18.10 使用的 X Window 是 Xorg。若是使用ps -ef
命令,还能够看到 Xorg 运行时的命令行参数。tcp
想了解 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 18.10 桌面版,而在另一台远程机器上运行 CentOS 7(纯字符界面),当我用 ssh 从 Ubuntu 链接到 CentOS 的时候,Ubuntu 是 Client,而 CentOS 是 Server。在 X Window 中,Server 恰恰是我面前的这台 Ubuntu,X Server 运行在 Ubuntu 上。我能够在 CentOS 中运行 GVim,可是窗口显示在 Ubuntu 中,这时,GVim 是一个 Client 程序,它在远程机器上运行,而它的窗口显示在本地。
前面提到网上不少介绍 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+F一、Ctrl+Alt+F二、...、Ctrl+Alt+F7,就能够在不一样的虚拟控制台中进行切换。在 Ubuntu 18.10 中,虚拟控制台 3 到 6 运行的是 agetty,也就是字符界面,虚拟控制台 2 运行的是 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 vt8 :1 -auth /run/user/1000/gdm/Xauthority -retro
来在 display :1 上再运行一个 X Server,以下图:
其中的 -retro
参数是为了让 X Server 的背景显示为斜纹,不然背景为纯黑色,那就看不出来是否启动了 X Server。vt8
参数指定将新启动的 X Server 放到第 8 个虚拟控制台。:1
参数指定新启动的 X Server 的 display number。启动 X Server 后的效果以下图:
按 Ctrl+Alt+F2 回到 display :0,在新启动的 X Server 中运行一个 GVim 看看效果。运行 GVim 时,使用-display :1
参数指定窗口显示在新启动的 X Server 上,使用 -geometry
参数指定窗口的大小和位置。
再按 Ctrl+Alt+F8 切换到 display :1,看效果。以下:
不知道为何,在 Ubuntu 18.10 中的虚拟控制台中切换两下,新启动的 X Server 就会崩溃退出。并且切换到虚拟控制台 8 再切换回来,个人 Ubuntu 桌面的分辨率也变成了 800x600,很是不爽。固然,这里的展现只是为了证实能在一台机器上运行两个 X Server,能看到效果就行。
前面展现的在一个系统中运行两个 Xorg 并非很吸引人,毕竟新启动的 X Server 太丑了,并且 Xorg 的参数一大堆,不是很容易搞。既然 X Client 和 X Server 能够分布在不一样的机器上,那么,若是咱们可以把别的系统中的 GUI 程序显示到本地机器中,那才比较过瘾。理论上讲,若是在前面提到的 CentOS 7 中运行gvim -display 192.168.40.135:0
命令(这里的 192.168.40.135 是 Ubuntu 18.10 系统的内网 IP),就应该能够把界面显示到 Ubuntu 18.10 桌面上,反之,若是在 Ubuntu 18.10 中运行gvim -display 192.168.40.130:0
命令(这里的 192.168.40.130 是 CentOS 7 系统的内网 IP),就能够把界面显示到 CentOS 7 中。
可是,这是行不通的。行不通的缘由首先是 Xorg 复杂的认证机制。若是没有认证机制把关,随便就能让别的系统把图形界面甩过来,那桌面上岂不是垃圾窗口满天飞吗?其次,Xorg 在启动时每每会带上-nolisten tcp
参数,禁止接受从 TCP/IP 网络上传过来的链接请求。要禁用该选项,每每须要去更改 gdm 的配置文件。
我这里就不折腾这些复杂的认证机制和命令行参数了,我这里来点简单的。最简单的把远程机器上的图形界面带回本地桌面的方式,是使用 SSH 的 X11 Forwarding 功能。该功能用起来很是简单,只须要在使用ssh
命令链接远程机器的时候,加上-X
或者-Y
参数就能够了。以下图,我在 Ubuntu 18.10 中使用ssh -X 192.168.40.130
远程链接到 CentOS 7 中,而后再运行gvim
命令,该 GVim 窗口就显示在了 Ubuntu 的桌面中。
反之,若是在 CentOS 7 中使用ssh -X 192.168.40.135
远程链接到 Ubuntu 18.10 中,在运行gvim
命令,就能够把 Ubuntu 中的 GVim 显示到 CentOS 7 的桌面中,以下图:
SSH 的 X11 Forwarding 是一个很是强大的功能。咱们甚至能够把 Linux 中的图形界面显示到 Windows 中,只须要在 Windows 中运行一个 X Server 便可。我选择的软件是 XMing,而后使用 PuTTY 链接到 Linux 系统。在 PuTTY 的设置中,开启 X11 Forwarding 功能,以下图:
而后能够把 Linux 桌面中的图形界面带入 Windows 桌面,以下图:
X Server 的启动方式有两种,一种是经过显示管理器启动,另外一种是手动启动。在前面的例子中,我经过直接运行sudo X vt8 :1 -auth /run/user/1000/gdm/Xauthority -retro
来启动了一个 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 的早期版本中,使用 lightdm 取代了传统的 xdm、gdm 等显示管理器。从 Ubuntu 17.10 开始,Ubuntu 放弃了 Unity 桌面而回归 Gnome 3,则显示管理器又变回 gdm 了。
可使用不一样的方法对 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,称为 nested X Server。最经常使用的 nested X Server 是 Xephyr,在 Ubuntu 中能够经过以下命令安装它:
sudo aptitude install xserver-xephyr
Xephyr 的使用很是简单,能够经过man Xephyr
命令查看它的使用手册。若是输入Xephyr :1 -screen 1024x768
命令,就能够在现有图形界面中打开一个窗口模式的 X Server,其中-screen
参数用来指定 X Server 显示区域的大小。之后再启动 GUI 程序,就能够经过程序的 -display :1
选项让程序运行在这个嵌套的 X Server 中,以下图:
怎么样,是否是很好玩呢?除了好玩,还颇有用,好比调试窗口管理器啊、链接远程桌面啊什么的都用得着。固然,我这里只是简单展现一下原来 X Window 还能够这么玩。
1.在一个 Linux 系统中存在多个虚拟控制台,因此能够启动多个 X Server;
2.启动 X Server 的方式有两种,一种是使用 /usr/bin/X、startx、xinit 手动启动,一种是经过显示管理器启动;
3.远程计算机链接本地的 X Server,须要 X Server 开放 TCP 端口,还要搞定安全认证;
4.若是以为搞定 X Server 的 TCP 端口和安全认证太麻烦,可使用 SSH 的 X11 Forwarding 功能,远程链接 X Server 超级方便;
5.X Server 的配置,能够经过命令行参数,能够经过环境变量,还能够经过配置文件;
6.能够在现有的图形界面下以窗口模式运行嵌套的 X Server,经常使用的软件是 Xephyr;
7.使用 XMing 和 PuTTY,把 Linux 图形界面带入 Windows 不是梦。
我对此次写的这个系列要求是很是高的:首先内容要有意义、够充实,信息量要足够丰富;其次是每个知识点要讲透彻,不能模棱两可含糊不清;最后是包含丰富的截图,让那些不想装 Linux 系统的朋友们也能够领略到 Linux 桌面的风采。若是个人努力获得你们的承认,能够扫下面的二维码打赏一下:
该随笔由京山游侠在2018年11月01日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com