Linux 桌面玩家指南:09. X Window 的奥秘

Linux 桌面玩家指南:09. X Window 的奥秘
原文:Linux 桌面玩家指南:09. X Window 的奥秘

特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束。如果某条评论中出现了两个$,MathJax 会将两个$之间的内容按照数学公式进行排版,从而导致评论区格式混乱。如果大家的评论中用到了$,但是又不是为了使用数学公式,就请使用\$转义一下,谢谢。

想从头阅读该系列吗?下面是传送门:

  • Linux 桌面玩家指南:01. 玩转 Linux 系统的方法论 【约 1.1 万字,22 张图片】
  • Linux 桌面玩家指南:02. 以最简洁的方式打造实用的 Vim 环境 【约 0.97 万字,7 张图片】
  • Linux 桌面玩家指南:03. 针对 Gnome 3 的 Linux 桌面进行美化 【约 0.58 万字,32 张图片】
  • Linux 桌面玩家指南:04. Linux 桌面系统字体配置要略 【约 1.2 万字,34 张图片】
  • Linux 桌面玩家指南:05. 发博客必备的图片处理和视频录制神器 【约 0.25 万字,14 张图片】
  • Linux 桌面玩家指南:06. 优雅地使用命令行及 Bash 脚本编程语言中的美学与哲学 【约 1.4 万字,16 张图片】
  • Linux 桌面玩家指南:07. Linux 中的 Qemu、KVM、VirtualBox、Xen 虚拟机体验 【约 0.95 万字,31 张图片】
  • Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码 【约 0.6 万字,17 张图片】

前言

大名鼎鼎的 X Window 大家肯定不陌生。都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构。在网上随便搜一搜,也可以找到不少 X Window 的介绍。有不少文章为了给用户留一个直观的印象,往往先让系统进入纯文本界面,然后使用 startx 来启动图形界面,或者直接使用 X 来启动 X Server,再然后运行一个 xterm 来做示范。我觉得以上这些文章对 X Window 的理解有限,不够深入。所以,我这里写一篇《X Window 的奥秘》,以最新的 Ubuntu-18.10 Desktop 为例,展示如何学习 X Window。

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 的外观:
16576-20181031150630510-1566358116.png

而 CentOS 7 默认的外观实在太丑,所以我给他换上了最流行的 adapta-gtk-theme 和 paper-icon-theme,下面的截图展示了其中 Terminal 和 GVim 的外观:
16576-20181031150743167-253533407.png

这两种风格应该是比较好区分的,在后文中,很容易通过外观来判断一个 GUI 程序究竟来自于哪一个系统。

了解自己机器上的 X Window

X Window 其实是一种规范,它有很多不同的实现,在 Linux 系统下最流行的是实现 Xorg 和 XFree86,微软 Windows 系统下也有 X Window 的实现,苹果的 Mac 也是 X Window 的一种实现。要了解自己机器上运行的 X Window 究竟是哪一个,可以使用查看进程的ps命令,如下图:
16576-20181031151318912-642586678.png

从上图可以看出,Ubuntu 18.10 使用的 X Window 是 Xorg。如果使用ps -ef命令,还可以看到 Xorg 运行时的命令行参数。

想了解 X Window,下面这些文档需要看一遍先:
16576-20181031151836068-826947610.png

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

理解 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 18.10 中,虚拟控制台 3 到 6 运行的是 agetty,也就是字符界面,虚拟控制台 2 运行的是 Xorg。(Fedora 中不一样,虚拟控制台 1 运行的是图形界面,其它的是字符界面。)如下图:
16576-20181031153336308-133929108.png

我们可以直接运行 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,如下图:
16576-20181031165906337-115987151.png

其中的 -retro 参数是为了让 X Server 的背景显示为斜纹,否则背景为纯黑色,那就看不出来是否启动了 X Server。vt8 参数指定将新启动的 X Server 放到第 8 个虚拟控制台。:1参数指定新启动的 X Server 的 display number。启动 X Server 后的效果如下图:
16576-20181031165337027-1818856858.png

按 Ctrl+Alt+F2 回到 display :0,在新启动的 X Server 中运行一个 GVim 看看效果。运行 GVim 时,使用-display :1参数指定窗口显示在新启动的 X Server 上,使用 -geometry参数指定窗口的大小和位置。
16576-20181031165602853-830241496.png

