X Windows练习

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

ps –e |grep tty

Ubuntu 14.04使用的X Window是Xorg。如果使用ps -ef命令,还可以看到Xorg运行时的命令行参数。
在桌面系统上,X Server和Client程序往往安装在同一台机器上,日常使用基本感觉不到它是分层的。但是很显然,X Server和Client也可以分别运行在不同的机器上,在一台机器上运行程序,而在另外一台机器上显示图形界面。
在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/centos中不一样,虚拟控制台1运行的是图形界面,其它的是字符界面。display:1运行在tty7上)
  我们可以直接运行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。
  按Ctrl+Alt+F7回到display :0(ubuntu),再用ps命令看一下,会发现系统中有两个Xorg在运行,一个运行在虚拟控制台7,一个运行在虚拟控制台8。
在新启动的X Server中运行一个GVim看看效果。运行GVim时,使用-display :1参数指定窗口显示在新启动的X Server上,使用-geometry参数指定窗口的大小和位置。然后按Ctrl+Alt+F8切换虚拟控制台,看效果。

gvim –display :1 –geometry 700X500+20+20

远程连接X Server
如果能让远程机器上的GVim也把窗口显示在本地机器的屏幕上,那就比较过瘾了。所以,使用ssh连接到CentOS-5.10,然后使用gvim -display Ubuntu-14:1命令,希望将GVim显示到Ubuntu的display :1上。由于是远程连接,所以hostname不能省略,需写成ubuntu:1,也可以使用IP地址,写成192.168.1.103:1。

gvim –display ubuntu:1

很可惜,连接失败。
  失败的原因是远程访问X Server需要安全认证。这个可以理解,就像登陆邮箱需要输入用户名和密码一样,如果X Server不要认证就可以随便连接的话,那岂不是桌面上垃圾窗口满天飞?安全认证的方式有很多种,具体请参考man Xsecurity。安全认证可以使用xhost和xauth这两个程序来进行,具体使用方法参考它们的文档。(同时注意防火墙#iptables –F清除所有规则)
先用xhost来授权,这个比较简单。为了运行xhost,需要在X Server上有一个终端,所以运行一个xterm

xterm –display :1

在xterm中输入sodu xhost +192.168.1.109,这样,CentOS-5.10中运行的GUI程序都可以连接到这个新开启的X Server了。(注每一个display的安全和环境都不一样,哪一个display需远程联接,哪个就需要授一次权)
在CentOS-5.10中运行GVim

gvim –display 192.168.1.103:1

新启动的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的桌面了。

在debian/kali linux的环境中edit /usr/share/gdm/gdm.schemas, setting the key security/DisallowTCP to false

打开新的使用X :1 –listen tcp 因为默认是不打开tcp端口的,只打开6000一个端口。

下一步的目标就是更改lightdm的配置,去掉这个-nolisten tcp参数。
在使用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 (yum install Xephyr)
Xephyr的使用非常简单,可以通过 man Xephyr 命令查看它的使用手册。如果输入 Xephyr :1 (display号不能和已用dsiplay号冲突)命令,就可以在现有图形界面中打开一个窗口模式的X Server
  以后再启动GUI程序,就可以通过程序的-display选项让程序运行在这个嵌套的X Server中,如:#xterm –display :1 &
  怎么样,是不是很好玩呢?除了好玩,还很有用,比如调试窗口管理器啊、连接远程桌面啊什么的都用得着。当然,我这里只是简单展示一下原来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;
  7.我的《Linux入门学习教程:Linux系统折腾笔记》中介绍的方法不够用,还要加上两条:①使用ps命令查看进程;②查看程序启动的log文件。
https://blog.csdn.net/seaship/article/details/86233325

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • Ubuntu中LightDM是什么(转) LightDM(Light Display Manager)是一个全新的...
    mypostwww阅读 9,222评论 0 1
  • 本来打算写一个archlinux的安装记录,先前在Virtualbox上测试了好长时间,真机安装的时候却发现完全不...
    mst7阅读 7,129评论 1 15
  • 第一章 1.Linux是一套免费使用和自由传播的类UNIX操作系统,它可以基于Intel x86系列处理器以及Cy...
    yansicing阅读 5,306评论 0 9
  • 1.描述计算机的组成及其功能 (一)计算机的组成 1.CPU 2.CPU风扇 3.BIOS 4.内存 5.硬盘 6...
    whamai阅读 1,431评论 0 1
  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,547评论 0 0