Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1068208
  • 博文数量: 282
  • 博客积分: 10865
  • 博客等级: 上将
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-12 12:35
文章存档

2017年(1)

2016年(3)

2015年(10)

2014年(12)

2013年(5)

2012年(10)

2011年(29)

2010年(3)

2008年(13)

2007年(92)

2006年(104)

我的朋友

分类: LINUX

2006-05-12 15:35:07

使用X-WIN32 EXCEED等软件显示远程LINUX桌面的设置

RED HAT 9.0上测试通过。
一 服务器端设置
1 修改/etc/X11/xdm/Xaccess 文件,找到下面的行,去掉注释号。
# *   #any host can get a login windows"
2 /etc/X11/xdm/xdm-config 文件,在下面行上加注释
"Display Manager .Requestport 0"
3 /etc/X11/gdm/gdm.conf文件,在[xdmcp]部分,
把enable的状态改为true
4 /etc/kde/kdm/kdmrc文件,在[xdmcp]部分,
把enable 状态设置成true
5 /etc/inittab里面缺省运行级别是5
6 关闭防火墙。

二 X软件正常启动即可,同一网段选择时,XDMCP模式选择broadcast,跨网段选择query。
需要指出的是,使用EXCEED或X-WIN32登陆SOALRIS的时候,设置里面颜色部分需要设置成Pseudocolor,否则在软件使用的时候会提示颜色不够。登陆LINUX不需要设置成Pseudocolor,否则会出现颜色不对。
 
使用图形客户端远程访问Linux服务器

一、引言
我们可以通过telnet、ssh等远程登录Linux服务器,但都是字符界面的。本文介绍了通过XDMCP+XDM来

远程连接Linux服务器上的XFree86 Server,可以在图形环境下远程管理Linux服务器。

二、基本概念
1、什么是XFree86
XFree86是X Window系统的一种开放源代码的实现。它提供了一种对鼠标、键盘、显卡和窗口图形环境

的Client-Server接口。所以客户端程序可以运行在不同的主机上,由一台服务器提供X Window的Server服务。
2、什么是XDMCP
XDMCP即“X Display Manager Control Protocol”,是一种网络协议。由它来建立图形客户端程序

与X Window服务器的连接与通信。
3、什么是XDM
XDM即“X Display Manager”,由它来启动X Window服务器,并管理图形客户端程序的登录、会话、

启动窗口管理器(KDE、Gnome)等。KDE和Gnome也提供了自己的xdm的实现,分别叫kdm和gdm。
4、什么是XFS
XFS即“X Font Server”,可以由由一台服务器来统一提供字体,远程图形客户端程序就不需要单独

安装所有的字体了。

三、配置过程
1、我们的环境
我们使用一台装有Mandrake Linux 8.1的计算机作为X Window的服务器,服务器上网卡地址

为192.168.0.1/24。并且在安装Linux时一起安装了XFree86相关软件包。
我们在局域网中的另一台装有Windows 2000的计算机上安装了X-Win32软件,作为X Window的客

户端。还有很多Windows下的X客户端程序,但大多是商业程序,如exceed只提供30天的试用期。

而X-Win32没有天数限制,只是每次只能使用30分钟,这对于大多数基本的服务器维护操作也够了,

时间到了再连接就是了。免费使用商业程序不能要求太高了:-)

2、配置服务器
(1)配置xfs
xfs的配置文件是/etc/X11/fs/config,内容如下:
#
# Default font server configuration file for Mandrake Linux workstation
#

# allow a max of 4 clients to connect to this font server
client-limit = 4

# when a font server reaches its limit, start up a new one
clone-self = off

# alternate font servers for clients to use
#alternate-servers = foo:7101,bar:7102

# where to look for fonts
# Some of these are commented out, i.e. the TrueType and Type1
# directories in /usr/share, because they arent forced to be
# installed alongside X.
#
catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/75dpi:unscaled,
/usr/X11R6/lib/X11/fonts/100dpi:unscaled,
/usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/Type1,
/usr/X11R6/lib/X11/fonts/Speedo,
/usr/X11R6/lib/X11/fonts/mdk:unscaled,
/usr/share/fonts/default/Type1,
/usr/share/fonts/ttf/big5,
/usr/share/fonts/ttf/gb2312,
/usr/share/fonts/ttf/decoratives,
/usr/share/fonts/ttf/western

# in 12 points, decipoints
default-point-size = 120

# 100 x 100 and 75 x 75
default-resolutions = 75,75,100,1
# how to log errors
use-syslog = on

在配置文件中可以定义最大客户端连接数量,这里缺省是4。配置文件中也指明了字体文件的位置,

特别注意包含了中文字体,否则在客户端无法正确显示中文字体。
接下来修改/etc/rc.d/init.d/xfs文件,把所有“-port -1”改为“-port 7100”,这是xfs缺省监

听的端口。使用如下命令来重启xfs:
service xfs stop
service xfs start
xfs启动成功后,可以使用netstat -ln命令来确认7100端口已绑定:
tcp 0 0 0.0.0.0:7100 0.0.0.0:* LISTEN

(2)配置xdm
xdm的配置文件在/etc/X11/xdm目录下。
首先修改xdm-config文件,找到一行:DisplayManager.requestPort: 0
注释这行:!DisplayManager.requestPort: 0
如果有这行,xdm就不会监听XDMCP的连接了。
接下来修改Xaccess文件,这是控制客户端访问的配置文件,修改内容如下:
#* #any host can get a login window
192.168.0.*

