理解 X Windows System 并解决 VNC 服务使用中的各种问题

在使用 Linux 系统的图形界面和 VNC 服务的时候,尤其是在 VPS 中进行挂机网赚之类的活动时,更是离不开使用 VNC 服务的图形界面,而 Linux 内核系统使用的图形界面的“灵魂”就是 X Windows System (简称 X ),下面就跟随博主来一次“探索灵魂”之旅。

1. X Windows System 的前世

以 Linux 为内核的系统不像微软家的 win7、Win10之类的系统离开了图形界面就是个鸡肋,Linux 呱呱坠地之时是没有图形界面的,有且仅有高逼格的命令行界面,但是 Linux 系统又是如此的强大与牛B,当需要图形界面时——So Easy! 在1984年由MIT研发了 X Windows System 协议,这个协议就像 HTTP 协议,TCP/IP 协议一样,是“道”而非“术”,是抽象概括性的文件。同时,因为有了协议就可以选用合适的编程语言来实现这个协议,完成协议约定的功能,形成可运行的软件,就好比有了交通法规就需要交警去根据法规维护交通秩序一样, Xorg 就是根据X Windows System 协议规则约定工作的”交警”。自那时起,在所有基于 Linux 内核的系统上,安装配置一下基于 X 协议的程序软件,就好比我们安装的QQ、微信等之类的程序,双击 SetUP,然后 next、next…..OK 完成——图形界面走起!

X Window System 是基于网络架构的客户端/服务器模式,分成 X Server(X 服务器)和 X Client (X 客户端)两个组件, X protocol(X 协议)是X server于X client之间通信的协议。X 还定义了 X server 如何与系统内核通讯(内核驱动硬件)。一个X client 应用程序(比如画图板)要在屏幕上输出一个圆那么他就用X协议对X服务器说:喂!我需要在屏幕上画一个圆。X 应用程序只负责告诉 X 服务器在屏幕的什么地方用什么颜色画一个多大的圆,而具体的”画”的动作,比如这个圆如何生成,用什么显卡的驱动程序去指挥显卡完成等等工作是由X服务器来完成的,X 服务器还负责捕捉键盘和鼠标的动作,假设 X 服务器捕捉到鼠标的左键被按下了,它就告诉X应用程序:亲爱的应用程序先生,我发现鼠标被按下了,您有什么指示吗?如果 X 应用程序被设计成当按下鼠标左健后再在屏幕上画一个正方形的话,X 应用程序就对 X 服务器说:请再画一个正方形。当然它会告诉 X 服务器在什么地方用什么颜色画多大的正方形,但不关心具体怎么画–那是 X 服务器的事情。

2. X Windows System 的今生——X11

基于 X Windows System 协议的图形界面软件在推出之后,根据实际使用情景,持续不断的推动着 X 的完善迭代升级,在1987年,其核心协议已经是第11版本了,简称:X11,实际上是 X11R6 (X协议第11版第六次发行)的意思,就是说目前用的 X 协议是第11版的,然后经过了6次小的修正,不同版本的 X 协议是不能一起使用的,现在的X服务器软件和X应用程序都遵循X11R6。基于“提供机制,而非策略”这样的设计理念,核心协议基本稳定,30多年过去了,X Windows System 依然是 X11,时至今日,X11 某些方面依然比微软的 Windows、Mac OS X最新的设计方式更好。

X Client :基于 X11 协议的客户端,最容易理解的就是画板程序,像Firefox、Xterm、Xclock等等也都是 X client。

X Server :基于X11 协议的服务端。负责管理调度如显卡、显示器等进行图形绘制显示,捕获鼠标键盘的输入状态,传递信息给 X client,接上 X client 的反馈。 移动程序窗口、最大化最小化、输入的文字、绘制的图形图像都是 X server 捕获了硬件设备的信息,传递给 X client , X client 程序收到信息根据相应预先编写好的程序功能,告诉 X server 绘制新的图形,刷新显示之后的效果。
———————————————-
相互关系(信号流):
X-server(鼠标、键盘)==>X-client解释指令==>X-server(显卡、显示器)

