远程连接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/目录下并解压,如下图: