连友农三个人的传销:第二十章 X Window配置

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 04:52:00

X Window系统是Linux的窗口系统,已经成为Linux平台上的标准配置之一。它提供了一种与设备无关的基本结构,使各种各样的图形用户界面都可以在基本的结构之上构造出来。X Window有自己的协议-X Protocol,任何硬件只要支持X Protocol,就可以执行应用程序,显示各式样的窗口,不需要重新编译与链接。X Window的方便性与灵活性正在被越来越多的用户所接受与认同。

 

重点内容

Ø        X Window有什么特点

Ø        X Window的运行原理

Ø        X Window的配置

Ø        启动与关闭

Ø        远程管理


 

20.1  X Window简介

20.1.1      基于网络的(Network Based)图形窗口系统

X Window本身是一种基于网络协议的窗口,任何硬件只要遵守X Protocol,就可以进行相应的窗口显示工作。从大型计算机到个人PC,每一种Unix系统都支持X Protocol,目前的Unix与类Unix操作系统上的窗口系统基本上都是X Window。

 

图一       漂亮悦目、功能丰富的X桌面(FVWM

20.1.2      自由的窗口环境

X Window向用户提供基本的窗口功能支持,而显示窗口的内容、模式等可由用户自行定制。这一点与Microsoft Windows不同,Microsoft Windows要求必须在统一风格与显示模式的窗口下运行。在用户定制与管理X Window系统时,需要使用窗口管理程序。窗口管理程序包括AfterStep、Enlightenment、Fvwm、MWM和TWM Window Maker等,供习惯不同的用户选用。

可以定制的窗口环境在给用户带来了个性化与灵活性的同时,要求用户有相对比较高的使用水平。不过这种机制带来的好处也是明显的,它不象Microsoft Window那样将窗口元件的风格、桌面、操作方式等千篇一律地规定死,只可以换一下墙纸、图标、调整字体大小等等,在X Window系统中可以有多种桌面环境的选择。

20.1.3      不是内置于操作系统

X Window与Microsoft Windows相比有另一个很大的不同,那就是X本身只是一系列应用软件,而不象Microsoft Windows那样是操作系统的一部分。单纯做为服务器运行的Linux系统可以完全不使用X而运行,但Microsoft Windows是不可能的。

这种做法的明显长处体现在系统优化时,无论在Microsoft Windows和Linux平台上,图形化界面都是一个占用很多资源的系统。在Linux计算机上,我们可以为了效率而完全舍弃X Window系统,在安装的时候就不选择它。所以我们虽然在这里讲X Window如何如何用,但如果您的服务器用途单一,传统的命令行管理方式就可以胜任,那么还是不推荐大家安装使用X Window。即使在运行一段时间后又想用X Window系统,直接用RPM包等方式安装上就可以了,很方便,就象使用其他软件一样。这个灵活性可是Microsoft Windows不具备的,无论怎么简化Windows版的操作系统,我们都要背着图形界面这个大包袱。

20.1.4      X Window发展简史

其实X Window系统的诞生早于Microsoft Windows,产生于1984年麻省理工学院与DEC公司的一个合作计划。麻省理工学院(MIT)的电脑科学研究室当时正在开发一套网络分布式系统,而DEC公司的工作正在MIT做Athena计划的一部分,两个项目都需要一套可以在Unix平台上运行的窗口系统,这样合作就开始了。他们把这个窗口系统称为“X”,因为它是以一个取自斯坦佛大学的实验性窗口系统“W”为基础设计开发出来的,开发人员便用字母W后面的X来命名这个系统。

到了1985底,X的第10版本(X Version 10)正式发布,DEC公司随后在第二年初发布了VAXstation-II/GPX,这是第一套商业的Unix图形操作界面,其版本定为X Version 10,release 3,简称X10R3。从此X Window就开始被人们广泛接受,并纷纷在不同的Unix平台上着手开发使用。

1988年,麻省理工学院成立了X Consoritium组织,并将X Window的开发控制友移交给X Consoritium,此后的X Window后续版本都由他们来开发和发布。X Window进入了一个高速发展期,1988年3月,X11R2发布;12月的时候X11R3发布,至1994年4月,X协议的一个最稳定的版本-X11R6诞生了,此时的X协议的功能大致确定,我们至今使用的还是这个版本。

20.2  组成X的基本元素

X Window系统由三个基本元素组成:X Server、X Client和二者通信的通道。

 

X 系统基本结构图(来自http://www.X.org

20.2.1      X Server

X Server是全部X Window系统的核心,是运行在系统后台的进程,管理用户图形界面的显示,键盘、鼠标等输入设备与后台程序的通讯等。它最重要的功能是显示。

自由软件编写者或厂商开发出了多种X Server,如:

XFree86。这是运行在大多数Linux系统上的X Server,Redhat上也是如此。

Accelerated X。由Accelerated X Product开发,在图形的加速显示上做了改进。

X Server suSE。SuSE Team’s开发。

20.2.2      X Client

X Client是X Window中的用户端程序。X Client与X Server也符合标准的Client/Server模式的特点,多种多样的X Client程序向Server发出请求,由Server运算得出结果(在X Window中就是图形等东东了),再显示到指定的地方去,如本地或者远程的一台显示器。

20.2.3      X通信通道

       X通信通道的主体是xlib(X函数库)。X client调用xlib,利用相应的通讯功能向X Server发出请求;X server完成任务之后,同样调用xlib把结果显示指点的设备上去。

20.2.4      一些X Window其他的组成要素

X Toolkit

X Toolkit是利用X Library来进行开发的工具箱,简化X窗口程序的设计工作。X Window系统让用户可以自行设计个性化的桌面、窗口,我们获得了完全自主的使用权力。但随之而来的是复杂的程序设计过程,一个用户在能够使用图形界面之前,要用很多的时间去定义窗口大小、桌面的摆设、时钟、状态条等桌面元素都要需要自己定制,“白手起家”。这样做很麻烦,让用户把很多时间花费在重复性无意义的劳动上。而初学者往往要花更多的时间去学习掌握这些方法,他们中间的大部分人也许在中途就会厌烦,跑去用Microsoft Windows了。

X Toolkit正是被开发出来解决这个问题的,有了这个工具箱,我们就可以利用它本身包含的X程序设计结构与函数来建构用户图形界面,大大加快设计进程。

Linux下常用的的X Toolkit有X Toolkit、OpenLook Toolkit、Xforms等。

窗口管理器-X Window Manager(X WindowM

X Client提出服务请求,由X Server来显示各种各样的窗口,但这时候客户还不能使用这些窗口。因为X Server只负责建立这些窗口,在其中写入文字或者画图、控制输入设备等,它所创建的窗口会一个叠一个地堆积在你的屏幕上,不能操纵和移动,也无法改变大小和最小化,而所有这些工作都依赖于窗口管理器,英文为X Window Manager(X WindowM)。

窗口管理器是用来控制X环境中窗口行为的,它的功能包括:启动画面、背景图案与颜色、每个窗口的字体与颜色、按钮与菜单、桌面设置,以及移动、放大、缩小、打开、关闭窗口等。

目前有多种窗口管理器可供用户选用,如FVWM、Afterstep、AMIWM、Blockbox、Enlightenment、WindowMaker等数十种。使用了不同的窗口管理器,就有不同风格的窗口外形、桌面设置与菜单。

20.3  X系统的运行原理

20.3.1      典型的Client/Server结构

在Client/Server结构下,客户机和服务器与负责二者进程通信的网络操作系统共同组成了一个支持分布计算、分析和表示的网络系统。在这个系统中,应用程序可以分为前端的客户应用程序和后端的服务器应用程序两部分。由客户机发出请求,网络通信系统将请求的内容传到服务器,服务器根据请求完成预定的操作,然后把结果送回给客户机。

X Window也是这样的一个系统。X Client作为客户端,通过通道向X Server发出请求,如:

“以距离屏幕右边300像素,距离屏幕下方200像素这一点为圆心,以35像素为半径,画一个圆。这个屏幕是某某机器上的某某显示器”。

X Server接到请求后,做为计算机硬件与应用程序的接口,会处理请求。X Client只需向Server发出请求,而不必知道这个动作具体的执行细节,按照请求去画圆并寻找目标显示器去显示这是X Server的任务。

20.3.2      X Window与操作系统的不相关性

我们都习惯了Microsoft Windows中Windows与操作系统结合的方式,在安装的时候大家就会注意到这一点,定制软件的时候安装程序不会给出“是否需要安装Windows图形界面?”这样一个询问,而是强制性地把本机的操作系统与Windows绑定在一起, Windows视窗本身就是操作系统的一部分。本地的输出结果就在本地显示。而我们在安装Linux的时候,就会注意到安装程序会把X系统做为一个可选的程序组,如Redhat的安装组件选择界面中就会给出

“是否安装X系统?”

“是否安装Gnome桌面系统?”

“是否安装KDE桌面系统?”

“是否安装相应支持与开发程序?”

这样的复选框,让你可以从中选择是否安装X Window系统,或安装哪些组件。不安装这些程序系统一样能正常运行,只不过没有用户图形界面,操作不直观罢了。而对那些任务繁重的服务器来说,这是太好的特点了,没有Windows系统,就少了一个沉重的包袱,服务器可以省出相当多的资源向用户提供其他服务了。而一台服务器只要设置好,平时并不会有太多的管理工作,终端的命令行操作就完全能胜任了。

20.3.3      网络透明性

我们已经介绍过,X Client与X Server在通信通道中进行交流,二者都遵守相同的通信协议,就是X11R6。支持X11R6的系统都可以进行Client/Server结构的通信、交互操作,包括结果显示。所以Linux可以与AIX系统、Solaris、FreeBSD的X Window相互操作,就是因为它们都支持X11R6的协议标准。有了相应的软件,甚至Microsoft Windows都可以与Linux进行X相互操作,我们后面会说明这一点。

而且由于通信是基于网络协议的,Client、Server和显示器可以完全分离,分布在办公环境的局域网中,甚至是广域网中。我们以X Window的远程控制方式来说明这一点。

使用远程计算机上的X系统

如图,用户在本地Linux计算机并不安装X Window,用户通过相应的程序远程调用X计算机上的Client,运行Server,再把运行结果送回本地来显示。著名的X Window远程控制软件Xmanager就是利用了这个原理,它可以实现在Microsoft客户端上远程管理X Window系统。

Windows XP中的Xmanager,深色窗口为被控的远程Linux计算机

Xmanager安装在Microsoft机器上,提供了两类基本元件:与X Window Client交互操作的程序和接收X Server的信息,并在Microsoft屏幕上显示X窗口动作的程序。Xmanager向远程X Window Client发出命令,X Client执行后,把结果传给X Server,要求显示,X Server又从远程把显示结果传到本地的Microsoft屏幕上来。具体完成管理功能的是X Client,而向用户展示结果的,是X Server,这样就实现了对远程计算机的X Window图形控制。请大家用心体会。

20.4  X系统的配置

XF86Config是XFree86的配置文件,通常放置在/etc/X11目录下,XF86Config文件的结构分为不同的部分(Section),分别对不同的内容加以定义和设置。因为我们的X Window系统是否能正常运行与此文件密切相关,所以这里重点介绍一下。

文件表达的方式是以“Section”为基础的,每一个“Section”定义了X Window某些方面的内容,格式为:

Section  "SectionName"                                            

    SectionEntry                                                   

    ...                                                            

EndSection                                                        

其中SectionName字段中可以填入下列内容:

SectionName                说明

ServerLayout   全局配置                                   

Files          文件的路径                                  

ServerFlags    Server标记                                   

Module         需要动态装入的模块                      

InputDevice    输入设备                                                

Device         图形显示设备                                 

VideoAdaptor   Xv图象适配器                                  

Monitor        监示器                                            

Modes          图象模式                                       

Screen         屏幕控制                                        

DRI            DRI配置                                        

Vendor         厂商进行的设置                            

       注:早期XF86config版本中的“Mouse”和“keyboard”部分已经被“InputDevice”部分代替。

下面我们将常用的定义部分向大家介绍一下:

20.4.1      ServerFlags   

这里用来规定一些X Server的全局配置,这里面的选项都是可选项,不是必须的。ServerFlags部分在XF86config配置文件中含有多个同样的部分时(如多个“Device”,说明哪一个是生效的“Device”。也可以没有ServerFlags部分,这时XF86config文件中的第一个选项将生效。

20.4.2      ServerLayout  

ServerLayout部分是最高一级的配置,也是全局有效的。它将一个(或多个)“Screen”部分与一个(或多个)“InputDevice”部分结合起来形成一个完整的配置。在XF86config文件中可以有多个ServerLayout。就如在ServerFlags中说明的,放在第一个部分的是有效的ServerLayout,或者在ServerFlags部分中以"DefaultServerLayout"来指定哪一个有效也可以。

示例:                                                                                          

Section "ServerLayout"                                                                    

        Identifier     "Anaconda Configured"                                

        Screen      0  "Screen0" 0 0                                          

        InputDevice    "Mouse0" "CorePointer"                            

    InputDevice    "Mouse1" "SendCoreEvents"                                    

        InputDevice    "Keyboard0" "CoreKeyboard"              

EndSection                                                                                     

20.4.3      Files 

Files部分用来定义X Server在运行时需要的路径名称,其中包括:

20.4.4      FontPath “path”

这个路径是X Server用来寻找字体库的,我们可以同时规定多个路径,如下面的例子:

   FontPath    /usr/X11R6/lib/X11/fonts/local/           

   FontPath    /usr/X11R6/lib/X11/fonts/misc/          

   FontPath    /usr/X11R6/lib/X11/fonts/75dpi/         

   FontPath    /usr/X11R6/lib/X11/fonts/100dpi/        

   FontPath    /usr/X11R6/lib/X11/fonts/Type1/        

   FontPath    /usr/X11R6/lib/X11/fonts/CID/           

   FontPath    /usr/X11R6/lib/X11/fonts/Speedo/       

   FontPath    /usr/X11R6/lib/X11/fonts/75dpi/         

   FontPath    /usr/X11R6/lib/X11/fonts/100dpi/        

注:在X Server启动的时候,也可以从命令行设置FontPath,而命令行的FontPath各类值优先级大于XF86config文件,所以生效的是命令行中的设置值。

20.4.5      RGBPath

为RGB色彩库设置路径,如果这里不设值,则X Server会使用默认的RGB路径:

             RgbPath       "/usr/X11R6/lib/X11/rgb"                                  

20.4.6      ModulePath

为可以装入的X server模块设置路径,同样也可以规定多个路径

20.4.7      Module     

这里说明那些X Server可用的动态装入的模块。

注:如果编译的时候使用了静态模式,则此选项不生效。

在Module部分中定义有两种形式,一种是最常用的“load”形式,一种是“subsection”形式。使用load选项时注意要输入模块的名称,而不是模块文件的名称,这一点非常重要,否则会报错。

示例:                                                                                   

Section "Module"                                                                     

        Load  "dbe"                                                              

        Load  "extmod"                                                        

          Load  "fbdevhw"                                                      

          Load  "dri"                                                               

        Load  "glx"                                                              

        Load  "record"                                                         

        Load  "freetype"                                                       

        Load  "type1"                                                           

EndSection                                                                              

20.4.8      InputDevice 

InputDevice部分是用来定义输入设备的,也就是用什么键盘鼠标来输入。XF86config中会包括多个InputDevice部分,而且至少要有两个:一个主要的键盘和一个主要的鼠标。

Section "InputDevice"                                                                     

        Identifier  "Keyboard0"                                                     

        Driver      "keyboard"                                                    

    Option     "XkbRules"     "xfree86"                                                 

    Option     "XkbModel"    "pc105"                                                   

    Option     "XkbLayout"   "us"                                                        

    #Option   "XkbVariant"   ""                                                            

    #Option   "XkbOptions"  ""                                                            

EndSection                                                                                     

Section "InputDevice"                                                              

        Identifier  "Mouse0"                                                  

        Driver      "mouse"                                                

        Option      "Protocol" "PS/2"                                   

        Option      "Device" "/dev/psaux"                             

        Option      "ZAxisMapping" "4 5"                      

        Option      "Emulate3Buttons" "no"                          

EndSection                                                                              

Section "InputDevice"                                                              

    Identifier "Mouse1"                                                              

    Driver            "mouse"                                                         

    Option            "Device"         "/dev/input/mice"                        

    Option            "Protocol"              "IMPS/2"                            

    Option            "Emulate3Buttons"  "no"                                   

    Option            "ZAxisMapping"            "4 5"                           

EndSection                                                                              

20.4.9      Device        

我们在“Device”这一部分定义所使用的显示卡类型。也可以有多个“Device”部分。

示例:

Section "Device"                                                                             

    # no known options                                                                            

    Identifier   "RIVA TNT2"                                                            

        Driver       "nv"                                                           

        VendorName   "RIVA TNT2"                                            

        BoardName     "RIVA TNT2"                                   

                #BusID                                                              

EndSection                                                                                     

20.4.10    Monitor      

定义所使用的监示器。

示例:

Section "Monitor"                                                                           

        Identifier   "Monitor0"                                                     

        VendorName   "Monitor Vendor"                                       

        ModelName    "Monitor Model"                                       

        HorizSync   31.5-48.5                                                     

        VertRefresh 50-70                                                             

        Option "dpms"                                                                  

EndSection                                                                                                          

20.4.11    Screen        

“Screen”部分用来绑定Device部分中定义的显示卡和Monitor部分中定义的监示器。

示例:

Section "Screen"                                                                             

    Identifier   "Screen0"                                                                 

        Device       "RIVA TNT2"                                             

        Monitor      "Monitor0"                                                 

    DefaultDepth  24                                                                         

    Subsection "Display"                                                                    

            Depth       24                                                           

                Modes       "800x600" "640x480"                    

    EndSubsection                                                                                   

EndSection                                                                                     

 

20.5  X系统的启动与关闭

在一般的Linux与其他Unix的图形环境中,用户都选择安装某一种桌面系统。我们进入X Window,实际上是进入了某个桌面系统。

通常的X启动方式有两种:startx命令和显示管理器启动。

20.5.1      startx命令启动

在控制台输入startx即可

# startx                                                                        

startx实际上启动了/usr/X11R6/bin/xinit,用来启动X Window的Server程序,并且提供用户界面,启动X Client。

20.5.2      显示管理器(Display Manager)方式启动

显示管理器又以它的英文缩写,在很多资料书中称为dm。它与startx启动有一个显著的不同,就是会启动一个用户登录验证的界面。在此界面中,用户需要提供用户名/密码来登录。不仅如此,还可以执行一系列的登录任务。登录任务可以看做是用户的图形登录脚本,进入图形界面的时候,可以把一些X应用程序启动起来,如窗口管理器、设备管理器、网络设置和打印机监视器等。

目前常用的显示管理器有xdm、gdm两种。xdm是普遍使用的,gdm是Gnome开发的 dm,是Gnome开发计划中的一部分。    以显示管理器方式来启动X Window,执行下列命令之一即可:

# xdm                                                                   

# gdm                                                                   

# init 5                                                                  

20.5.3      自动启动X Window

       Linux系统在启动之后,可以直接进入X Window的登录界面。这通过修改/etc/inittab文件可以做到。大家可以在文件中找到这一行:

       id:5:initdefault: 或者是   

id:3:initdefault

id如果是5,表示系统启动后会进入运行级别5(run-level 5),X Window模式登录;如果是3,表示进入运行级别3,终端控制台模式登录。通过修改这个数值,就可以让本机在下次启动的时候进入某种模式。运行级别与/etc/inittab文件在第十二章《系统启动与关闭》中会详细解释。

我们还会在/etc/inittab文件中找到下面两行

# Run xdm in runlevel 5                                                 

x:5:respawn:/etc/X11/prefdm –nodaemon                         

表示启动级别是5时,系统会启动/etc/X11目录下的prefdm脚本。在这个脚本文件中首先规定了在此次脚本任务中的PATH值。

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin       

但更重要的是指定了系统将以哪一个显示管理器来启动X Window任务。

preferred=                                                                    

if [ -f /etc/sysconfig/desktop ]; then                                

        . /etc/sysconfig/desktop                                   

        if [ "$DISPLAYMANAGER" = GNOME ]; then  

                preferred=gdm                                  

        elif [ "$DISPLAYMANAGER" = KDE ]; then      

                preferred=kdm                                  

        elif [ "$DISPLAYMANAGER" = XDM ]; then    

                preferred=xdm                                  

        fi                                                                   

分析脚本可知,系统会查看/etc/sysconfig/desktop文件的内容,读入指定的桌面环境类型,如Gnome、KDE和传统的显示管理器--XDM等。我们知道在Redhat Linux中,Gnome是默认的桌面环境,所以Redhat中会启动GDM做为显示管理器,在它的desktop文件中,会如此规定:

DESKTOP="GNOME"                                                   

所以我们如果想更换不同的显示管理器,就可以更改/etc/sysconfig/desktop文件中的内容,换为“KDE”或者“XDM”即可。

提示

更换了KDE显示管理器,并没有确定到底是选用了哪一种桌面环境。在显示管理器启动后,我们还是可以通过选择不同的启动任务来进入相应的桌面环境,无论是哪一种显示管理器。

20.5.4      手工启动X Window

       当操作系统的默认运行级别是3时,会以终端模式登录。这时想启动X Window,切换到运行级别5就可以了,运行下面的命令:

       # init 5                                      

系统会执行同默认运行级5启动时同样的操作,以dm启动X Window。执行相应的脚本与程序,读入环境变量,执行X登录任务(X Session),进入X Window。

       在命令行中,也可以运行/usr/X11R6/bin下的startx脚本命令来启动X Window。

       # startx                                     

startx脚本中指定了用户的X Window启动时,哪些XXXXX会被启动,这是通过选择xinitrc来完成的,在startx文件中:

userclientrc=$HOME/.xinitrc                                   

userserverrc=$HOME/.xserverrc                             

sysclientrc=/etc/X11/xinit/xinitrc                              

sysserverrc=/etc/X11/xinit/xserverrc                        

。                                                                         

。                                                                         

。                                                                         

if [ -f $userclientrc ]; then                                       

    defaultclientargs=$userclientrc                          

elif [ -f $sysclientrc ]; then                                      

    defaultclientargs=$sysclientrc                                  

fi                                                                          

分析可以得知,系统会首先在用户home目录中寻找.xinitrc和.xserverrc两个文件,如果不存在,则使用系统默认的/etc/X11/xinit/xinitrc和/etc/X11/xinit/xserverrc替代。

.xinitrc是用来指定运行哪些程序来启动X Window,Xclients指定有哪些资源设置和应用程序启动。

if [ -f $userserverrc ]; then                                      

    defaultserverargs=$userserverrc                       

elif [ -f $sysserverrc ]; then                                    

    defaultserverargs=$sysserverrc                         

fi                                                                         

20.5.5      关闭X Window

       如果是用startx运行X Window。想结束X Window任务,退回字符终端模式,可以用系统菜单的退出按钮并确认,这样就会退出X。

第二种退出X的方式是使用Alt+Ctrl+Backspace(回退键)的组合,同样可以达到效果。

但如果系统以默认运行级别或者执行init5或者dm运行X Window的话。用户会发现用上述方法退出之后,系统会自动回到登录的主画面,再选择就只有重启系统和关机了。这种时候,我们只要把系统运行级别切换到3即可,在图形界面中的模拟终端或者“运行命令”中输入init 3:

       # init 3                                                                                

       就会结束X Window任务,回到终端状态。

技巧

如果只是想临时离开X Window界面,完全不必要关闭。Linux通常会启动一个图形界面和多个字符终端,它们之间使用Alt+F1、F2、F3等切换。暂时离开,使用Alt+F1就可以进入第一个字符终端,以此类推。以后使用Alt+F7就可以回到图形界面下,原先的程序也不会丢失。

 

20.5.2      使用 xf86config来配置/etc/X11/XF86config

我们还可以通过xf86config命令来配置XFee86 server。只需在命令行中运行xf86config即可。

# xf86config                                                           

系统会显示一个步进式的配置界面,一个一个地设置XFee86中的各个选项。如果对/etc/X11/XF86config文件熟悉的话,使用xf86config不成问题,在这里就不多描述了。

20.6  X Window的远程管理

20.6.1      Linux控制Linux-远程控制软件-VNC

VNC是由美国剑桥大学中的AT&T实验室开发的,可以为我们从远程控制Linux和Unix提供可能。安装了VNC Server之后,用户可以从Linux、Microsoft Windows和部分Unix(如Solaris)工作站上远程控制这些主机。VNC不但支持使用VNC自带的客户端连接远程的VNC服务器,更可以方便地从本机的Internet浏览器连接过去。

20.6.1.1  VNC工作原理

VNC结构原理图

VNC Server:安装在被控制的计算机上,负责与被控计算机的应用程序与控制计算机的通信联系。图中的Xvnc就VNC Server的程序。在VNC Viewer试图连接被控制主机的时候,VNC Server还会要求输入密码,通过验证之后才可以进行控制,保证安全。

VNC Viewer:安装在做控制端的计算机上,通过Viewer就可以显示远程主机的X界面,并进行操作。

VNC Protocol:VNC协议负责Viewer与Server的通信。

20.6.1.2  VNC的安装和运行

在下面的网址可以取得VNC的最新版本。目前VNC最新为3.3.7版本。

http://www.uk.research.att.com/archive/vnc/index.html

VNC的安装

一般可以把VNC安装在/usr/local/bin下

1.  把安装文件解压

# gzip  –d  vnc-3.3.7-x86_linux.tar.gz  |  tar  xvf  –

2.  进入解压目录后,可以找到vncinstall文件,执行它

# ./vncinstall   /usr/local/bin

安装程序会把vncserver、vncconnect、vncviewer、vncpasswd几个可执行文件拷贝到/usr/local/bin下面,VNC将来工作就主要靠这几个文件来操作。

3.  建立/usr/local/vnc目录,并将子目录class中的文件都拷贝过去。

# mkdir   /usr/local/vnc

# cp  classes/*  /usr/local/vnc

4.  设置VNC密码

vncpasswd

提示

密码文件保存在/root/.vnc/目录下,名称就是vncpasswd。安装程序不会自行创建/root/.vnc目录,密码文件就不会成功生成。所以第一次运行vncpasswd命令时,要手工创建这个目录。

5.  启动VNC的server

# vncserver:10

X Server默认占据显示设备0,所以VNC只能使用以后的显示设备,示例命令中使用了10。用户可以选用从1开始的任何正整数,但没有特殊原因也不宜过大。

6.  使用vncviewer远程控制

# vncviewer  远程主机名:10

主机名称也可以换为IP地址。注意此时连接的设备号需要与Server启动时的一致,如Server启动时设备为10,则Viewer也要用10去连接,否则不会成功。

也可以用本机的浏览器来连接,在地址栏中输入:

http://远程计算机名:5810

端口号为5800+设备号。例子中的Server设备号为10,浏览器的请求端口就为5810。

如果一切都没有问题,这时远程主机的X界面就会出现在本地,我们就可以进行控制了。

应用实例:用xinetd启动VNC

VNC的启动依靠VNC Server,这个Server本身是一个后台监听程序,可以通过xinetd来启动。这样可以简化启动过程,并且让系统的活动进程比较少,提高资源的使用效率。还可以借此定义多种登录模式,如分辨率大小、颜色等。

xinetd的配置文件在/etc/xinetd.d目录中,在其中新建一个文件,名称为/etc/xinetd.d/xvncserver。如果我们想以(800x600,16位色)、(1024x768,16 位色)、(800x600,24位色)和(1024x768,24位色)四种模式登录本台主机,则需要在新创建的xvncserver中做如下规定:

# 以800x600x16模式登录                                                                      

service vnc-800x600x16                                                                           

{                                                                                                             

      protocol = tcp                                                                                          

    socket_type = stream                                                                        

    wait = no                                                                                            

    user = nobody                                                                                   

    server = /usr/bin/Xvnc                                                                       

    server_args = -inetd -query localhost -once -geometry 800x600 -depth 16

}                                                                                                              

# 以1024x768x16模式登录                                                                    

service vnc-1024x768x16                                                                         

{                                                                                                             

          protocol = tcp                                                                        

          socket_type = stream                                                            

          wait = no                                                                               

          user = nobody                                                                       

          server = /usr/bin/Xvnc                                                           

          server_args = -inetd -query localhost -once -geometry 1024x768 -depth 16

}                                                                                                              

# 以800x600x16模式登录                                                                      

service vnc-800x600x24                                                                           

{                                                                                                             

          protocol = tcp                                                                        

          socket_type = stream                                                            

          wait = no                                                                               

          user = nobody                                                                       

          server = /usr/bin/Xvnc                                                           

          server_args = -inetd -query localhost -once -geometry 800x600 -depth 24

}                                                                                                             

# 以1024x768x16模式登录                                                                    

service vnc-1024x768x24                                                                         

{                                                                                                             

          protocol = tcp                                                                        

          socket_type = stream                                                            

          wait = no                                                                               

          user = nobody                                                                       

          server = /usr/bin/Xvnc                                                           

          server_args = -inetd -query localhost -once -geometry 1024x768 -depth 24

}                                                                                                                   

还需要在/etc/services中添加以下服务与端口号的对应关系:

# vi /etc/services                                                                                      

vnc-800x600x16 5931/tcp                                                                         

vnc-1024x768x16 5932/tcp                                                                        

vnc-800x600x24 5933/tcp                                                                         

vnc-1024x768x24 5934/tcp                                                                        

存盘退出后,重启xinetd

# kill –HUP ` cat /var/run/xinetd.pid`

修改Xaccess文件

在/etc/X11/xdm/Xaccess文件中规定哪些远程计算机可以访问本机的X服务,找到下面这一行:

# *        #any host can get a login window

把最前面的“#”号去掉就可以了。

这时候就可以用VNC Viewer去远程连接了。如果我们使用800x600,16位色的模式登录:

       # vncviewer 主机名称:31

31号显示设备会监听在5931号端口上,其他模式依此类推。这时可以xinetd就会响应请求,启动VNC Server。VNC Viewer就可以远程连接了。

20.6.2      Microsoft Windows控制Linux--X-manager

虽然VNC也有Microsoft版本,但是在Microsoft Windows用得更多更广泛的软件是Xmanager。使用X Manager,不需要在被控的Linux计算机上安装软件,只需要在相关的设置文件做一些更改就行了。

20.6.2.1  在Microsoft Windows上安装X Manager

X Manager的安装文件只有一个,尺寸在7MB左右。安装完成后会生成相应的程序组目录。

1.  X Manager的应用程序

X Manager的主要应用程序有三个:

Xmanager:中心控制。可以更改配置和启动其他X Manager程序。

X Browser:在这里可以发现远程X计算机,并连接其图形界面

X start:可以以设定好的参数去连接远程X计算机,并启动一个xterm终端

我们主要用的程序是X Browser。

2.  在被控的主机上修改配置文件:

修改/etc/X11/xdm/Xservers文件,在最后面加上X Manager所在的计算机:

192.168.0.185:1   # 允许访问的远程主机号和显示设备号

注意此设备号不能用“0”,上面一行“:0 local /usr/X11R6/bin/X”已经规定了X Server会占用设备0。

3.  确认XDMCP启动,

# vi   /etc/X11/xdm/xdm-config

DisplayManager.requestPort: 0此项设置未被注释(最前面没有!字符),如果注释将XDMCP将不侦听UDP177端口

在文件的最后加入下面两行:

DisplayManager*startup: /usr/local/bin/X Servertartup       

DisplayManager*reset: /usr/local/bin/XReset                     

表示X Manager启动和重置是执行X Servertartup和XReset文件。

然后在/usr/local/bin中建立相应的X Servertartup和XReset文件。

/usr/local/bin/X Servertartup文件内容如下所示:

sessreg -a -l $DISPLAY -x /usr/X11R6/lib/x11/xdm/Xservers $USER

/usr/local/bin/XReset文件内容如下所示:

sessreg -a -l $DISPLAY -x /usr/X11R6/lib/x11/xdm/Xservers $USER

最后修改/etc/X11/xdm/Xaccess文件内容中一条如下:

#* #any host can get a login window

把前面的“#”号去掉即可。

20.6.2.2  用X Manager连接Linux计算机

在Microsoft Windows计算机上运行X Browser,将会在主窗口中查看到配置了的可以用X Manager连接的计算机,以图标的方式显示出来。双击图标就可以打开不同的计算机。X Manager会调用相应的显示管理器,让用户进行登录。

20.6.3      X的传输加密

虽然X Window的远程访问高效灵活,但还是有其在安全上的薄弱之处,其中一个重要的隐患就是X的明文传输。X Server与X Client在网络上进行信息交流的时候,很可能有隐藏的第三者利用监听工具窃取着传输的内容,造成信息的泄漏。处理明文信息被监听的相应对策一般是网络传输的加密。

Linux中通常的加密传输手段是使用SSH协议。利用它的端口转发隧道功能,让那些明文传输的服务如r*服务,POP3,SMTP,FTP,LDAP等等通过SSH的加密隧道传输,X Window的传输同样如此。这么做需要首先在Linux计算机上安装SSH服务器,并建立加密隧道,并设置让所有X通讯通过加密隧道进行,这样等于在明文的信息上面加了一层加密保护的外壳,达到了安全的效果。有关如何用SSH建立加密隧道的详细方法我们会在《Linux安全管理》一书中进行介绍。