X-server接收指令==>X-client解释指令==>X-server落实指令

X-server<===>DM/WM<===>X-client
———————————————-

Xorg 与 XFree86 :都是一个X Server,Xorg 是 X.org 基金会负责提供的一个开源程序;XFree86 是由 XFree86®Project 公司负责开发的 X Server。XFree86 的开发者因软件许可证出现分岐,基于 XFree86 4.4 RC2 版本源代码而衍生发展出了 Xorg 。

Xlib :是对 X 协议的的一个简单的封装,可以让程序员不用了解细节而编写图形相关程序。实际上程序员直接调用 Xlib的很少,更多使用的是GTK+、QT等图形库。这些又是基于Xlib的图形库。

3. 显示管理器DM(Display Manager)

显示管理器 DM(Display Manager) :管理 X session 的程序称为显示管理器 DM( Display Manager),启动图形界面显示管理器(如GDM、LightDM、LXDM),即可进行图形界面登录操作。比如 GDM 或 KDM 就是 GNOME/KDE 桌面环境所分别对应的 DM ,被整合到 GNOME/KDE 桌面环境中,在安装GNOME/KDE时自动安装了 ,进入系统时会有图形界面的登录框。如果设置了开机自动进入图形界面的 Linux 系统,DM 程序在开机时的必须自动执行(通过配置开机自启动脚本e.g:/etc/rcN.d/或者加入启动项功能实现)。图形界面系统启动过程是这样的:内核加载–>init程序运行–>显示管理器运行–> X server 运行–>显示管理器连接到 X server,显示登录界面–>用户登录后,登录界面关闭,加载桌面环境。从上面的流程可以看出,显示管理器是 X server 的父进程,它负责启动 X server,当 X server 启动后,它又变成了 X server 的一个 X client 程序,连接到 X server 显示欢迎界面和登录界面,最后,显示管理器又是所有桌面环境的父进程,它负责启动桌面环境需要的其它 X client 程序。所以 DM 更多指代图形界面系统启动中的一个类 startx 功能的程序。在命令行模式直接使用 startx 命令实现了类似显示管理器进行功能。(命令行也有专门的显示管理器:CDM、Console TDM — 扩展自xinit,由纯粹的Bash脚本编写成,不如 startx 来得简单粗暴直截了当!)

X session(X会话) :是指 X server 启动后直到 X server 关闭之间的这段时间的“会话”。一个会话是指给定时间的一组窗口以及它当前的内容。开启一个 X session,是开启图形界面的必要条件之一。在图形界面开启的过程中,DM 会对用户进行认证(也就是用户名密码的输入),然后运行事先在 DM 中设置好的程序(比如桌面图标程序、桌面背景程序、scim输入法、Xterm等就是这个时候启动的)。在 DM 对 X session 会话进行管理最直接的体现就是:再次登录进入图形界面系统时所有窗口状态与登出时完全一致。会话管理器程序(即 DM 或者 startx 运行的相关程序)存储了登出时运行的在图形界面里运行的程序名称,在再次登录时按照登出时存储记录的名称启动它们。此外,为了能的恢复程序的状态和恢复窗口内容,当 DM 要求时,程序能保存它们的运行状态、记录数据并在重启时重新装载它们。

startx 及 xinit :命令行模式下,startx 命令将会先解析用户的参数(语法与 xinit 相同,如下所示),如果用户指定了该参数(指定要启动的 X client 和 X server),那么 startx 就会以该参数来传递给 xinit 并启动相应程序,否则就会解析(与其说是解析,还不如说是执行)$HOME目录下的 .xinitrc 和.xserverrc 文件,如果该文件不存在,就会解析系统目录下(/etc/X11/xinit/)的 .xinitrc 和.xserverrc 文件, /etc/X11/xinit/xserverrc 和 /etc/X11/xinit/xinitrc 中的脚本分别负责唤起 X server 和 X session 初始化,如果这个文件也不存在,那startx就将以默认的client(xterm)和server(/usr/bin/X)为参数来启动xinit。 startx 只是一个全局脚本程序(startx 脚本位于 /usr/bin 下,可用 vim 打开),被“伪装”成了命令的形式,干活的是 xinit,xinit才是一个二进制文件。关于 startx 脚本详细源码解读参见: 《startx 启动过程分析》

  1. #xinit语法如下:
  2.  
  3. xinit [[client] options ] [-- [server] [display] options]
  4.  
  5. # client 用于指定一个基于 X 的应用程序, client 后面的 options 是传给这个应用程序的参数, 
  6. # server 是用于指定启动哪个 X 服务器,一般为 /usr/bin/X 或 /usr/bin/Xorg , 
  7. # display 用于指定 display number ,一般 为 0 ,表示第一个 display , option 为传给 server 的参数。
  8.  
  9.  
  10. #如果不指定 client , xinit 会查找 $HOME 目录下的 .xinitrc 文件,
  11. #如果 $HOME 存在这个.xinitrc 文件, xinit 直接调用 execvp 函数执行该文件。
  12. #如果 $HOME 不存在这个 .xinitrc 文件,解析系统目录下(/etc/X11/xinit/)的 .xinitrc,
  13. #系统目录下的 .xinitrc 定义的 client 及其 options 为:xterm -geometry +1+1 -n login -display :0 。
  14.  
  15. #如果不指定 server , xinit 会查找 $HOME 目录下的 .xserverrc 文件,
  16. #如果 $HOME 存在这个.xserverrc 文件, xinit 直接调用 execvp 函数执行该文件。
  17. #如果 $HOME 不存在这个.xserverrc 文件,解析系统目录下系统目录下(/etc/X11/xinit/)的.xserverrc 文件,
  18. #系统目录下的 .xserverrc 定义的 X server 及其 display 为:  X :0 。
  19.  
  20. #如果系统目录中不存在 X 命令,那么需要在系统目录下建立一个名为 X 的链接,使其指向 X server 命令( Ubuntu 下为 Xorg )。
  21.  
  22. #xinitrc 文件负责运行 X session 命令, 从 /etc/X11/Xsession 脚本的内容可以看出,就是进入 /etc /X11/Xsession.d/ 目录轮询地执行所有脚本,
  23. #以及 /etc/X11/Xsession.d/ 目录中的内容、 Xsession.options、 Xresource 等载入执行,都是 X session 的初始化过程。
  24.  
  25. #xserverrc 文件负责执行 X server 的启动,例如通过 /etc/X11/xorg.conf 或 /etc/xorg.conf 和位于 /etc/X11/xorg.conf.d/ 的配置文件,配置运行 Xorg ;
  26.  
  27. #上面[client]和[server]分别称为X client程序和X server程序。它们代表的是程序的具体路径,其必须以/或者./开头。
  1. #关于 xinit 应用的例子1:
  2.  
  3.  xinit /usr/bin/xclock -- /usr/bin/X :0
  4.  
  5. #该例子将启动 X server 即/usr/bin/X, 同时将会启动X client 即xclock 。
  6. #注意指定 client 或 server 时,需要用绝对路径,
  7. #否则 xinit 将因无法区别是传给 xterm 或 server 的参数还是指定的 client 或 server 而直接当成是参数处理。
  8.  
  9. #关于 xinit 应用的例子2:
  10. #在 $HOME 下新建 .xinitrc 文件,并加入以下几行:
  11.  
  12. xsetroot -solid gray &
  13. xclock -g 50x50-0+0 -bw 0 &
  14. xterm -g 80x24+0+0 &
  15. twm
  16.  
  17. #该例子没有指定 server ,所以 xinit 会查找 $HOME 目录下的 .xserverrc 文件,然后系统目录下的 .xserverrc 文件......
  18. #当 xinit 启动时,它会先启动 X server ,然后启动一个 clock 和 xterm ,最后启动窗口管理器 twm 。
  19. #注意:最后一个命令不能后台运行,否则所有命令都后台运行的话 xinit 就会返回退出,
  20. #同样的,除最后一个命令外都必须后台运行,否则后面的命令将只有在该命令退出后才能运行。

