文章目录
- 前言
- GUI(Graphical User Interface)
- Windowing system(窗口系统)
- X Window System
- 窗口管理器、GUI工具集、桌面环境及其它
- 3D渲染、硬件加速、OpenGL及其它
- 软件框架
- X协议
- X11R6
- XFree86
- X协议Client
- Xorg
- Xdm
- XWM(window manager 窗口管理器)
- KDE、GNOME、QT、GTK关系
- xinit启动X Window System过程
- 跨网络运行X Window System
- Windows系统做X server
- Linux与Linux互联
- 总结
- Linux图形界面层次关系
- 远程桌面服务VNC/XRDP/Xdmcp/SSH+X11转发
- VNC
- XRDP
- XDMCP
- SSH+X11转发
- 名词解释
- X Window System
- X Server
- X Client
- X Protocol
- XFree86
- Xorg
- Xlib
- X toolkit
- GTK+
- GLib
- Xdg
- Xdm
- Kdm
- Gdm
- Window Manager
- Kwin
- Metacity
- Desktop
- KDE
- GNOME
- 桌面环境/窗口管理器的测评
前言
Linux本身没有图形界面,Linux现在的图形界面实现只是Linux下的应用程序实现的。图形界面并不是Linux的一部分,Linux只是一个基于命令行的操作系统,Linux和Xfree的关系就相当于当年的DOS和 Windows3.0一样,Windows3.0不是独立的操作系统,它只是DOS的扩充,是DOS下的应用程序级别的系统,不是独立的操作系统,同样XFree只是Linux下的一个应用程序而已,不是系统的一部分,但是X的存在可以方便用户使用电脑。Windows95及以后的版本就不一样了,他们的图形界面是操作系统的一部分,图形界面在系统内核中就实现了,没有了图形界面Windows就不成为Windows了,但Linux却不一样,没有图形界面Linux还是Linux,很多装Linux的WEB服务器就根本不装X服务器,这也WINDOWS和Linux的重要区别之一。
GUI(Graphical User Interface)
GUI(图形用户界面)是提供图形化的人机交互(human-computer interaction)界面,而人机交互的本质,是人脑通过人的输出设备(动作、声音等),控制电脑的输入设备,电脑经过一系列的处理后,经由电脑的输出设备将结果输出,人脑再通过人的输入设备接收电脑的输出,最终实现“人脑<–>电脑”之间的人机交互。
Windowing system(窗口系统)
窗口系统,是GUI的一种(也是当前计算机设备、智能设备广泛使用的一种),以WIMP (windows、icons、menus、pointer) 的形式,提供人机交互接口。Linux系统中有很多窗口系统的实现,如X Window System、Wayland、Android SurfaceFlinger等,虽然形态各异,但思路大致相同,包含如下要点:
- 1)一般都使用client-server架构,server(称作display server,或者windows server、compositor等等)管理所有输入设备,以及用于输出的显示设备。
- 2)应用程序作为display server的一个client,在自己窗口(window)中运行,并绘制自己的GUI。
- 3)client的绘图请求,都会提交给display server,display server响应并处理这些请求,以一定的规则混合、叠加,最终在有限的输出资源上(屏幕),显示多个应用程序的GUI。
- 4)display server和自己的client之间,通过某种类型的通信协议交互,该通信协议通常称作display server protocol。
- 5)display server protocol可以是基于网络的,甚至是网络透明的(network transparent),如X Window System所使用的。也可以是其它类型的,如Android SurfaceFlinger所使用的binder。
X Window System
X 窗口系统(X Window System)简称X或X11,当前最新版本是X11R7。是Windowing System一种实现,广泛使用于UNIX-like的操作系统上(当然也包括Linux系统),由MIT(Massachusetts Institute of Technology,麻省理工学院)在1984年发布。X最早是20世纪80年代由MIT开发的,为当时高端的科学工作站提供统一的窗口系统。20世纪90年代,随着硬件价格的逐渐降低,一些爱好者把X改写后运行于廉价的PC机上,这个项目后来被称为XFree86.X 窗口系统分为硬件级(驱动级)和应用程序级组件,分别称为X Server和X Client,使用X协议(XDMCP)进行通信,是典型的C/S结构。下图是它的典型架构:
- 1)X Window System简称X,或者X11,或者X-Windows。之所以称作X,是因为在字母表中X位于W之后,而W是MIT在X之前所使用的GUI系统。之所以称作X11,是因为在1987年的时候,X Window System已经进化到第11个版本了,后续所有的X,都是基于X11版本发展而来的(变动不是很大)。为了方便,后续我们都以X代指X Window System。
- 2)X最初是由X.org(XOrg Foundation)维护,后来基于X11R6发展出来了最初专门给Intel X86架构PC使用的X,称作XFree86(提供X服务,它是自由的,它是基于Intel的PC平台)。而后XFree86发展成为几乎适用于所有类UNIX操作系统的X Window系统,因此在相当长的一段时间里,XFree86也是X的代名词。再后来,从2004年的时候,XFree86不再遵从GPL许可证发行,导致许多发行套件不再使用XFree86,转而使用Xorg,再加上Xorg在X维护工作上又趋于活跃,现在Xorg由成为X的代名词(具体可参考“http://www.x.org/”)。
- 3)X设计之初,制定了很多原则,其中一条----"It is as important to decide what a system is not as to decide what it is”,决定了X的“性格”,即:X只提供实现GUI环境的基本框架,如定义protocol、在显示设备上绘制基本的图形单元(点、线、面等等)、和鼠标键盘等输入设备交互、等等。它并没有实现UI设计所需的button、menu、window title-bar styles等元素,而是由第三方的应用程序提供。这就是Unix的哲学:只做我应该做、必须做的事情。这就是这么多年来,X能保持稳定的原因。也是Linux OS界面百花齐放(不统一)的原因,各有利弊吧,后续文章会展开讨论。
- 4)X包括X server和X client,它们之间通过X protocol通信。
- 5)X server接收X clients的显示请求,并输出到显示设备上,同时,会把输入设备的输入事件,转递给相应的X client。X server一般以daemon进程的形式存在。
- 6)X protocol是网络透明(network-transparently)的,也就是说,server和client可以位于同一台机器上的同一个操作系统中,也可以位于不同机器上的不同操作系统中(因此X是跨平台的)。这为远端GUI登录提供了便利,如上面图片所示的运行于remote computer 的terminal emulator,但它却可以被user computer的鼠标键盘控制,以及可以输出到user computer的显示器上。
注:
这种情况下,user computer充当server的角色,remote computer是client,有点别扭,需要仔细品味一下(管理输入设备和显示设备的是server)。 - 7)X将protocol封装为命令原语(X command primitives),以库的形式(xlib或者xcb)向client提供接口。X client(即应用程序)利用这些API,可以向X server发起2D(或3D,通过GLX等扩展,后面会介绍)的绘图请求。
总结下运行过程:
- (1) 用户通过鼠标键盘对X server下达操作命令
- (2) X server利用Event传递用户操作信息给X client
- (3) X client进行程序运算
- (4) X client利用Request传回所要显示的结果
- (5) X server将结果显示在屏幕上
窗口管理器、GUI工具集、桌面环境及其它
前面讲过,X作为Windowing system中的一种,只提供了实现GUI环境的基本框架,其它的UI设计所需的button、menu、window title-bar styles等基本元素,则是由第三方的应用程序提供。这些应用程序主要包括:窗口管理器(window manager)、GUI工具集(GUI widget toolkit)和桌面环境(desktop environment)。
窗口管理器负责控制应用程序窗口(application windows)的布局和外观,使每个应用程序窗口尽量以统一、一致的方式呈现给用户,如针对X的最简单的窗口管理程序–twm(Tab Window Manager)。
GUI工具集是Windowing system之上的进一步的封装。还是以X为例,它通过xlib提供给应用程序的API,仅仅可以绘制基本的图形单元(点、线、面等等),这些基本的图形单元,要组合成复杂的应用程序,还有很多很多细碎、繁杂的任务要做。因此,一些特定的操作系统,会在X的基础上,封装出一些更为便利的GUI接口,方便应用程序使用,如Microwindows、GTK+、QT等等。
桌面环境是应用程序级别的封装,通过提供一系列界面一致、操作方式一致的应用程序,使系统以更为友好的方式向用户提供服务。Linux系统比较主流的桌面环境包括GNOME、KDE等等。
3D渲染、硬件加速、OpenGL及其它
渲染(Render)在电脑绘图中,是指:用软件从模型生成图像的过程。模型是用严格定义的语言或者数据结构对于三维物体的描述,它包括几何、视点、纹理以及照明信息。图像是数字图像或者位图图像。
上面的定义摘录自“百度百科”,它是着重提及“三维物体”,也就是我们常说的3D渲染。其实我们在GUI编程中习以为常的点、线、矩形等等的绘制,也是渲染的过程中,只不过是2D渲染。2D渲染面临的计算复杂度和性能问题没有3D厉害,因此渲染一般都是指3D渲染。
在计算机中,2D渲染一般是由CPU完成(也可以由专门的硬件模块完成)。3D渲染也可以由CPU完成,但面临性能问题,因此大多数平台都会使用单独硬件模块(GPU或者显卡)负责3D渲染。这种通过特定功能的硬件模块,来处理那些CPU不擅长的事务的方法,称作硬件加速(Hardware acceleration),相应的硬件模块,就是硬件加速模块。
众所周知,硬件设备是多种多样的,为了方便应用程序的开发,需要一个稳定的、最好是跨平台的API,定义渲染有关的行为和动作。OpenGL(Open Graphics Library)就是这类API的一种,也是最为广泛接纳的一种。
虽然OpenGL只是一个API,但由于3D绘图的复杂性,它也是相当的复杂的。不过,归根结底,它的目的有两个:
1)对上,屏蔽硬件细节,为应用程序提供相对稳定的、平台无关的3D图像处理API(当然,也可以是2D)。
2)对下,指引硬件相关的驱动软件,实现3D图像处理相关的功能。
另外,openGL的一个重要特性,是独立于操作系统和窗口系统而存在的。
软件框架
- 1)该图片没有体现3D渲染、硬件加速等有关的内容,而这些内容却是当下移动互联、智能化等产品比较关注的地方,也是linux平台相对薄弱的环节。后续会在软件框架有关的内容中再着重说明。
- 2)从层次结构的角度看,linux图形子系统是比较清晰的,但牵涉到每个层次上的实现的时候,就比较复杂了,因为有太多的选择了,这可归因于“提供机制,而非策略”的Unix软件准则。该准则为类Unix平台软件的多样性、针对性做出了很大的贡献,但在今天这种各类平台趋于整合的大趋势下,过多的实现会导致用户体验的不一致、开发者开发精力分散等弊端,值得我们思考。
- 3)虽然图形子系统的层次比较多,但不同的人可能关注的内容不太一样。例如对Linux系统工程师(驱动&中间件)而言,比较关注hardware、kernel和display server这三个层次。而对Application工程师来说,可能更比较关心GUI Toolkits。本文以及后续display subsystem的文章,主要以Linux系统工程师的视角,focus在hardware、kernel和display server(可能包括windows manager)上面。
以X window为例,将hardware、kernel和display server展开如下:
对于软件架构而言,这张来自维基百科的图片并不是特别合适,因为它包含了太多的细节,从而显得有些杂乱。不过瑕不掩瑜,对本文的描述,也足够了。从向到下,图中包括如下的软件的软件模块:
- 1)3D-game engine、Applications和Toolkits,应用软件,其中3D-game engine是3D application的一个特例。
- 2)Display Server
图片给出了两个display server:Wayland compositor和X-Server(X.Org)。X-Server是linux系统在PC时代使用比较广泛的display server,而Wayland compositor则是新设计的,计划在移动时代取代X-Server的一个新的display server。 - 3)libX/libXCB和libwayland-client
display server提供给Application(或者GUI Toolkits)的、访问server所提供功能的API。libX/libXCB对应X-server,libwayland-client对已Wayland compositor。 - 4)libGL
- libGL是openGL接口的实现,3D application(如这里的3D-game engine)可以直接调用libGL进行3D渲染。
- libGL可以是各种不同类型的openGL实现,如openGL(for PC场景)、openGL|ES(for嵌入式场景)、openVG(for Flash、SVG矢量图)。
- libGL的实现,既可以是基于软件的,也可以是基于硬件的。其中Mesa 3D是OpenGL的一个开源本的实现,支持3D硬件加速。
- 5)libDRM和kernel DRM
DRI(Direct Render Infrastructure)的kernel实现,及其library。X-server或者Mesa 3D,可以通过DRI的接口,直接访问底层的图形设备(如GPU等)。 - 6)KMS(Kernel Mode Set)
一个用于控制显示设备属性的内核driver,如显示分辨率等。直接有X-server控制。
X协议
X是协议,就像HTTP协议,IP协议一样,这个概念很多初学者甚至学习LINUX有一定时间的人都混淆,另外X协议的服务器和客户端程序通常在同一台电脑上,因此很多用户都感到对此很难理解。一个基于X的应用程序需要运行并显示内容时他就联接到X服务器,开始用X协议和服务器交谈,比如一个X应用程序要在屏幕上输出一个圆那么他就用X协议对X服务器说,喂!我需要在屏幕上画一个圆,X应用程序只负责告诉X服务器在屏幕的什么地方用什么颜色画一个多大的圆,而具体的"画"的动作,比如这个圆如何生成,用什么显卡的驱动程序去指挥显卡完成等等工作是由X服务器来完成的,X服务器还负责捕捉键盘和鼠标的动作,假设X服务器捕捉到鼠标的左键被按下了,他就告诉X应用程序,亲爱的应用程序先生,我发现鼠标被按下了,您有什么指示吗?如果X应用程序被设计成当按下鼠标左健后再在屏幕上画一个正方形的话,X应用程序就对X服务器说,请再画一个正方形,当然他会告诉服务器在什么地方用什么颜色画多大的正方形,但不关心具体怎么画,那是服务器的事情。
X11R6
X11R6 实际上是 X Protocol version 11 Release 6(X协议第11版第六次修正),不同版本的X协议是不能通信的,就象我们现在IPV4和IPV6不能通信一样,不过不用担心,现在的X服务器软件和X应用程序都遵循X11R6。
XFree86
XFree86只是实现X协议的一个免费X服务器软件,商业上常用Motif,现在还有Xorg,Xnest(windows),X-win32(windows),还有很多很小的由爱好者写的X服务器软件,甚至可以在WINDOWS上有X服务器运行,这样你可以在Linux系统上运行一个X应用程序然后在另一台Windows系统上显示,多么神奇,你可以在网上找到这样的X服务器软件,只不过在LINUX上最常用的是XFree86,现在的Linux发行版都用Xorg了,顺便说一句,苹果电脑的图形界面用的也是X协议,而且被认为是做的最好的X协议图形界面,并且他对X协议的实施是做在系统内核里的,所以性能明显好很多,这就是为什么很多大型三维图形设计软件都是在苹果平台上的原因。
XFree86是X窗口系统的其中一个实现,它主要的运作平台是Unix类操作系统。自1992年,它一直以自由发放的开放源代码模式发展,但是从2004年开始,它再不是以GPL软件许可证的形式出现,而是使用 XFree86®Project 公司所拥有的 XFree86 License version 1.1 软件许可证模式发放。于是XFree86 的开发因软件许可证的变动而出现分岐(这种事情开源界中经常发生),而派生出另一个发展自 XFree86 4.4 RC2 版本源代码,名叫 X.Org 服务器的X Window系统。
X协议Client
XFree86是X协议的服务器软件(以软件的形式实现),但Client端更多的是方便程序员更方便的使用X协议与服务器端的XFree86交互,故就产生了一个Xlib库,封装了X协议内容,如果你还觉得直接使用Xlib不方便,于是就产生了QT和GTK,对Xlib进一步封装,提供了很多控件,可以可视化的使用X协议更方便程序员的开发。
Xlib、QT、GTK直接关系如下图:
QT是直接使用xlib库的,GTK并为直接使用xlib,而是使用更低层的函数库GDK和Glib。这种结构使得Gtk可以更方便地移植到其它系统上,或使用与XWindows系统无关的图形库。
X Client则花样繁多,从高级的CDE,KDE,GNOME,到低级一点的只有twm,Window Maker,blackbox等窗口管理器,再到最简陋的只有xterm,rxvt,xeyes等单个X程序。正是由于X Client的各种搭配,使得我们的X Window System看起来多样化。
Xorg
X.Org Server是X窗口系统这一设计的参考实现,当前版本是X11R7.5,是一个对x窗口系统的具体软件实现.
Xdm
是X Display Manager的缩写,由它来启动X Window服务器,并管理图形客户端程序的登录、会话(登录成功后开启新的session)、启动窗口管理器等。如果Xdm是在本地运行,它会启动X Server,就像命令行登录的init,getty和login所做的事情一样;如果Xdm在网络上某台计算机上运行,它的行为就如同一个telnet server,验证用户名与密码,然后开始一个远程会话(Remote Session)。
KDE,Gnome,deepin等桌面环境也提供了自己的xdm的实现,分别叫kdm和gdm,lightdm。
XWM(window manager 窗口管理器)
窗口管理器是在图形用户界面的视窗系统中,控制窗口位置与外观的软件。它是负责管理与定位窗口的移动、最大化、最小化、改变大小以及关闭等工作,简而言之,就是给一个窗口加上最大化,最小化,关闭按钮标题栏和框架。Twm(Tom Window Manager)就是X.org提供的简单的窗口管理器。
init 3 --> startx(启动图形界面,开启WM) --> ctrl+alt+backspace(返回字符界面) --> xinit(启动图形界面,没有启动WM,因此只能开启一个不能移动的XTERM) --> 1) twm(XFree86中自带的窗口管理器),2)gnome-session(启动GONME),3)startkde(启动KDE)
KDE、GNOME、QT、GTK关系
- KDE,K Desktop Environment
- GNOME,GNU Network Object Model Environment
- Xfce,XForms Common Environment
- LXDE,Lightweight X11 Desktop Environment
KDE 和GNOME是LINUX里最常用的图形界面操作环境,他们不仅仅是一个窗口管理器,还有很多配套的应用软件和方便使用的桌面环境,比如任务栏,开始菜单,桌面图标等等。
KDE和GNOME是窗口管理器,启动他们后我们进入了可视化操作(图形界面),既然需要显示图形,自然少不了与X协议的服务器软件打交道,既然QT和GTK进一步封装了X协议,并且他们提供了更为丰富的窗口及控制机制,于是在QT基础上实现的窗口管理器叫KDE,在GTK基础上实现的窗口管理器叫GNOME,以及Xfce,LXDE等。
再次提示:KDE和GNOME并不只是窗口管理器,同时提供了桌面、菜单等等。
另外在其它UNIX系统中,常常使用CDE作为这样一个环境。
其它的小型窗口管理器有:
window maker,after step,blackbox,fvwm,fvwm2,等等都是常用的优秀窗口管理器。REDHAT9中有 window maker 但是默认不安装,大家可以装来试试。只要xinit再wmaker&就可以用windowmaker了。
xinit启动X Window System过程
启动X主要有两种方法:一是Display Manager,如XDM、GDM、KDM,此种方法通过图形界面登录;另一种是通过xinit,此种方法适用于字符界面登录。我们常用于登录X的startx命令也是通过传递参数给xinit来启动X的,也就是说,最终启动X的是xinit。startx只是一个bash脚本。
命令行:xinit [[client] options ] [-- [server] [display] options]
跨网络运行X Window System
一般用来做服务器的系统(Linux,FreeBSD,Solaris等等)都不会装X server,甚至很多都没有显示器。这样可以在这些系统里安装简单的X Client,以GUI的方式远程显示在管理员们所坐的X server里。一般在管理员的本地机器起个X server,然后ssh或telnet上网关运行X client程序显示在本地显示器上,当然,也可用XDMCP(X Display Manager Control Protocol),man xsession里提到/etc/X11/Xsession一般被startx(我的/etc/X11/xinit/xinitrc里调用 Xsession脚本)或display manager调用,但有的display manager只调用Xsession而不是xinitrc,故为了startx和display manager两种方式下都可正常启动GUI,最好把X client启动的程序放在Xsession文件里。远程运行X client程序需要设置DISPLAY环境变量,设置为 主机名称:屏幕编号(如192.168.1.2:0,则表示X server是192.168.1.2这台机器上的0号屏幕);或是给X client程序加个—display参数。由于条件限制,只测试了位于TCP/IP网络环境,X server为192.168.1.2,X client为192.168.1.1。
Windows系统做X server
-
用ssh或telnet方式
Windows下面的X server软件有很多种,如Xming,X-win32等。这里使用X-win32,在Windows里运行X-win32程序,则相当于本地机器是个X server。远程登录上Debian(我这里是用VMware仿真网络环境,直接进虚拟机即可_),运行:
xdkui@xclient:~ e x p o r t D I S P L A Y = 192.168.1.2 : 0 x d k u i @ x c l i e n t : export DISPLAY=192.168.1.2:0 xdkui@xclient:~ exportDISPLAY=192.168.1.2:0xdkui@xclient: xterm&
这时即在Windows里的X server里看到了xterm了,至于X client还运行什么程序就看你的需要了,文件管理器阿,资源查看器等。当然,这里X-win32要设置好授权,好像默认是禁止接入控制,即任何X client都可使用这个X server。 -
XDMCP方式
常见的Display Manager有xdm,gdm,kdm等。我这里使用的是gdm。需要修改gdm的配置文件/etc/X11/gdm/gdm.conf,修改 [xdmcp]段的Enable=true,使得可以远程登录,在X client运行gdm。
在X-win32里建一个XDMCP的session,查询方式,填入IP为运行gdm的机器地址。连接,即可看到登录界面,下面的就不用说了,享受吧
Linux与Linux互联
-
ssh或telnet方式
在linux本地起个X server,需要注意授权问题,建立文件/etc/X0.hosts,填入X client的IP192.168.1.1,其中X0.hosts表示本地第0个屏幕允许连接的X client地址,建立X1.hosts文件则是本地第1个屏幕允许连接的X client地址,以此类推,man xserver里有。运行
xdkui@xserver:~KaTeX parse error: Expected 'EOF', got '&' at position 2: X&̲ 运行该程序时别加-no…xterm –display 192.168.1.2:0
即可在本地的X server里看到xterm了,如果有的话,还可把gnome-session也显示在本地来。同样可以在linux里的VMware里做这个测试,需要用点手腕了_见下 -
XDMCP方式
在我们的X client里运行gdm(别忘了修改gdm.conf),然后在本地X server的CUI下面运行X -query 192.168.1.1(X client开gdm机器的地址)。可以看到登录界面了吧。
我是在linux里的VMware里做的测试,说说所用的手腕吧。在Ctrl+Alt+F1的CUI下正常运行startx&启动GUI,这时 Ctrl+Alt+F7即为我的X server,X client启动的gnome,然后在这里运行VMware打开Debian虚拟机,并运行gdm。然后回到Ctrl+Alt+F1,运行X :1 -query 192.168.1.1。看到登录界面了吧。这时Ctrl+Alt+F7为我的0号屏幕,里面运行了虚拟机。Ctrl+Alt+F8为1号屏幕,在远程 GUI登录X client。相当于我在本地起了两个X server。X Window System设计的真是相当神奇,使用方法更是眼花缭乱。
总结
X Window System的组成可以分为X server,X client,X protocol三部分。X server主要控制输入输出,维护字体,颜色等相关资源。它接受输入设备的输入信息并传递给X client,X client将这些信息处理后所返回的信息,也由X server负责输出到输出设备(即我们所见的显示器)上。X server传递给X client的信息称为Event,主要是键盘鼠标输入和窗口状态的信息。X client传递给X server的信息则称为Request,主要是要求X server建立窗口,更改窗口大小位置或在窗口上绘图输出文字等。X client主要是完成应用程序计算处理的部分,并不接受用户的输入信息,输入信息都是输入给X server,然后由X server以Event的形式传递给X client(这里感觉类似Windows的消息机制,系统接收到用户的输入信息,然后以消息的形式传递给窗口,再由窗口的消息处理过程处理)。X client对收到的Event进行相应的处理后,如果需要输出到屏幕上或更改画面的外观等,则发出Request给X server,由X server负责显示。
startx主要是置X client和X server所在的位置,并处理相关参数,最后交给xinit处 理。可以看出startx 设置X client的位置是先搜寻 H O M E / . x i n i t r c , 然 后 是 / e t c / X 11 / x i n i t / x i n i t r c ; 设 置 X s e r v e r 的 位 置 是 先 搜 寻 HOME/.xinitrc,然后是/etc/X11/xinit/xinitrc;设置X server的位置是先搜寻 HOME/.xinitrc,然后是/etc/X11/xinit/xinitrc;设置Xserver的位置是先搜寻HOME/.xserverrc,然后是/etc/X11/xinit/xserverrc。这就解释了我们平常为什么说启 动X Window时用户目录下的.xinitrc和.xserverrc文件优先级要高。所以我们用startx命令启动X时,如果用户目录存在. xinitrc和.xserverrc文件,则实际上等价于命令xinit $HOME/.xinitrc – $HOME/.xserverrc 。如果用户目录不存在那两个文件,则等价于xinit /usr/X11R6/lib/X11/xinit/xinitrc – /usr/X11R6/lib/X11/xinit/xserver。别的情况类推。
至于xinit,则根据startx传过来的参数启动X server,成功后根据xinitrc启动Xclient。
以上即为X Window System的启动过程,startx只是负责一些参数传递,真正的X启动由xinit实现。实际上可以分为启动X server和启动X client两部分。下面在用户目录下构造.xinitrc(即X client)和.xserverrc(即X server)文件。在.xserverrc里写入/usr/bin/X11/X :1。.xinitrc里写入/usr/bin/X11/xeyes -display localhost:1。这就是最简单的X server + X client了,只不过把屏幕编号从默认的0改为了1,这里X server即是/usr/bin/X11/X 程序,X client即是/usr/bin/X11/xeyes 程序。
总结下单机用startx启动过程:
- (1) startx置X client和X server的位置,处理参数并调用xinit
- (2) xinit根据传过来的参数启动X server,成功后呼叫X client
- (3) 根据xinitrc设置相关资源,启动窗口管理器,输入法和其他应用程序等X client程序。
启动X窗口的分步骤方法:
- (1) xinit
- (2) gnome-session
永久关闭或开启图形化界面:
(1)查看默认的target,执行:systemctl get-default
(2)开机以命令模式启动,执行:systemctl set-default multi-user.target
(3)开机以图形界面启动,执行:systemctl set-default graphical.target
Linux图形界面层次关系
Linux本身 --> X服务器 <- [通过X协议交谈] -> 窗口管理器(综合桌面环境) --> X应用程序。
Xfree86服务器的实现包括两个部分,一部分是和显卡直接打交道的低层,一部分是和X应用程序打交道的上层.上层负责接收应用程序的请求和鼠标键盘的动作.而和显卡直接打交道的底层负责指挥显卡生成图形,其实就是显卡驱动.上层接收到应用程序的请求后,将请求内容做适当处理,然后交给显卡驱动来指挥显卡完成画图的动作.另外,上层的捕捉键盘和鼠标动作的部分会向应用程序提供鼠标和键盘的状态信息,应用程序接收到这些信息后决定是否再有相应的动作.
平时说的VESA,VGA ,fbdev等其实就是针对不同模式显卡的驱动程序.VESA(Video Electronics Standards Association) VGA (Video Graphics Array) fbdev (FrameBuffer Device)等都是不同的显卡标准,不过这些标准都已经很老了.现在的显卡都兼容这几种模式.framebuffer模式的显卡本身不具有任何运算数据的能力,他好比是一个暂时存放水的水池.CPU将运算后的结果放到这个水池,水池再将结果流到显示器.中间不会对数据做处理.在这中情况下,所有显示任务都有CPU完成,CPU负担很重.从frambuffer这个名字我们就能猜测到他的功能了(数据侦缓冲).在linux内核中有有framebuffer机制,摹仿framebuffer显卡的这种功能.他的好处是把显卡的硬件结构抽象掉,把所有的显卡都当做一个"水池"来用.应用程序也可以直接读取这个水池的内容.framebuffer的设备名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空屏幕.如果你的X用的是framebuffer的驱动,屏幕将全变黑.通过移动鼠标,切换窗口等动作可以让原先的内容重新显示.
如果你不用framebuffer驱动,可以在字符模式下做这个试验.屏幕将全部被清空.
以下的命令:
#dd if=/dev/fb of=fbfile
可以将fb中的内容保存下来,以后可以重新写回屏幕:
#dd if=fbfile of=/dev/fb
作用类似于屏幕截图,但是截下的图不能用普通图片浏览器看.
现在知道linux中framebuffer设备的神奇了吧.
linux字符界面在高分辨率下,启动时会有一个小企鹅logo,这个logo就是用framebuffer功能写上屏幕的.
VESA和VGA比FB要好很多,但是他的显示能力也很有限.CPU仍旧要处理大部分的显示任务.
现 在的显卡就不一样了,CPU几乎不参数显示任务,而专注于运算工作.我们平时在linux下装显卡驱动,其实就是替换掉XFree86中底层的那一部分. 使他有更强的显示能力.比如你的显卡是nvidia的,XFree默认的驱动是"nv",他是一个nvidia显卡的通用驱动,但是他不能发挥 nvidia显卡的性能.这个"nv"驱动模块可以在:
/usr/X11R6/lib/modules/drivers
目录下找到,文件名是:nv_drv.o
这个目录下还有很多显卡驱动模块.
apm_drv.o dummy_drv.o nsc_drv.o sis_drv.o
ark_drv.o fbdev_drv.o nv_drv.o tdfx_drv.o
ati_drv.o glint_drv.o r128_drv.o tga_drv.o
atimisc_drv.o i128_drv.o radeon_drv.o trident_drv.o
chips_drv.o i740_drv.o rendition_drv.o tseng_drv.o
cirrus_alpine.o i810_drv.o s3_drv.o vesa_drv.o
cirrus_drv.o linux s3virge_drv.o vga_drv.o
cirrus_laguna.o mga_drv.o savage_drv.o
cyrix_drv.o neomagic_drv.o siliconmotion_drv.o
fbdev vga evsa 等都在其中.
只要在XF86Conf文件中的Section module段中指定了什么驱动,X就用哪个驱动.
代码:
Section “Module”
Load “dbe”
Load “extmod”
Load “fbdevhw” #这里用的是fbdev
Load “glx”
Load “record”
Load “freetype”
Load “type1”
Load “dri”
EndSection
这是XFree86 4.0以上版本的方法.即X主程序和驱动模块是分开的.
主程序是/usr/X11R6/bin/XFree86 (即上层部分)
然后主程序启动的时候根据配置文件决定用哪一个驱动.
但是,在XFree86以前的版本(3.3.6)中, X主程序和驱动模块是合在一起的,因此,以前的Xfree86 3.3.6 有很多针对不同显卡的版本.
另外其他的X服务器如KDrive 也是驱动也主程序整合的,因此同样是KDrive X服务器会有 VESA ,SVGA ,和 fbdev的版本之分.因为这些都是轻量级的X服务器,为了简化结构他做成这样.
Xfree86 4 做成驱动和主程序分离的好处是用户可以自己添加升级驱动.
远程桌面服务VNC/XRDP/Xdmcp/SSH+X11转发
VNC
使用VNC服务时,先在Linux上安装vncserver,然后在PC或其他设备上安装vncviewer。
常见的vncserver有:realvnc、tightvnc、x11vnc等。其实知名的vnc服务提供方还有tigervnc和ultravnc。
常见的vncviewer有:realvnc、tightvnc、ultravnc、tigervnc等。
realvnc viewer:https://www.realvnc.com/en/connect/download/viewer/
tightvnc viewer:https://www.tightvnc.com/download.php
ultravnc viewer:http://www.uvnc.com/downloads.html
tigervnc viewer:https://bintray.com/tigervnc/beta/tigervnc
XRDP
Windows上有一个远程桌面服务(Remote Desktop Protocol,RDP),Linux上类似的RDP服务称为XRDP。
XDMCP
Xdmcp(X Display Manager Control Protocol),即X显示管理器控制协议,由DP(Display Manager),即显示管理器。实际上X Server和X display manager之间使用XDMCP(X Display Manager Control Protocol)协议进行通信,使用端口为UDP:177。
Xdmcp的客户端方面,我推荐xmanager,下载地址:http://www.xshellcn.com/xiazai.html
Mobaxterm是个十分全面的终端软件,无论是明码文字接口Telnet、Rsh,密码文字接口SSH,图形接口Xdmcp(XServer)、RDP(XRDP)、VNC,X11 Forwarding,文件传输FTP、SFTP,甚至是串口Serial都支持。本人强烈推荐。
SSH+X11转发
这种远程桌面服务方式在服务端方面不需要进行更多的设置,只要SSH能正常访问即可。
客户端方面推荐使用Mobaxterm,只需要在对话中将Remote environment由Interactive shell修改为LXDE desktop,如下:
使用Putty也是可以的,在会话设置的Connection–SSH–X11下启用X11 forwarding:
打开终端后,执行以下命令:startlxde,就可以打开桌面了。
名词解释
X Window System
X 窗口系统(X Window System)简称X或X11,当前最新版本是X11R7。X最早是20世纪80年代由MIT开发的,为当时高端的科学工作站提供统一的窗口系统。20世纪90年代,随着硬件价格的逐渐降低,一些爱好者把X改写后运行于廉价的PC机上,这个项目后来被称为XFree86.X 窗口系统分为硬件级(驱动级)和应用程序级组件,分别称为X Server和X Client,使用X协议(XDMCP)进行通信,是典型的C/S结构。
X窗口系统是典型的C/S结构,目前最常见的X窗口系统就是Xorg,一般使用的startx,startkde,gnome-session都是启动桌面环境的脚本,它们做的事情包含了模块的检测与加载,以及运行窗口管理器等。
X Server
X Server运行在用户的本地机器上,在屏幕上完成低层的绘图操作。因为X Server直接向显卡发送信号,因此必须使用一个适合本机显卡的X Server,并配置好合适的分辨率,刷新率,颜色深度等,现在一般在/etc/X11/xorg.conf的文件就是Xorg Server的配置文件。
X Server通过鼠标和键盘监听用户的输入,并将键盘按键和鼠标点击传输给X Client,这些信息叫事件(event),它们构成了GUI编程的一个关键元素。它的逻辑扩展,MFC叫消息,GTK和Qt叫信号。
X Client
X Client是以X Window作为GUI的任何程序,如xterm,xcalc和类似Abiword之类的更高级的应用程序,通常情况下,X Client等待X Server传送的用户事件,然后通过给X Server发送重绘消息来响应,X Client不需要和X Server运行在同一台机器上,这就是为什么xterm也能远程使用。
X Protocol
X Client与X Server使用X Protocol进行通信,使得客户端和服务器能够在网络中分离,实际上是X Server和X display manager之间使用XDMCP(X Display Manager Control Protocol)协议进行通信,使用端口为UDP:177。
XFree86
XFree86是X窗口系统的其中一个实现,它主要的运作平台是Unix类操作系统。自1992年,它一直以自由发放的开放源代码模式发展,但是从2004年开始,它再不是以GPL软件许可证的形式出现,而是使用 XFree86®Project 公司所拥有的 XFree86 License version 1.1 软件许可证模式发放。于是XFree86 的开发因软件许可证的变动而出现分岐(这种事情开源界中经常发生),而派生出另一个发展自 XFree86 4.4 RC2 版本源代码,名叫 X.Org 服务器的X Window系统。
Xorg
X.Org Server是X窗口系统的参考实现,当前版本是X11R7.5,发布于2009年10月26日。
Xorg实际上应该是X.org Server,X.Org基金会开发的X Server。X.Org是负责X 窗口系统开发的组织,2004年1 月22日在Open Group的X.org网站基础上建立。
X.Org基金会的建立标志着在X的管理上发生了根本性的转变。 从1988年其X的监护人(包括过去的X.Org)----厂商组织,变成了基金会由软件开发者领导,用集市模式的社区开发,依赖外界参与的模式:成员身份向个人开放,而公司做为赞助者参与。
Xlib
Xlib是X Client间接用于产生X协议消息的库,它提供一个非常底层的API,允许客户端在X Server上绘出非常基本的元素,并响应最简单的输入,必须强调,Xlib库是一个非常底层的库,这使得Xlib库创建菜单都是一个相当费力的工程。GUI程序员不能直接调用Xlib编程,而是需要一个API,使得菜单,按钮,下拉式列表等GUI元素能够简单方便的创建,这就是X工具包(X toolkit)的作用。
X toolkit
X工具包(X toolkit)是一个GUI库,X客户端用它极大的简化了窗口,菜单,按钮的创建。使用工具包,可以通过函数调用就能创建按钮,菜单,框架以及类的东西,诸如此类的GUI元素统称为窗口部件(widget),所有现在的GUI库都能找到这个术语。历史上流行的工具包主要有Motif,OpenLook和Xt,现在更先进的是GTK+和Qt。
GTK+
GTK+来自著名的图像处理软件GIMP,是the Gimp toolkit的缩写,GTK+使用C语言开发,但是其设计者使用面向对象技术(通过使用GObject库)。 也提供了C++(gtkmm)、Perl、Ruby、Java和Python(PyGTK)绑定,其他的绑定有Ada、D、Haskell、PHP和所有的.NET编程语言。
GTK+的界面设计工具是Glade,它包含了一种描述GUI界面的XML语言,它和libglade一起工作就可以直接使用GTK和GNOME控件;新的Glade-3不再直接支持生成编程语言源代码。目前最新版本是GTK+2。
GLib
GLib是GTK+建立的一个可移植到C语言函数库,GLib定义这些类型来帮助跨平台开发,GLib提供了一组数据类型,函数和宏的标准替代集来进行内存管理和处理通用任务,以此帮助跨平台开发。使用GLib几乎是透明的,从本质上讲,Glib附加的数据类型是C语言标准数据类型的替代(为了一致性和可移植性),GLib广泛存在于GTK+中,安装GTK+的时候,GLib也默认安装了。
Xdg
Xdg是X Desktop Group的缩写是,freedesktop.org的前身,而freedesktop.org 是一个致力于提高用于Linux和类UnixOS上的自由桌面环境之间的互操作性和共享其基础技术的一个组织。在freedesktop.org下托管的著名项目有:X.org Server、D-bus、HAL、Direct Rendering Infrastructure(DRI)、GStreamer、Mesa 3D、GTK-Qt engine
Xdm
Xdm是X Display Manager的缩写,由它来启动X Window服务器,并管理图形客户端程序的登录、会话(登录成功后开启新的session)、启动窗口管理器等。如果Xdm是在本地运行,它会启动X Server,就像命令行登录的init,getty和login所做的事情一样;如果Xdm在网络上某台计算机上运行,它的行为就如同一个telnet server,验证用户名与密码,然后开始一个远程会话(Remote Session)。KDE和Gnome也提供了自己的xdm的实现,分别叫kdm和gdm。
这个概念也容易和窗口管理器(Window Manager)混扰。
xdm, gdm, wdm等,都是Display Manager
Display Manger 对多个XServer进行管理,可以管理本地的或远程的X Server。linux机器如果以运行级别5启动,启动进入的图行的用户登录的界面就是Display Manager的界面,用户在界面上输入用户名和密码,Display Manger就会启动本地上的Xserver,初始化一个X回话,一般还通过脚本Xsession启动本地的窗口管理器和桌面环境。
如果在配置文件里面设置xdmcp=true,Display Manger还通过XDMCP协议管理远程的XServer。当在Windows机器上使用XManager软件登录Linux/unix机器,其实是使用XDMCP协议登录的,用户同样输入用户名/密码登录。xdm启动一个X回话,不过这次XServer是在远程的机器上。
在X Window世界里,X Display Manager以一个程序 的方式在运行。允许在X Server上开始建立一个会话(Session)。 XDM会显示一个用户登陆窗口提示用户输入用户名和密码,当用户成功输入用户名和密码后,一个会话(Session)就建立并启动了。
如果XDM运行在客户的机器上,那么它会在显示用户登陆窗口之前启动X Server. 如果XDM运行在远端机器上,那么它的工作方式类似于Telnet服务器,需要用户输入用户名和密码来开始一个远端会话(session)。
一些常见的XDM:
- SCOlogin (provided by SCO Open Desktop) also checks for expired passwords and performs some administrative tasks
- GDM (GNOME)
- KDM (provided by KDE) allows the user to graphically select, in the login screen, a window manager or desktop environment
- XDM, the default X Window System Display Manager
dtlogin (shipped with CDE) - WINGs Display Manager (using the WINGs widget-set used in Window Maker)
entrance (employs the architecture used in Enlightenment v.17). - SLiM, which is desktop environment independent.
Kdm
KDE使用的X显示管理器(X Display Manager)
Gdm
Gome使用的X 显示管理器(X Display Manager)
Window Manager
窗口管理器是在图形用户界面的视窗系统中,控制窗口位置与外观的软件。它是负责管理与定位窗口的移动、最大化、最小化、改变大小以及关闭等工作,简而言之,就是给一个窗口加上最大化,最小化,关闭按钮标题栏和框架。Twm(Tom Window Manager)就是X.org提供的简单的窗口管理器。
常见的窗口管理器: fvwm ,fvwm2 ,twm ,mwm 等等.
窗口管理器是一个特殊的图形程序,对其他图形程序运行的窗口进行管理。为窗口提供装饰(标题栏,边框,标题栏上的按钮)和对窗口操作提供支持(改变大小,移动,控制窗口重叠), 许多窗口管理器还提供了菜单,虚拟桌面,鼠标手势等功能。
注意:X server一般只准许一个窗口管理器在运行。
如果没有窗口管理器,图形程序也是可以运行的,最新运行的图形程序的窗口会在最上端, 并且全屏显示,无法窗口切换。
窗口管理器和桌面环境是用户在 X Window 系统里的主要界面. 窗口管理器只是个程序, 它控制窗口的外表,位置和提供用户去操作这些窗口程序的方法. 桌面环境为操作系统提供了一个较完整的图形操作界面, 和提供了一定范围和用途的实用工具和应用程序.
原理:
当窗口管理器开始运作时,X服务器和客户端之间的互动,会重新导向到窗口管理器。每当要显示一个新窗口时,这个请求便会被重新导向到窗口管理器,它会决定窗口的初始位置。此外,大部分较新的窗口管理器会改变窗口的亲属关系,通常会在窗口顶部加上标题列,并在窗口周围加上装饰性的框架。这两个部分皆由窗口管理器来控制,而不是其它程式。因此,当使用者点击或拖曳那些元件时,窗口管理器会进行适当的动作(如移动或改变窗口的大小)。
窗口管理器也负责处理图示,图示并不存在于X Window核心协议的层次中。当使用者将窗口图示化时,窗口管理器会取消窗口的映射(使其不可见),并完成适当的动作,将窗口改显示成图示。某些窗口管理器并不支援图示功能。
窗口管理器主要的目标,就如同其名,是用来管理窗口的。许多窗口管理器提供附加的功能,如处理鼠标在根窗口上的点击,呈现出窗格以及其它的视觉化元件,处理按键(例如 Alt-F4 可关闭窗口),判定哪一个应用程式在启动时执行等等。
Kwin
KDE使用的窗口管理器
Metacity
Gnome的默认窗口管理器,之前GNOME陆续使用了Enlightenment和Sawfish作为它的窗口管理器。其他有名的窗口管理器还有:FVWM、Fluxbox。
Desktop
桌面环境是容易和窗口管理器混扰的概念。桌面环境一般自带一个窗口管理器,并且提供更多的实用程序。如:方便机器配置的控制中心,文件管理器,有丰富内容的任务栏等等。
常见的桌面环境: gnome, kde ,cde ,xface 等等,
窗口管理器和桌面环境大全,网站: http://www.xwinman.org/
KDE
KDE(K Desktop Environment)是基于Qt GUI的开源桌面环境,KDE中包含了大量的应用程序和工具,其中包括一整套办公套件,Web浏览器,以及一个功能齐全的KDE/Qt的IDE。现在最新的是KDE4。
GNOME
GNOME,是GNU网络对象模型环境 (The GNU Network Object Model Environment)的缩写,这反映了GNOME早期的一个目标,即为Linux引入一个像MS OLE一样的对象框架,这样就可以在文字处理文档中加入电子表格了(word/excel…)现在,GNOME的设计目标发生了变化,现在的GNOME指的是整个桌面环境,包括一个启动程序的面板,一套程序和实用工具,程序库以及开发者工具。
GNOME和KDE是目前的主流环境,而Xfce、LXDE、Openbox和Fluxbox等也已经得到了很高的应用。
窗口管理器和桌面环境大全,网站: http://www.xwinman.org/