这里允许局域中的计算机都可以连接。
现在可以直接使用xdm命令来启动xdm服务,使用netstat -ln命令来确认177端口(xdm缺省的端口)

已绑定:
udp 0 0 0.0.0.0:177 0.0.0.0:*

如果想要在服务器启动后自动运行xdm,就需要修改/etc/inittab文件,使启动后进入“5”运行级别,

修改内容如下:
id:5:initdefault:

3、使用图形客户端来测试
我们下载的是X-Win32 5.4版,在windows中安装完成后,会在“程序组”中生成“X-Win32 5.4”,在

其中有两个可执行程序:X-config和X-Win32。
首先要使用X-config来建立连接配置:在“session”处选择“add”,再选择“XDMCP”连接方法,

点“Next->”,在“Session name”处输入一个名字,在“XDMCP Mode”处选择“Broadcast”,再

点“Save”保存配置。然后再选择X-config主界面的“Font”,点击“Add Font Server...”,

在“Host”出输入服务器的IP地址192.168.0.1,并确认“Port”为7100。
配置完后就可以启动X-Win32了,启动时当然要选择“Evaluation”因为我们没有注册的。然后选择

刚才建立的session名称,就会出现一个窗口显示当前网络中的X Window服务器名称,选中我们的服务

器点“OK”,就会出现xdm的登录界面了,使用你在Linux中的用户帐号登录后,X Window图形界面就

出现了,和在Linux服务器上本地操作一样。中文也显示正常,因为使用的是服务器上的字体。

四、其它问题
1、获得X-Win32
可以在处下载X-Win32软件,下载前需要注册。

2、X Window客户端和Windows相互粘贴拷贝
X-Win32还提供了让X Window和Windows中内容相互粘贴拷贝的功能,这样就方便多了。

问:服务器端禁止root远程登陆引起的连接失败问题,如何解决?
答:
解决的办法:
如果服务器是linux:
方法1. 在redhat中对于远程login的限制,体现在/etc/pam.d/login文件中,缺省有一行:
     auth required /lib/security/pam_security.so
     注释该行,任何限制都没有,root当然可以直接telnet登陆。
方法2. 如果不注释该行,则必须验证,我们删除验证规则,即将/etc/securetty文件改名,
     该文件是定义root只能在tty1~tty6的终端上登录的,详细的信息可以"man login"。
方法3. 如果不注释该行,则必须验证,我们更改验证规则,即在/etc/securetty文件中添加下列行:
     pts/1
     pts/2
     .
     pts/11

如果服务器是FreeBSD:
设置root方法如下
打开/etc/ttys 文件,看到
# Pseudo terminals(伪终端)的字样
缺省是这样
ttyp0 none network

把所有的伪终端都改成这样
ttyp0 none network off secure

如果服务器是Sun Solaris
对于Solaris系统,限制体现在/etc/default/login文件中,如果有"CONSOLE=/dev/console" 一行,则root不能直接登陆,如果注释掉该行,则root可以直接登陆。

探究X Window System运行原理与启动过程


第一次在Debian下装XFree86,startx启动了twm,装了gnome 后startx启动了gnome环境,为什么?装gnome 时修改了什么文件以及X环境是怎么起来的?本来是想搞清这几个文题开始研究这个题目的,没想到还学到了很多别的东西^_^本文主要说明X Window System的基本运行原理,其启动过程,及常见的跨网络运行X Window System。

  一) 基本运行原理
  X Window System采用C/S结构,但和我们常见的C/S不同。常见的C/S结构中,称提供服务的一方为server,即服务器端(如HTTP服务,FTP服务等),使用服务的称为client,即客户端。但在X Window System中,client是执行程序的一方,在上面执行各种X程序,而server则是负责显示client运行程序的窗口的一方。

  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负责显示。

  常见的情况是X server与X client都在同一台电脑上运行,但他们也可分别位于网络上不同的电脑上。在X Window System中,X client是与硬件无关的,它并不关心你使用的是什么显卡什么显示器什么键盘鼠标,这些只与X server相关。我们平常安装完XFree86后运行xf86config或xf86cfg进行的配置实际上只是与X server有关,可以说就是配置X server吧,不配置照样可以运行X client程序(如:xeyes -display xserver:0就可以在xserver这台机器上的0号屏幕(屏幕编号displaynumber为0)上显示那对大眼睛了)。

  X protocol就是X server于X client之间通信的协议了。X protocol支持现在常用的网络通信协议。我只能测试TCP/IP,可以看到X server侦听在tcp 6000端口上。那X protocol就是位于运输层以上了,应该属于应用层吧?。
  总结下运行过程吧:
  (1) 用户通过鼠标键盘对X server下达操作命令
  (2) X server利用Event传递用户操作信息给X client
  (3) X client进行程序运算
  (4) X client利用Request传回所要显示的结果
  (5) X server将结果显示在屏幕上

  二) 启动过程
  我们从控制台进入X一般是用startx命令。下面就从startx分析起。首先man startx和man xinit可以看到staratx和xinit的使用方法:
  startx [[client] options .....] [-- [server] options ....]
  xinit [[client] options ] [-- [server] [display] options]
  把上面[client]和[server]分别称为client程序和server程序。man手册里写明其必须以/或者./开头。
  下面看看startx这个脚本,中文为我加的注释,这个脚本是安装x-window-system-core后得到的,都是XFree86,不同发行版的linux里该脚本应该大同小异:
  #!/bin/sh
  userclientrc=$HOME/.xinitrc               #用户的client定义文件
  userserverrc=$HOME/.xserverrc             #用户的server定义文件
  sysclientrc=/usr/X11R6/lib/X11/xinit/xinitrc   #系统的client
  sysserverrc=/usr/X11R6/lib/X11/xinit/xserverrc #系统的server
  defaultclient=/usr/X11R6/bin/xterm         #默认的client程序
  defaultserver=/usr/X11R6/bin/X             #默认的server程序
  defaultclientargs=""                   #下面定义了client和server的参数变量
  defaultserverargs=""
  clientargs=""
  serverargs=""

  #如果用户client文件存在则使用用户文件里定义的client,否则使用系统定义的client
  if [ -f $userclientrc ]; then
    defaultclientargs=$userclientrc
  elif [ -f $sysclientrc ]; then
    defaultclientargs=$sysclientrc
  fi

  #如果用户server文件存在则使用用户文件里定义的server,否则使用系统定义的server
  if [ -f $userserverrc ]; then
    defaultserverargs=$userserverrc
  elif [ -f $sysserverrc ]; then
    defaultserverargs=$sysserverrc
  fi

  #下面循环处理client和server的参数
  whoseargs="client"
  while [ x"" != x ]; do                 #若第一个参数为空,退出循环
    case "" in
    # '' required to prevent cpp from treating "/*" as a C comment.
    /''*|./''*) #如果是/*或者./*形式(xinit程序要求其参数里的client程序和server程序必须以/或./开头,否则会被视为client程序和server程序的参数,见man xinit)
        if [ "$whoseargs" = "client" ]; then   #如果当前是在处理client的参数
          if [ x"$clientargs" = x ]; then   #如果clientargs为空,则赋值给client变量,也即上面#startx使用方法里的[client]参数
            client=""
          else
            clientargs="$clientargs "   #否则clientargs赋值为$clientargs ,即上面#startx使用#方法里的options参数
          fi
        else                         #当前在处理server的参数,代码的含义同上
          if [ x"$serverargs" = x ]; then
            server=""
          else
            serverargs="$serverargs "
          fi
        fi
    ;;
    --)#如果为--,则表示开始处理server的参数,--为client和server参数的分界
    whoseargs="server"
    ;;
    *)
    if [ "$whoseargs" = "client" ]; then     #处理给client程序的参数
        clientargs="$clientargs "
    else                           #处理给server程序的参数
    # display must be the FIRST server argument
    #屏幕编号必须为第一个给server程序的参数,以的形式(x为数字),这可从上面startx和xinit 的使用
    #方法的区别看出,xinit多了个[display],这里即过滤出这个[display]。试试看这两个命令:
    #xinit /usr/bin/X11/xeyes -display localhost:1 -- /usr/bin/X11/X :1 -dpi 70&
    #xinit /usr/bin/X11/xeyes -display localhost:1 -- /usr/bin/X11/X -dpi 70 :1&
    #即可看出不把屏幕编号作为第一个server参数的后果
        if [ x"$serverargs" = x ] && expr "" : ':[0-9][0-9]*$' > /dev/null 2>&1; then
          display=""
        else #处理屏幕编号以外的参数
          serverargs="$serverargs "
        fi
    fi
    ;;
    esac
    shift #所有参数左移一次
  done

  # process client arguments
  if [ x"$client" = x ]; then #如果client程序为空
  # if no client arguments either, use rc file instead
    if [ x"$clientargs" = x ]; then         #且clientargs为空,赋值$defaultclientargs给client程序
        client="$defaultclientargs"
    else
        client=$defaultclient             #使用默认的client程序
    fi
  fi
 
  # process server arguments处理server参数,同上
  if [ x"$server" = x ]; then
  # if no server arguments or display either, use rc file instead
    if [ x"$serverargs" = x -a x"$display" = x ]; then
        server="$defaultserverargs"
    else
        server=$defaultserver
    fi
  fi
  #…………省略授权代码若干

  xinit $client $clientargs -- $server $display $serverargs     #把处理过的参数交由xinit程序处理
  #…………
  由上面代码可以得出startx主要是置X client和X server所在的位置,并处理相关参数,最后交给xinit处理。可以看出startx 设置X client的位置是先搜寻$HOME/.xinitrc,然后是/etc/X11/xinit/xinitrc;设置X server的位置是先搜寻$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启动X client。
  以上即为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程序。

  但还未搞清楚gnome是怎么起来的!gnome当然属于X client了,看上面启动过程第(3)步。
  这里分两种情况看吧,第一种是用系统的xinitrc文件。看/etc/X11/xinit/xinitrc文件(我的sarge装x-window- system-core和gnome-core),里面只包含了. /etc/X11/Xsession一句话。接着看/etc/X11/Xsession这个脚本,只看关键部分吧。最后面有:

  SESSIONFILES=$(run_parts $SYSSESSIONDIR)
  if [ -n "$SESSIONFILES" ]; then
    for SESSIONFILE in $SESSIONFILES; do
        . $SESSIONFILE
    done
  fi
  exit 0
 
  接着看run_parts(),位于本文件中间:
  run_parts () {
    # until run-parts --noexec is implemented
    if [ -z "" ]; then
        internal_errormsg "run_parts() called without an argument."
    fi
   
    if [ ! -d "" ]; then
        internal_errormsg "run_parts() called, but "" does not exist or is"
        "not a directory."
    fi
   
    for F in $(ls ); do
        if expr "$F" : '[[:alnum:]_-]+$' > /dev/null 2>&1; then
          if [ -f "/$F" ]; then
            echo "/$F"
          fi
        fi
    done
  }

  大概意思就是run_parts () 把$SYSSESSIONDIR目录下的文件名取出来赋值给$SESSIONFILES,然后循环运行该目录下的文件。看看该目录,即 /etc/X11/Xsession.d目录,可以看到几个以数字开头的文件,实际上这些数值就表示了这几个文件被运行的优先级,数字小的优先级高,因为在上面的run_parts () 里是用ls命令显示该目录下的文件,所以前面数字小的被ls时显示在前面,所以被
  for SESSIONFILE in $SESSIONFILES; do
    . $SESSIONFILE
  done

  这个for循环执行时也先被执行。看到/etc/X11/Xsession.d目录下有个55gnome-session_gnomerc文件,里面提到了STARTUP变量。然后运行:
  xdkui@Debian:/etc/X11/Xsession.d$ grep STARTUP *
  看到50xfree86-common_determine-startup文件。里面有
  if [ -z "$STARTUP" ]; then
    if [ -x /usr/bin/x-session-manager ]; then
        STARTUP=x-session-manager
    elif [ -x /usr/bin/x-window-manager ]; then
        STARTUP=x-window-manager
    elif [ -x /usr/bin/x-terminal-emulator ]; then
        STARTUP=x-terminal-emulator
    fi
  fi

  即设置启动程序,实际上设置STARTUP变量,如果以上程序都没有找到,则会报错退出,即X环境没有被启动。再运行
  xdkui@Debian:/etc/X11/Xsession.d$ grep STARTUP *
  看到优先级最低也即最后被运行的99xfree86-common_start文件,里面只有一句话:
  exec $STARTUP
  好了,到这里就启动我们的X client了,终于完了^_^。总结下这第一种方式的启动过程,简单的说就是依次顺序查找/usr/bin/x-session-manager ,x-window-manager,/usr/bin/x-terminal-emulator 这三个文件。如果存在则启动之,也即X client。如果三个都不存在则报错退出了。看/usr/bin/x-session-manager文件可以看到是个符号连接,最终连接到 /usr/bin/gnome-session,也就是gnome 了。至于我们在gnome 启动时可能会设置启动输入法等程序,那就归gnome-session管了,也就不再分析了。可以试着把/usr/bin/x-session- manager 改为指向xfce4-session(如果安装了的话) ,再startx就会启动xfce4环境了。大概RedHat的switchdesk工具就是改这个连接实现的吧?。或者删掉/usr/bin/x- session-manager ,再startx,只启动了/usr/bin/x-window-manager 所指向的window manager了吧,我这里是blackbox。
 
  下面看第二种情况,即用户目录的xinitrc文件$HOME/.xinitrc。对比hiweed-debian- desktop_0.55_i386,存在$HOME/.xinitrc文件,在里面有exec xfce4-session。故其X client可以说最主要的x-session-manger是从$HOME/.xinitrc启动的。也就不会经过上面第一种情况的执行过程了。
 
  终于把gnome(或者说x-session-manger)的启动过程弄明白了,下面说点别的吧。xinit程序同时启动X server和X client,这在单机上还可。要是位于网络上的两台电脑分别是client和server,则xinit就无能为力了。这时就得靠纯“手工”来启动X 了。下面简单的“手工”启动X server和X client:在CUI模式下运行命令:
  xdkui@Debian:~$X :1&

  看到了一个灰色的全屏幕和一个鼠标指针,这就是X server了,其屏幕编号为1。下面构造X client,按Ctrl+Alt+F1回到刚才的CUI(Ctrl+Alt+F7对应本机的第一个启动的X server,Ctrl+Alt+F8对应第二个,有人说F7对应屏幕编号为0的X server实际上是不对的,如果第一个启动的屏幕编号为1,第二个启动的编号为0,则F7对应1屏幕,F8对应0屏幕),运行命令: xdkui@Debian:~$xeyes -display localhost:1&

  然后按Ctrl+Alt+F7,看到我们的X client也就是xeyes了吧。再回到CUI,运行
  xdkui@Debian:~$X&
  开启一个屏幕编号0的X server,CUI下再运行
  xdkui@Debian:~$xterm&

  这时Ctrl+Alt+F7对应屏幕编号1;而F8对应屏幕编号0,且其X client为xterm。先退出上面的两个X server,下面复杂点手动启动我们的gnome吧,首先
  xdkui@Debian:~$X&
  然后
  xdkui@Debian:~$gnome-session

  看到的就和用startx 启动的X一样了,这时X server是X这个程序,X client是gnome-session及其启动的窗口管理器等程序。看到这里感觉xinit用处并不大(??不知是否正确),简单的脚本就可以实现。本来想把xinit反汇编了分析下,可懒得搞了^_^这是位于本机的情况,对于X server和X client位于不同主机的情况见下面本文第三部分。

  个人感觉对于X Window System,搞清楚X server与X client关系很重要。一般X server很简单,就是/usr/bin/X11/X程序;X client则花样繁多,从高级的CDE,GNOME,KDE,到低级一点的只有twm,Window Maker,blackbox等窗口管理器,再到最简陋的只有xterm,rxvt,xeyes等单个x程序。正是由于X client的各种搭配,使得我们的X Window System看起来多样化。这可能也是X Window System最大的卖点之一吧 ^_^

  三) 跨网络运行X Window System
  一般用来做服务器的系统(Linux,FreeBSD,Solaris等等)都不会装X server,甚至很多都没有显示器。这样可以在这些系统里安装简单的X client,以GUI的方式远程显示在管理员们所坐的X server里。我们实验室用FreeBSD做网关,提供WWW,FTP服务,一般在管理员的本地机器起个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。

  1) Windows系统做X server
  a) 用ssh或telnet方式
  Windows下面的X server软件有很多种,我这里使用X-win32。在Windows里运行X-win32程序,则相当于本地机器是个X server。远程登录上Debian(我这里是用VMware仿真网络环境,直接进虚拟机即可^_^),运行:
  xdkui@xclient:~$export DISPLAY=192.168.1.2:0
  xdkui@xclient:~$xterm&
  这时即在Windows里的X server里看到了xterm了,至于X client还运行什么程序就看你的需要了,文件管理器阿,资源查看器等。当然,这里X-win32要设置好授权,好像默认是禁止接入控制,即任何X client都可使用这个X server。

  b) 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的机器地址。连接,即可看到登录界面,下面的就不用说了,享受吧

  2) Linux与Linux互联
  a) 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:~$X&
  运行该程序时别加-nolisten参数,否则不会在网络上侦听。
  这个时候Ctrl+Alt+F7是X server,返回Ctrl+Alt+F1还可以ssh上X client机器上。
  然后登录上X client,运行
  xdkui@xclient:~$xterm –display 192.168.1.2:0
  即可在本地的X server里看到xterm了,如果有的话,还可把gnome-session也显示在本地来。同样可以在linux里的VMware里做这个测试,需要用点手腕了^_^见下
 
  b) 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。
 
很多人在用 Xwindow,但是他们是在用一些包装掩盖下的 Xwindow,那些包装有些很不稳定,占用大量资源,以至于有人说 Xwindow 是垃圾。其实 Xwindow 是一个非常出色的图形系统,你应该抱怨的是那些不稳定的包装,而不是 Xwindow 本身。

Xwindow 是非常巧妙的设计,很多时候它在概念上比其它窗口系统先进,以至于经过很多年它仍然是工作站上的工业标准。许多其它窗口系统的概念都是从 Xwindow 学来的。

Xwindow 可以说的东西太多了。下面只分辨一些容易混淆的概念,提出一些正确使用它的建议。

分辨 X server 和 X client
这是我被别人问了好多次的问题,我实在不想再对人说一遍了,所以写在这里偷个懒,嘿嘿。

很多熟悉 Internet 原理的人首次遇到 Xwindow 的这两个概念都会搞错。如果他从一台 Windows 机器上使用 Exceed 通过 XDMCP 登录到一台 Sun 服务器,他就说 Exceed 是客户端(client),而 Sun 机器是服务器 (server)。这就完全搞错了。

理解了 Xwindow 的工作原理,这个区别就会很明显。X server 不是指你登录的那台机器,而是指一个程序,它负责在某台机器上接受客户的要求,在屏幕上显示客户请求的图形,并且把消息(键盘,鼠标,窗口消息)通知客户程序。