再按 Ctrl+Alt+F8 切换到 display :1,看效果。如下:
16576-20181031165708595-2035219253.png

不知道为什么,在 Ubuntu 18.10 中的虚拟控制台中切换两下,新启动的 X Server 就会崩溃退出。而且切换到虚拟控制台 8 再切换回来,我的 Ubuntu 桌面的分辨率也变成了 800x600,非常不爽。当然,这里的展示只是为了证明能在一台机器上运行两个 X Server,能看到效果就行。

远程连接 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 的桌面中。
16576-20181031231134863-1850551184.png

反之,如果在 CentOS 7 中使用ssh -X 192.168.40.135远程连接到 Ubuntu 18.10 中,在运行gvim命令,就可以把 Ubuntu 中的 GVim 显示到 CentOS 7 的桌面中,如下图:
16576-20181031235719661-1031243835.png

SSH 的 X11 Forwarding 是一个非常强大的功能。我们甚至可以把 Linux 中的图形界面显示到 Windows 中,只需要在 Windows 中运行一个 X Server 即可。我选择的软件是 XMing,然后使用 PuTTY 连接到 Linux 系统。在 PuTTY 的设置中,开启 X11 Forwarding 功能,如下图:
16576-20181031235957621-749634410.png

然后可以把 Linux 桌面中的图形界面带入 Windows 桌面,如下图:
16576-20181101000035156-1573758396.png

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

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 都是直接占用了计算机的整个显示器和键盘鼠标,事实上,在现有的图形界面中,还可以以窗口模式运行另外一个 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 中,如下图:
16576-20181101000928719-1452715133.png

怎么样,是不是很好玩呢?除了好玩,还很有用,比如调试窗口管理器啊、连接远程桌面啊什么的都用得着。当然,我这里只是简单展示一下原来 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 桌面的风采。如果我的努力得到大家的认可,可以扫下面的二维码打赏一下:
16576-20180831154735325-1276475036.png

版权申明

该随笔由京山游侠在2018年11月01日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com

posted on 2019-03-09 09:48 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10499560.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Storm教程1理论介绍

流式计算的历史: 早在7、8年前诸如UC伯克利、斯坦福等大学就开始了对流式数据处理的研究,但是由于更多的关注于金融行业的业务场景或者互联网流量监控的业务场景,以及当时互联网数据场景的限制,造成了研究多是基于对传统数据库处理的流式化&…

梯度下降原理及Python实现

梯度下降算法是一个很基本的算法,在机器学习和优化中有着非常重要的作用,本文首先介绍了梯度下降的基本概念,然后使用python实现了一个基本的梯度下降算法。梯度下降有很多的变种,本文只介绍最基础的梯度下降,也就是批…

matplotlib一些常用知识点的整理,