GNOME/KDE 桌面环境的集成了显示管理器 GDM/KDM ,它的作用功能与 xinit(startx)差不多,是按照桌面环境的需要定制了参数的 xinit(startx),主要进行预大一参数、封装、拓展、集成,易于傻瓜化操作。

综合起来说,显示管理器DM(Display Manager)完成三个任务:a· X Server的启动; b· X session的初始化; c· X session的管理。

a.X11 的软件包,比如 Xorg 即 X server,这个是运行图形界面的核心要素,安装方法如下:(安装好了,才有能被 xinit 启动的 X server)

  1. # CentOS 系统
  2. sudo yum install xorg-x11* 
  3.  
  4. # Debian 系统
  5. sudo apt-get install xorg
  6. # 或者
  7. sudo apt-get install xserver-xorg 
  8. sudo apt-get install x-window-system-core

b· X session的初始化——简单理解就是执行脚本 /etc/X11/Xsession ,从而按顺序调用执行 /etc/X11/Xsession.d 目录下的程序。

c· X session的管理—— /etc/X11/Xsession 及其 /etc/X11/Xsession.d 目录下的程序。
如果没有进行管理的程序,也不会影响图形界面运行,但也不能保存记录状态或者恢复状态

4. 窗口管理器WM( Windows Manager)

窗口管理器WM(Windows Manager):是用来提供统一的GUI组件的(窗口、外框、菜单、按钮等)。负责管理窗口的移动、最大化、最小化、改变大小以及关闭等工作。否则,应用程序们各自为政,既增加了程序开发的负担,不统一的桌面风格只能是一种“凌乱美”!常见的窗口管理器有:TWM(Xorg提供的简单的窗口管理器)、Openbox(号称是下一代窗口管理器)、gnome-wm(gnome提供的窗口管理器)、kwin(KDE使用的窗口管理器)、FVWM(一款知名的窗口管理器)。

一个有趣的试验是:可以备份然后删除用户主目录中的 .xinitrc,启动 startx 会时就会执行默认的 /etc/X11/xinit/xinitrc,该文件默认启动 Twm 和 Xterm(请确保这两个程序已经正确安装),然后注释掉还有该文件中有 “Twm ”的行,将启动一个不能移动、不能最大最小化、没有边框的 Xterm 命令行终端,然后在该命令行终端输入 Twm 你就会看到自动加上了各种熟悉的图形界面元素。这样就能形象的感受一下什么是窗口管理器了。

5. VNC 原理理解

有了前面的这些基础概念,我们再来看看 VNC server 就会觉得手到擒来,不会像无头苍蝇到处懵逼了。首先我们来看一下VNC实现的原理:
———————————————-
客户端 X服务器 系统内核
vnc viewer<------------------>Xvnc(vncserver)<-------------------->System
(vnc protocal) (X protocal)
———————————————-

因此,VNC 能够正常显示图形界面的基础就是安装了 X11 的软件包,比如 Xvnc,在安装的 vncserver 服务器端程序如VNCserver、TightVNC 等时会自动进行 X server 和 X client 的安装及初始配置。只要 vncserver 端可以正常启动运行,剩下的工作就是对 vncserver 所调用的“显示管理器DM(x Display Manager)”(YUM安装或者 Apt-get 安装自动配置好了,所以VNC程序启动时会自动启动 Xserver(即Xvnc)、session初始化和进行会话管理等工作)和“窗口管理器WM(x Windows Manager)”的“按需分配”了。vncserver 调用的配置文件是“ ~/.vnc/xstartup ”,可以进行窗口管理器的配置。所以,在解决有关 VNC 的问题时,遵循这条主线,问题就会迎刃而解。ping得通连不上,一般是防火墙端口限制🚫、VNC服务未运行端口也就没有开启;连上了,没图形界面,一般是窗口管理器没有安装或者配置好。