比如上面例子里的 Exceed 就是一个 X server,它负责控制那台 Windows 机器上的显示(display),Sun 机器上的程序,xterm, xxgdb, dtwm(CDE的窗口管理器),……是客户程序。它们通常会使用 TCP 6000 号端口连接 Windows 机器,而Windows机器的 6000 号端口是由 Exceed bind 和 listen 的,怎么样,我们的 Internet 专家,Exceed 看起来是一个 server 吧 :)

比如,当你通过 telnet 启动 Sun 机器上的 xterm,就会在 Exceed 的屏幕上显示一个窗口。实际发生的事情是: xterm 请求连接 Windows 机器的 6000 号端口,与Exceed 跟 Exceed 连接,然后xterm请求得到资源,然后 xterm 请求在屏幕上显示一个窗口。

你在 xterm 的窗口里按下"A"键时,Exceed 会把这个事件通知 xterm 进程,然后 xterm 会发送数据报,请求 Exceed, “请在坐标(100,30)处显示一个字母A,然后在后面显示一个矩形作为光标。”,这样你的 xterm 窗口里就会多显示一个字母。

这下你理解了吗?不?那还是自己多用用,体会体会吧。

Xwindow 的网络透明性
刚才那个 Exceed 用户,他的客户程序不仅可以运行在那台 Sun 机器上,而且可以运行在网络里其它的机器上,或者在本机上。比如他有可能同时通过 telnet 登录到几台 Sun 工作站,几台 Linux PC,他可以在那些机器上都起动 xterm,在这台 Windows 机器上的 Exceed 上显示。如果它安装了 cygwin,他还可以启动本机上的 cygwin里 的 xterm,用同样的方式显示。

如果他使用 xrdb 在本机的 Exceed 设置了 xterm 的样式,比如背景 midnightblue, 前景 白色,字体 -*- adobe-courier-*,……,那么,Sun, Linux, cygwin 里的 xterm,虽然没有经过配置,但是它们知道:“这个 X server 要求我用这个背景色,这个前景色,这个字体……”,它们会在你的屏幕上显示同样风格的窗口。

