Running applications remote with X11
 
    ArticleCategory: [Choose a category, do not translate
    this]
    UNIX Basics 
 
    AuthorImage:[Here we need a little image from you]
    
 
 
    TranslationInfo:[Author + translation history. mailto: or
    http://homepage]
 
    original in en Guido
    Socher
 
    en to zh Xu Gang
    
    AboutTheAuthor:[A small biography about the author]
 
    Guido 喜欢Linux不但因为了解操作系统如何工作是一件有趣的事,
    而且也应为沉迷于它的设计的人们
 
    Abstract:[Here you write a little summary]
    许多第一次使用Linux的用户认为Linux的图形桌面只是另一个可以在不同的
    窗口运行程序的  "Windows"。一些人注意到了自己可以拥有好几个桌面。但是,
    Linux X Window System (X11)绝不仅仅只是这么简单!
    它是一个网络窗口系统(network windows system)。下面我们将看到它能提供哪些新的、强大的功能。
 
    ArticleIllustration:[This is the title picture for your
    article]
    
 
 
    ArticleBody:[The article body]
 
    Display的概念
 
    每个X Window应用程序在启动的时候都会去读取DISPLAY这个环境变量来
    确定要把图像送到哪台计算机的显示器。这个再配合X的网络性能使远程运行
    图形化程序成为可能。当你远程操作一个应用程序的时候,你用的是远程那台
    计算机的CPU资源。完整的图形化用户界面(GUI:Graphical User Interface)将显示在你本地的
    计算机上。
    在这里,网络速度当然也是一个需要考虑的因素,不过普通的10Mbit/s连接的局域网就足够了。
    
 
    
      
    
    
     
 
    为什么你要这么做?
    有很多“network graphics”的应用程序。一些公司使用这类程序来远程控制设备,
    而这些设备可能远在几千公里之外,你可以用同样的软件来控制它们,就好像你就在
    那里一样。
    你可能有两台机器,一台高速的1GHz的电脑,另一台133MHz的老奔腾。
    你可以尽情的享受新机器,但是不必坐在它前面。也许你的妹妹正坐在那台新电脑前
    并登录在上面。但这并不影响你使用你的新电脑的功能
    
        
    怎样实现?
    所有的X Window应用程序,如:gimp,xterm,konquerer,netscape等等都是
    一个网络客户端,它们都连到一个服务器上,这就是:X-server。
    X-server的任务就是告诉图形硬件,在你的显示器上绘制图像,读取鼠标和
    键盘的输入。客户端(也就是你的应用程序比如:gimp,netscape等等)发送
    诸如怎么样绘制框架、按钮等指令给X-server,反过来,客户端从X-server接收
    鼠标和键盘的事件。很显然,你需要某种验证,否则任何人都可以弄乱别人的屏幕了。
    这里有两个程序来进行控制:
    
    - xhost: 使用这个程序你可以允许给定机器上的任何用户写你的屏幕。
    比如:你正坐在一台叫philosophus的机器前,为了允许主机movietux上的任何程序
    可以写你的philosophus的屏幕,你可以键入如下命令:
 
    xhost +movietux
    必须在philosophus的shell下键入
    
    - xauth: 这是一个基于cookie的可靠的验证方法。这里你可以给单独的人设定权限。
    这种方法比xhost安全很多,它使用存储在用户主目录里的文件.Xauthority里的cookie,
    如果远程的机器在这个文件里有一个有效的cookie,则同意访问。为了拷贝你面前的
    机器(philosophus)的cookie到你想要在运行程序的机器(movietux)里,你可以
    使用下列方法中的一种:
    
    xauth extract - philosophus:0.0 | ssh movietux
    /usr/X11R6/bin/xauth merge
 or
 
    scp ~/.Xauthority movietux:
    
    在程序开始运行之前经过了如下的过程:
    
    
      - 客户端检查DISPLAY环境变量来查找另外的服务器,连接到这台主机的X-server上。
 
 
      - 服务器端检查客户端是否被允许发送给自己,如果客户端是经过验证的,则服务端
      将开始在屏幕上显示图像。
 
    
    环境变量DISPLAY的语法:
    
    bash:export
    DISPLAY=hostname:displaynumber.screennumber
    tcsh:setenv DISPLAY hostname:displaynumber.screennumber
    在这里不讨论displaynumber和screennumber,它们通常是0:0
    这是一个bash下的例子:
 
    export DISPLAY=philosophus:0.0
 
    远程启动一个应用程序
    
    在理论过后,我们来看一个实际的例子。我们重新回到philosophus这台机器前,并且准备
    在movietux机器上远程运行一些程序。
    
    
      - 告诉你的X-server允许movietux上的客户端再你的屏幕上显示图像:
      xhost +movietux 
      - 登录到远程主机movietux:
      slogin -l username movietux 
      - 现在你已经登录到movietux上,并且你执行的每条命令都在movietux上执行
 
      
      - export DISPLAY=philosophus:0.0
 
 
      - 运行程序 比如:
      netscape & 
    
    如果movietux是一台比较强劲的机器,你会注意到在netscape里显示html的时候会比
    在本地的时候快一点。同时,你不会从使用方面注意到这个netscape不是运行在本地的,
    因为你同样是用鼠标、键盘进行着和本地一样的操作。 
    很酷,不是嘛?
    
    Taking the display with you
    虽然远程运行一个应用程序是比较简单的,可是这里还需要为设置DISPLAY再动动手,也可以
    自动完成:
    
    
      - 如果你使用ssh来登录到远程主机的话,那样DISPLAY会自动的被正确的设置。
      这里最好有其他的远程登录程序支持DISPLAY,不过,ssh是非常普及的。
 
 
      - 
        如果你用slogin或者其他的命令,那你可以安装下面的脚本到远程主机上。
        For tcsh:
 
        # take your display with you at remote
        login:
        # Put it into your ~/.login file
        set whoami=`who -ml`
        set remhost=`expr "$whoami" : '.*(\(.*\))'`
        if ( "$remhost" != "" ) then
         setenv DISPLAY "$remhost":0.0
        endif
        这个脚本通过运行"who -ml"来得到远程主机的机器名。这个命令将返回类似下面的结果:
 
        >who -ml
        movietux!guido pts/3 Oct 26 21:55 (philosophus.tux.org)
        If you are using bash then you need to the following script: 
        如果你使用bash那么你需要下面的脚本:
 
        # take your display with you at remote
        login:
        # Put it into your ~/.bash_profile
        whoami=`who -ml`
        remhost=`expr "$whoami" : '.*(\(.*\))'`
        if [ -n "$remhost" ]; then
         DISPLAY="$remhost":0.0
         export DISPLAY
        fi
 
        OpenGL
        当X Windows System的网络性能很好的时候,图形显示有一点慢是应为你是通过
        网络协议来传送你的数据。通常你不会注意到什么差别。 
 
        图形加速和快输的应用程序如图形加速的游戏,通常都是基于OpenGL(Open Graphics Library)
        和GLX(OpenGL Extension to the X Window System)的。这些库提供了一个直接访问
        显卡上的3D加速器的和硬件无关的程序接口。那就是:也应用程序用点、线、多边形来描述
        一个物体的外形,并把这些传送给显卡,所有的渲染工作都是在图形硬件内部进行的。
        这提供了很快的图形速度。
 
        目前大多数的Linux显卡驱动(X servers)不支持远程的GLX/OpenGL硬件加速,
        但支持本地的加速。结果就是,远程的OpenGL程序几乎根本不动,非常慢。
        不过,封闭代码的NVidia显卡的驱动是一个例外。它们有一个支持远程应用程序非直接
        渲染的直接渲染接口。
 
        结论
        X11可以很方便的发挥你的网络的力量。你可以像在本地一样在远程工作。唯一一点不同的是
        你看到的文件和目录是在远程主机上的。可是,通过安装NFS和NIS,你可以把连这点小的不同也
        隐藏起来,放心的使用和你同在一个网络的强劲的计算机上的CPU资源。
 
        链接
        X11 system, x.org
        xfree86.org the X11
        system used with Linux