6. X11 及 VNC 配置的躲坑!

Openbox :在命令行或者脚本文件里,执行“ openbox ”仅将 Openbox 作为窗口管理器使用,如果执行“ openbox-session ”是作为显示管理器和窗口管理器综合来使用,使用“ openbox-session ”命令启动 Openbox 时,将执行环境脚本以设置运行的环境、执行 /etc/xdg/openbox/autostart 脚本,该脚本可以启动任何其它需要跟随一起启动的应用程序,如启动面板tint2,设置桌面墙纸或其他任何内容的程序。而且,还可以运行 〜/.config/openbox/autostart 中的用户自定义的脚本。VNC 中如果 Openbox 仅仅作为 WM 使用即可,其它应用程序需要在 ~/.vnc/xstartup 中添加配置,以便于随 VNCserver 一起启动。博主测试了一下,在CentOS 系统中,先安装 Openbox 再安装 tint2 ,tint2 会被写入Openbox 的 autostart 脚本 ,如果是使用“ openbox-session ”方式,那么 VNC 启动时会自动运行tint2,而不需要往 xstartup 中添加配置以启动 tint2 。TWM 也需要手动添加在配置文件中。在大多数图形桌面环境下,TWM 一般是默认窗口管理器,所以安装后不需要配置什么文件也能自动加载运行(默认X client 还有Xterm)。

非VNC时的标准图形桌面环境,openbox开启自启动有两种方法实现自启动:
1.如果用 startx 或 xinit 登陆到 X 会话, 修改 ~/.xinitrc. 把 execute 行的 openbox 为 openbox-session。
2.如果用 GDM/KDM , 那么选择 Openbox 会话它会自动执行自启动脚本.

tint2 :一个小巧的任务栏 Xclient 程序,需要使用时请手动安装,并在 ~/.vnc/xstartup 添加以便自动加载。以及 Xterm 也是如此。(除非在 ~/.vnc/xstartup 是使用“ openbox-session ”命令启动 Openbox )

~/.xinitrc 及 ~/.vnc/xstartup 中应该只有 一个 未注释掉的 exec 行,而且 exec 行必须位于配置文件的末尾。exec 后面的所有命令只有窗口退出后才会被执行。在窗口管理器前启动的命令,例如屏保和壁纸程序,必须自行 fork 后台进程或用 & 在后台启动, 否则启动程序会等待它们退出才会启动窗口管理器或桌面环境。使用 exec 作为前缀会替换当前的进程,这样进程进入后台时 X 不会退出。 某些程序,比如 xrdb,不应该被 fork. 使用 exec 前缀时,程序将会用窗口管理器进程替换脚本进程,所以即使进程进入后台 X 也不会退出。

当 xinit 启动时,它会先启动 X server ,然后是应用程序如xclock、xterm等 , 最后才启动窗口管理器 如TWM、Openbox 等,所以口管理器程序的启动配置应该放在最后。最后一个命令 不能 后台运行,否则所有命令都后台运行的话 xinit 就会返回退出,同样的,除最后一个命令外都必须后台运行,否则后面的命令将只有在该命令退出后才能运行。

7. 关于 KDE 和 GNOME 等

KDE和GNOME是LINUX里最常用的图形界面操作环境或者说是桌面系统,是集成了窗口管理器及一些应用程序的套件,比如任务栏程序,开始菜单程序,桌面图标程序等等,方便快速入门使用。

欢迎投稿、分享转载,转载请保留如下信息:格物躬行博客[https://www.go2do.net]

本文由 [go2do] 原创,本文链接: https://www.go2do.net/linux/what-difference-x11-xwindows-xorg-xstart-how-vnc-server-error.html



You may also like...

发表评论

电子邮件地址不会被公开。

本页共执行140次数据库查询,耗时0.346秒,使用内存 1.77 MB