使用鼠标选择一段字符,然后就可以在另外的程序里按鼠标中间,把字符粘贴过去。不论这个程序运行在哪里。

看看更大的一个图景:你的屏幕上有三台机器上的 xterm, 两台机器上的 gvim,两台机器上的 mozilla 在显示,而它们都受本机的 FVWM 操纵,它们之间可以随意进行拷贝粘贴…… 从这里你可以初步体会到 Xwindow 的网络透明性,它使你方便的操作很多机器。

什么是窗口管理器?
很多人不知道窗口管理器是怎么回事。他们认为 Gnome 和 KDE 是窗口管理器,认为窗口管理器就是能够提供一个工具条,能够配置桌面背景,能够设置很多菜单的东西。而其实,窗口管理器只是 Gnome 和 KDE 的一部分,它的主要功能是你平时根本没有注意,但是却非常重要的操作。窗口管理器的主要功能是:移动窗口,改变窗口大小,图标化(最小化)窗口,改变窗口层叠顺序……

通常的X客户程序不需要知道有人想移动它,它只知道乖乖听窗口管理器的话。如果没有窗口管理器运行,你的程序会一个堆一个,你没有办法操纵被盖在下面的程序,你只能使用最上面一个程序,而且你不能移动它,你不能改变它的大小。这样的系统根本不能用!

其实你的窗口上的标题,按钮,漂亮的边框,全都是窗口管理器提供的,而不是程序自己的,这样你用窗口管理器就能改变任何窗口的样式了。当你点击关闭窗口的那个按钮,你其实点击的是窗口管理器放在你的程序窗口上面的一个小窗口,发现它受到点击后,窗口管理器就会通知那个程序:“喂!有人想关掉你,你自己准备准备后事,然后退出吧。”

不同的机器在本机显示的窗口,由窗口管理器统一装饰和指挥。比如,窗口管理器决定: xterm 窗口上面都应该有四个按钮,一个在左边,点击它会显示窗口操作菜单,另外三个在右边,分别是最大化,最小化和关闭。窗口都使用 7pixel 厚的边框,窗口首次出现的时候首先在桌面上找一个空位置,如果找不到,就找一个能够最少的遮盖其它窗口的位置……

这些都是窗口管理器的职责。

Gnome 和 KDE 是什么?
有人把 Gnome 和 KDE 叫做窗口管理器,甚至还有人把它们叫做 Xwindow。经常看到有人问:“装哪种 Xwindow 好啊?Gnome 还是 KDE?” 其实你不安装 Gnome 和 KDE 也可以使用 Xwindow.

Gnome 和 KDE 是“桌面系统”,一种很多程序和函数库的集合。它们的设计目的是提供一致的方便的操作方式来满足普通用户的需要。它们不但包含窗口管理器,还有很多实用程序和应用程序,比如配置程序,工具条,编辑器,绘图工具…… 其实 Gnome 可以和很多窗口管理器合作,在历史上, Gnome 使用过的窗口管理器包括 englightenment, sawmill, sawfish, metacity。KDE 的窗口管理器叫做 kwin。

你也知道,设计整整一套应用程序:编辑器,绘图程序,浏览器,…… 是非常不容易的。所以它们肯定是不如专用的编辑器,绘图程序,浏览器的。不过要求不太高的用户也可以用它们。

用 Xwindow 做一个有趣的试验
现在我们来做一个试验来引起你对 Xwindow 的兴趣。

很多人离开了 xdm 就不知道怎样启动 "Xwindow" 了。其实 Xwindow 的启动方式很简单。

首先,启动你的 X server。在 Linux 下,你可以直接输入 "X&",让一个 X server 在后台运行。这样,一个占据整个屏幕的布满斜纹的窗口(根窗口)就出现了。如果是 Exceed 或者 X-win32,你需要把屏幕设置为 "single window" 才能看到这个窗口。

接着,Linux 用户需要用 xauth 给你的 X server 设置一个密码,这样别人就不能非法连接你的 X server。你需要 Ctrl-Alt-F1切换到tty1才能输入这个命令。Exceed 和 X-win32 的用户不需要这步。以下的例子只用 Linux 作为实例,其它系统的用户可以依葫芦画瓢。

xauth add :0 . `mcookie`
好了,现在你可以试试启动一个 xterm 到这个 X server 上:

xterm -display :0
按 Alt-F7 切换到 X,你看到了一个不受窗口管理器管理的 xterm。试试移动它呢?再切换到 tty1 启动另一个 xterm,两个 xterm 重合了吗?你怎样在第一个 xterm 里输入呢?这样用起来很痛苦吧?那么你可以在 xterm 里启动一个窗口管理器,比如 twm,直接运行 "twm&" 就行了。

你发现xterm的窗口都被加上了标题栏,按钮和边框,你现在可以移动它们了。试试把 twm 杀死,看看那些标题栏,按钮,边框是不是都消失了?你知道了窗口管理器的作用了吧。

现在告诉你怎样不用 XDMCP broadcast,绕过 CDE 的登陆界面,而使用 Sun 机器上的 CDE。其实你只需要把刚才那个例子里的 "twm" 换成 CDE 的窗口管理器 dtwm 就行了,或者启动 dtsession。它们一般在 /usr/dt/bin 下。Sun 还有另外一个窗口管理器叫做 OpenLook, 它在系统里的名字叫做 olwm,你自己找找吧。