本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找。 强烈推荐ipython 无论你工作在什么项目上,IPython都是值得推荐的。利用ipython --pylab,可以进入PyLab模式,已经导入了matplotlib库与相关软件包(例如…

Storm教程3编程接口

Spouts Spout是Stream的消息产生源,Spout组件的实现可以通过继承BaseRichSpout类或者其他Spout类来完成,也可以通过实现IRichSpout接口来实现。 需要根据情况实现Spout类中重要的几个方法有: open方法 当一个Task被初始化的时候会调用此…

梳理操作系统概论

1、用一张图总结操作系统的结构、功能特征、采用的技术和提供服务方式等。 2、用一张图描述CPU的工作原理。 3、用一张图描述系统程序与应用程序、特权指令与非特权指令、CPU状态、PSW及中断是如何协同工作的? 转载于:https://www.cnblogs.com/ljgljg/p/10503190.ht…

位置指纹法的实现(KNN)

基本原理 位置指纹法可以看作是分类或回归问题(特征是RSS向量,标签是位置),监督式机器学习方法可以从数据中训练出一个从特征到标签的映射关系模型。kNN是一种很简单的监督式机器学习算法,可以用来做分类或回归。 对于…

室内定位系列 ——WiFi位置指纹(译)

摘要 GPS难以解决室内环境下的一些定位问题,大部分室内环境下都存在WiFi,因此利用WiFi进行定位无需额外部署硬件设备,是一个非常节省成本的方法。然而WiFi并不是专门为定位而设计的,传统的基于时间和角度的定位方法并不适用于WiFi…

机器学习02线性回归、多项式回归、正规方程

单变量线性回归(Linear Regression with One Variable) 预测器表达式: 选择合适的参数(parameters)θ0 和 θ1,其决定了直线相对于训练集的准确程度。 建模误差(modeling error)&a…

机器学习03Logistic回归

逻辑回归 (Logistic Regression) 目前最流行,使用最广泛的一种学习算法。 分类问题,要预测的变量 y 是离散的值。 逻辑回归算法的性质是:它的输出值永远在 0 到 1 之间。 逻辑回归模型的假设是: 其中&a…

CNN理解比较好的文章

什么是卷积神经网络?为什么它们很重要? 卷积神经网络(ConvNets 或者 CNNs)属于神经网络的范畴,已经在诸如图像识别和分类的领域证明了其高效的能力。卷积神经网络可以成功识别人脸、物体和交通信号,从而为机…

Windows 安装Angular CLI

1、安装nvm npm cnpm nrm(onenote笔记上有记录) 参考:https://blog.csdn.net/tyro_java/article/details/51232458 提示:如果发现配置完后,出现类似“npm不是内部命令……”等信息。 可采取如下措施进行解决—— 检查环…

机器学习04正则化

正则化(Regularization) 过拟合问题(Overfitting): 如果有非常多的特征,通过学习得到的假设可能能够非常好地适应训练集 :代价函数可能几乎为 0), 但是可能会不能推广到…

Adaboost算法

概述 一句话概述Adaboost算法的话就是:把多个简单的分类器结合起来形成个复杂的分类器。也就是“三个臭皮匠顶一个诸葛亮”的道理。 可能仅看上面这句话还没什么概念,那下面我引用个例子。 如下图所示: 在D1这个数据集中有两类数据“”和“-”…

机器学习05神经网络--表示

神经网络:表示(Neural Networks: Representation) 如今的神经网络对于许多应用来说是最先进的技术。 对于现代机器学习应用,它是最有效的技术方法。 神经网络模型是许多逻辑单元按照不同层级组织起来的网络, 每一层…

逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是分类和预测算法中的一种。通过历史数据的表现对未来结果发生的概率进行预测。例如,我们可以将购买的概率设置为因变量,将用户的

逻辑回归(Logistic Regression, LR)又称为逻辑回归分析,是分类和预测算法中的一种。通过历史数据的表现对未来结果发生的概率进行预测。例如,我们可以将购买的概率设置为因变量,将用户的特征属性,例如性别,年龄&#x…

机器学习06神经网络--学习

代价函数 标记方法: 神经网络的训练样本有 m 个 每个包含一组输入 x 和一组输出信号 y L 表示神经网络层数 Sl表示每层的 neuron 个数(SL 表示输出层神经元个数) 将神经网络的分类定义为两种情况: 二类分类:SL1, y0 or 1 表示哪一类&…

Logistic Regression Classifier逻辑回归

Logistic Regression Classifier逻辑回归主要思想就是用最大似然概率方法构建出方程,为最大化方程,利用牛顿梯度上升求解方程参数。 优点:计算代价不高,易于理解和实现。缺点:容易欠拟合,分类精度可能不高…

机器学习07应用机器学习的建议

决定下一步做什么(Deciding What to Try Next) 确保在设计机器学习系统时,能够选择一条最合适、最正确的道路。 具体来讲,将重点关注的问题是:假如你在开发一个机器学习系统,或者想试着改进一个机器学习…

CSS3--5.颜色属性

HTML5中添加了一些新的颜色的表示方式 1.RGBA:说得简单一点就是在RGB的基础上加进了一个通道Alpha。RGBA在RGB的基础上多了控制alpha透明度的参数。以上R、G、B三个参数,正整数值的取值范围为:0 - 255。百分数值的取值范围为:0.0%…

逻辑回归的通俗解释 逻辑回归的定位

1 逻辑回归的定位 首先,逻辑回归是一种分类(Classification)算法。比如说: 给定一封邮件,判断是不是垃圾邮件给出一个交易明细数据,判断这个交易是否是欺诈交易给出一个肿瘤检查的结果数据,判断…