现在如果你自己在 Sun 机器上装一个 FVWM,你知道怎么绕过 CDE 登录而启动 FVWM 了吧?你不需要成为 root 就可以使用你喜欢的FVWM了。

.Xdefaults 文件的作用
弄明白 X 的工作原理后,你就可以使用 .Xdefaults 来配置你的程序了。有人不理解 .Xdefaults 是用来干什么的,喜欢用 shell alias 出一些带有很多参数的命令,或者写一些 shell script,里面只有一行带有很多参数的程序调用,然后他说: “.Xdefaults 没用。”

其实 .Xdefaults 比起这些办法有很多好处。首先,几乎所有的 X 客户程序都可以从 .Xdefaults 文件得到配置信息,比如前景色,背景色,字体…… 这样你可以在同一个文件里配置所有 X 程序的样式,而不用写那么多 shell script。

另外,如果你用 xrdb .Xdefaults 把这些配置信息写入到根窗口的数据结构里,不是本地机器上的 X 程序也会遵守同样的样式。比如如果你的 .Xdefaults 里面有这些内容:

XTerm.background: midnightblue
XTerm.foreground: white
然后你用 xrdb ~/.Xdefaults,那么所有的 xterm 都会使用 midnightblue 作为背景色,使用白色显示字符。这些配置,用X术语叫资源(resource)。

有时候你会开很多 xterm 窗口在机器上,它们来自不同的远程机器,这时候如果它们都用同样的样色和字体,你就不容易分辨它们了。比如有一天,我在实验室的PC机上打开了很多 xterm,它们来自本机,实验室的 Sun 服务器,我宿舍的机器和数据库实验室一台 HP 服务器。在我走之前,想关闭本地的机器,我输入 “shutdown -h now” 在一个我自认是本地的 xterm 上,结果,等了一会儿,我回头看到机器没关掉,只是那个 xterm 停止了响应。我一拍脑袋:糟了,我把宿舍的机器给关掉了!

为了避免这种情况,你可以在不同的机器上编辑不同的 .Xdefaults,而不使用 xrdb 在根窗口导入这些配置。这样不同的机器上的 xterm 使用不同的颜色,你就不容易搞错了。

怎样更加深入的了解 Xwindow?
哎哟!我本来想写很多东西,后来发现要需要写的实在太多了。我没那么多时间,没办法,给参考书目吧,你们自己去看。

学习使用 Xwindow 不是学习使用 Gnome,KDE,…… 很多书籍教用户怎样使用 Gnome, KDE 的菜单,配置程序…… 结果到了最后用户还是没能知道 Xwindow 是怎么回事。用那些菜单谁不会啊?真是浪费大家时间。

学习 Xwindow,其实最好的一个办法是看看 Xlib 编程的书籍,你可以在图书馆找到这样的书,我推荐 O'reily 的那本 Xlib 程序设计书(我忘了名字了),虽然它很老,但是那上面讲解的 Xwindow 的工作原理一直都没有变过。

如果你不会编程序,你可以不看编程的部分而得到很多深入的概念上的认识,比如窗口属性,字体,颜色,…… 这些东西在你使用 Xwindow 时会有很大帮助。如果你真的要编写 Xlib 程序,这本书就过时了一点,你最好到 去免费下载最新的 Xlib 手册来看。
 
使用图形客户端远程访问Linux服务器

一、引言
我们可以通过telnet、ssh等远程登录Linux服务器,但都是字符界面的。本文介绍了通过XDMCP+XDM来

远程连接Linux服务器上的XFree86 Server,可以在图形环境下远程管理Linux服务器。

二、基本概念
1、什么是XFree86
XFree86是X Window系统的一种开放源代码的实现。它提供了一种对鼠标、键盘、显卡和窗口图形环境

的Client-Server接口。所以客户端程序可以运行在不同的主机上,由一台服务器提供X Window的Server服务。
2、什么是XDMCP
XDMCP即“X Display Manager Control Protocol”,是一种网络协议。由它来建立图形客户端程序

与X Window服务器的连接与通信。
3、什么是XDM
XDM即“X Display Manager”,由它来启动X Window服务器,并管理图形客户端程序的登录、会话、

启动窗口管理器(KDE、Gnome)等。KDE和Gnome也提供了自己的xdm的实现,分别叫kdm和gdm。
4、什么是XFS
XFS即“X Font Server”,可以由由一台服务器来统一提供字体,远程图形客户端程序就不需要单独

安装所有的字体了。

三、配置过程
1、我们的环境
我们使用一台装有Mandrake Linux 8.1的计算机作为X Window的服务器,服务器上网卡地址

为192.168.0.1/24。并且在安装Linux时一起安装了XFree86相关软件包。
我们在局域网中的另一台装有Windows 2000的计算机上安装了X-Win32软件,作为X Window的客

户端。还有很多Windows下的X客户端程序,但大多是商业程序,如exceed只提供30天的试用期。

而X-Win32没有天数限制,只是每次只能使用30分钟,这对于大多数基本的服务器维护操作也够了,

时间到了再连接就是了。免费使用商业程序不能要求太高了:-)

2、配置服务器
(1)配置xfs
xfs的配置文件是/etc/X11/fs/config,内容如下:
#
# Default font server configuration file for Mandrake Linux workstation
#

# allow a max of 4 clients to connect to this font server
client-limit = 4

# when a font server reaches its limit, start up a new one
clone-self = off

# alternate font servers for clients to use
#alternate-servers = foo:7101,bar:7102

# where to look for fonts
# Some of these are commented out, i.e. the TrueType and Type1
# directories in /usr/share, because they arent forced to be
# installed alongside X.
#
catalogue = /usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/75dpi:unscaled,
/usr/X11R6/lib/X11/fonts/100dpi:unscaled,
/usr/X11R6/lib/X11/fonts/misc:unscaled,
/usr/X11R6/lib/X11/fonts/Type1,
/usr/X11R6/lib/X11/fonts/Speedo,
/usr/X11R6/lib/X11/fonts/mdk:unscaled,
/usr/share/fonts/default/Type1,
/usr/share/fonts/ttf/big5,
/usr/share/fonts/ttf/gb2312,
/usr/share/fonts/ttf/decoratives,
/usr/share/fonts/ttf/western

# in 12 points, decipoints
default-point-size = 120

# 100 x 100 and 75 x 75
default-resolutions = 75,75,100,1
# how to log errors
use-syslog = on

在配置文件中可以定义最大客户端连接数量,这里缺省是4。配置文件中也指明了字体文件的位置,

特别注意包含了中文字体,否则在客户端无法正确显示中文字体。
接下来修改/etc/rc.d/init.d/xfs文件,把所有“-port -1”改为“-port 7100”,这是xfs缺省监

听的端口。使用如下命令来重启xfs:
service xfs stop
service xfs start
xfs启动成功后,可以使用netstat -ln命令来确认7100端口已绑定:
tcp 0 0 0.0.0.0:7100 0.0.0.0:* LISTEN

(2)配置xdm
xdm的配置文件在/etc/X11/xdm目录下。
首先修改xdm-config文件,找到一行:DisplayManager.requestPort: 0
注释这行:!DisplayManager.requestPort: 0
如果有这行,xdm就不会监听XDMCP的连接了。
接下来修改Xaccess文件,这是控制客户端访问的配置文件,修改内容如下:
#* #any host can get a login window
192.168.0.*

这里允许局域中的计算机都可以连接。
现在可以直接使用xdm命令来启动xdm服务,使用netstat -ln命令来确认177端口(xdm缺省的端口)

已绑定:
udp 0 0 0.0.0.0:177 0.0.0.0:*

如果想要在服务器启动后自动运行xdm,就需要修改/etc/inittab文件,使启动后进入“5”运行级别,

修改内容如下:
id:5:initdefault:

3、使用图形客户端来测试
我们下载的是X-Win32 5.4版,在windows中安装完成后,会在“程序组”中生成“X-Win32 5.4”,在

其中有两个可执行程序:X-config和X-Win32。
首先要使用X-config来建立连接配置:在“session”处选择“add”,再选择“XDMCP”连接方法,

点“Next->”,在“Session name”处输入一个名字,在“XDMCP Mode”处选择“Broadcast”,再

点“Save”保存配置。然后再选择X-config主界面的“Font”,点击“Add Font Server...”,

在“Host”出输入服务器的IP地址192.168.0.1,并确认“Port”为7100。
配置完后就可以启动X-Win32了,启动时当然要选择“Evaluation”因为我们没有注册的。然后选择

刚才建立的session名称,就会出现一个窗口显示当前网络中的X Window服务器名称,选中我们的服务

器点“OK”,就会出现xdm的登录界面了,使用你在Linux中的用户帐号登录后,X Window图形界面就

出现了,和在Linux服务器上本地操作一样。中文也显示正常,因为使用的是服务器上的字体。

四、其它问题
1、获得X-Win32
可以在处下载X-Win32软件,下载前需要注册。

2、X Window客户端和Windows相互粘贴拷贝
X-Win32还提供了让X Window和Windows中内容相互粘贴拷贝的功能,这样就方便多了。

简单设置的用这个

[原创]x-win32和exceed的简单使用 v0.2


作者:sakulagi   发表时间:2002/10/25 02:05pm

[这个贴子最后由sakulagi在 2002/12/27 10:02am 编辑]

x-win32和exceed的简单使用 v0.2
1. 安装x-win32
2. 安装好后会自动运行X-Config,提示添加一个session, 类型选XDMCP, 然后选query模式, 输入session的名字,linux的IP地址。

ok, 转到server端
不是每个厂商的linux都一样,所以可能具体步骤会有不同。

1。 把防火墙disable掉(太暴力了,可以用这个方法:“ipchains -A input -p udp -i $extint --dport 177 -j DENY
”)
2。# cd /etc/X11/xdm
3. 修改 xdm-config,把下面这行注释掉:
“DisplayManager.requestPort:   0” --> “!DisplayManager.requestPort:   0”
4。修改   Xaccess
“#*   # any host can get a login window”--> “*   # any host can get a login window”
5. 修改 Xservers
“:0 local /usr/X11R6/bin/X” --> “#:0 local /usr/X11R6/bin/X”
6。 # xdm (可以用“xdm -debug 1”来查看xdm是否工作正常)

回到windows上
启动x-win32,菜单 “session”,选择刚才建立的session,如果一切正常,会出现一个login窗口。

*如果是exceed,请在xconfig里,选用broadcast方式或是query方式。

*linux server以redhat为例,不同的distribution可能具体会有所不同。
 
阅读(4121) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:JDK的命令详解

给主人留下些什么吧!~~