[OpenSource] 设置xdm

作者:Ron Hume
译者:Fenng
日期:08-Nov-2004
出处:http://www.dbanotes.net
版本:@2001.12.23 Version 0.01

xdm 提供了一个管理X任务的有用的途径,方便而且灵活。

你曾经想远程访问你的工作站的桌面环境吧?如何在一台服务器上面访问你的台式机?这正 是我最近需要解决的问题。我负责安装并且管理一组Linux服务器。在经过好几次为了不同 的原因(绑定服务、键盘代码等等)我要到实验室访问图形终端之后,我发现真的需要寻 找一个解决方案允许我通过我的工作站访问不同服务器上面的X桌面环境。

有的人可能认为用来处理远程任务的标准X工具足以解决我的问题--就像这样:

telnet host1 
export DISPLAY=mywkstn:0 
gnome-session (或者是其他的任务管理器) 

可是,我要找的解决方案是要提供比这些基本功能更多的东西。关于认证,会话管理等等有一些相应的缺陷, 需要一些X工作机制的知识。例如,当使用远程客户端的时候我常常会忘记输入 xhost+host1。当我对一个Linux新手解释xhost的认证方案的时候,我常看到他一脸迷惑。既然在一个开 发项目中没必要教开发者有关X的基础知识,我要寻找一个解决方案满足所有这些要求。需要更容易管理, 更加自动化,更容易为Linux的开发新手所使用。

有两个解决方案可以使我管理X会话更加容易。第一个是我所选择的X显示管理器(X display manager)或者说xdm,另一个流行的解决方案是vnc。我选择xdm而不是vnc出于两点原因。 第一,vnc要有个服务端的守护进程,为每个共享的桌面运行。第二,我已经有X服务器的软 件安装在所有的工作站上,不想再添加额外的客户端软件了。其他的选择是kdm和gdm ,分别是 KDE 和 GNOME软件包的一部分。

X 基础

X是用在大多数UNIX系统中的图形支持系统。如果你在你的Linux机器上使用GNOME或者KDE的 话,你就正在使用X系统。它由X联盟(www.X.org)定义并维护。大多数的Linux用户使用的都 是由XFree86 项目 (www.xfree86.org) 提供的X Window系统的实现。xdm 是一个显示管理器,提供了灵活的任务管理功能。然而xdm通常被认为是"GUI的登陆屏幕, 可以自动启动我的X任务",我们会看到实际上它要更为强大。

在X的世界中,术语"客户"和"服务器"可能会有些迷惑人。明确地说,X服务器控制键盘 ,鼠标和显示资源的应用,客户端也是个应用,是制造请求,从服务器来运行它自己的行为 (如:显示一个带有特定字符的窗口)。这和我们认为的工作站作为客户端运行的应用有些 许的差异。

xdm 使用X联盟的X显示管理控制协议,XDMCP,来和X服务器通信。它允许X服务器从运行xdm服务 的服务器上获得会话服务。有3类的请求可以被X服务器发送:

xdm 服务器可以实现一个可用的可以管理X会话的服务器列表。 X server 偶尔会结束与所选的用来得到登陆进程服务的主机的直接通信。

发明xdm 的一个最初的原因是要允许管理X终端。这些设备基本上就是显示器、键盘和鼠标并带有 嵌入的X服务器软件;所有的智能都在网络上的服务器上。xdm 被用来"推"登录屏幕并管理这些设备的会话。若干年前,这些东西很流行,因为访问 UNIX 工作站受到限制。一个用户如果想访问图形工作站的话,要不是足够幸运的拥有一台UNIX工 作站就需要一套这样的设备。后来这些设备变得有些过时,并逐渐被运行X服务器软件的个 人电脑Linux 和其他的 Unices (Solaris x86、xBSD等)或者是 Windows(运行Hummingbird Exceed或类似的软件)代替 。

当使用xdm管理这些X任务的时候在设置上有些费劲儿。乍一看,可能会出现这样的情况:如 果你设置xdm (为了使用 XDMCP 的优点), 没看到本地的 X 服务器启动 (如,当xdm启动的时候控制台进入图形模式 ),或者,如果你在xdm中禁止了本地的显示并使用startx,它不会让你访问选择器。这里 描述的设置允许任何的 XDMCP 客户访问 Linux 服务器桌面环境(当然了,影响了X的安全)。它也描述了一种方法,设置xdm 可以得到本地的和其他服务器上的桌面。

xdm 也带来管理安全和访问控制的问题,不过这超出了这篇文章的范围。xdm 应该只用在可控制的环境中。另外,接入端口 177 应该在所有的防火墙上锁定。如果你对X的安全问题感兴趣。下面的手册页是个不错的起点 :xdm(1)、xauth(1)、Xsecurity(7)、lbxproxy(1)--Low Bandwidth X proxy、xfwp(1)--X Firewall Proxy和(1)sshd(8) ,尤其是关于X11端口转发的部分。

设置 xdm

xdm 的设置有些难度;下面是为了达到特定目的唯一的一种方式。

在我的 Red Hat 7 系统上, xdm 在 /etc/X11/xdm。它的主要设置文件是xdm-config (见列表1):

列表1: xdm-config 

DisplayManager.errorLogFile:/var/log/xdm-errors 
DisplayManager.pidFile: /var/run/xdm-pid 
DisplayManager.keyFile: /etc/X11/xdm/xdm-keys 
DisplayManager.servers: /etc/X11/xdm/Xservers 
DisplayManager.accessFile: /etc/X11/xdm/Xaccess 
DisplayManager.willing: su nobody -c /etc/X11/xdm/Xwilling 
DisplayManager*resources: /etc/X11/xdm/Xresources 
DisplayManager*session: /etc/X11/xdm/Xsession 
DisplayManager*authComplain: false 
! Comment out this line if you want to manage 
! X terminals with xdm 
! SECURITY: This means we will be listening on 
! port 177 for XDMCP CHOOSER requests. 
#DisplayManager.requestPort: 0 
xdm的配置文件是 X resources 的格式。 这些 resources 用于设定不同文件的的位置。我们对 servers 指定的文件感兴趣,还有accessFile和 resources。 爱冒险的人会对 session 和DisplayManager._X.setup感兴趣,那里的X 是显示号。 注意 DisplayManager.requestPort:0 被注释掉了。 它指定哪个 UDP 端口用来监听XDMCP请求。 如果设置为0(它的默认值), XDMCP的请求被忽略,并且xdm 只管理本地的显示(看Xservers 文件)。我们把它注释掉,这样 xdm 就会监听默认端口(USP 端口177 )。 我的 Xservers 文件大致如下:
#:0 local /usr/X11R6/bin/X 

如果这一行没被注释掉的话,我就会每次在启动 xdm 的时候得到一个图形化的登录屏幕。也即它通过运行命令 /usr/X11R6/bin/X会在显示器(diaplay)0上面启动并管理一个本地的 X 服务器。我们要做的是选择我们要连接的主机。我们使用Xaccess文件实现了这个:

# 任何的间接主机都可以得到一个选项 
* CHOOSER BROADCAST 
# 
# 如果你想设定每个终端可见的主机的集合 
# 注释掉这些行 
#(并注释掉上面的 CHOOSER行) 
# 还要编辑 %hostlist 行 
# 
#%hostlist host-a host-b 
#* CHOOSER %hostlist # 

虽然Xaccess是个非常灵活的工具,但是我们将只用它来启动选择器(间接的模式)。选择 器是个小的X应用,显示网络上可用主机的列表,允许我们选择所要连接的一个。我喜欢使 用BROADCAST选项因为新的主机可以在列表中自动显示。有的人可能喜欢特定命名某主机, 如上面显示的使用%hostlist宏。这个方法有的时候,尤其是在一个大一些的网络上,在那 里广播没有到达所有的想要的主机时很有必要。如果你对更好的控制层次感兴趣的话,你可 以使用服务器的列表代替BROADCAST,这将允许你直接指定可用的主机列表。

如果你想用不同的方式设置 xdm 处理来自不同 X servers 的请求 。你可以指定主机名或者是主机列表来代替 * 。 如下面的例子。

下面的行告诉 xdm 自己处理所有来自host-a,host-b或者host-c的请求(直接模式):

host-a 
host-b 
host-c 

要让 xdm 从host-a发送间接请求给 server-a 或者 server-b,输入:

host-a server-a server-b 

也可以写成这样:

%hostlist server-a server-b 
host-a %hostlist 

你可以设定xdm使用选择器(chooser)处理间接请求(我们首选的方法)。 在我们的下个例子中,host-a 得到一个包括所有应答广播的主机的列表的选择窗口,然而其他人只能得到被hostlist指定 的列表:

%hostlist server-a server-b 
host-a CHOOSER BROADCAST 
* CHOOSER %hostlist. 

最后,要完成基本的功能,我们可以看看 Xresources 文件。 我的设置取默认值了,不过有的人可能想定制它的外观。在这个文件中你可以改变颜色,字 体和其他的类型选项。我发现chooser*geometry 资源是最有用的,因为它允许你设定选择窗口的大小。你还可以在xdm-config 中设置些交互管理功能,像 DisplayManager.errorLog Filelogfile 会设定 log 文件的位置。这个log 文件包含xdm Xsetup、Xstartup、Xsession和Xreset脚本的标准错误输出。

以上的登录进程完成后,xdm 启动在session resource中指定的脚本文件。它允许定制X会话的行为。管理员可能最想检验Xsession 脚本了。用户会想生成一个 $HOME/.xsession 或者是$HOME/.Xclients 文件 来定制会话管理器的行为(如,启动一个窗口管理器,一个时钟等等)

测试我们的设置

为了测试我们的设置,我们要找到 X (可以用which X命令)。在我的系统上,位置是/usr/X11R6/bin/X。

测试直接模式:

/usr/X11R6/bin/X -query remote xdm host 

间接的模式输入:

/usr/X11R6/bin/X -broadcast 

如果使用的是带有选择器的间接模式,输入:

/usr/X11R6/bin/X -indirect 远程的xdm主机 

一旦这些正常,我可以生成 /etc/rc.d/init.d 脚本自动启动和停止 xdm 服务。看一下《用红帽子的chkconfig管理Init脚本 》的文章(发表在linux杂志2001年四月),可以得到更多信息。 然后,我生成了如下的脚本以方便我的用户。在他们的工作站上,我生成了一个叫 /usr/bin/X11/startx.xdmcp的脚本。 如果主机叫"wkstn1",那么这个文件就是这样:

#!/bin/sh 
/usr/X11R6/bin/X -indirect wkstn1 

主机名就是xdm 服务器的名字(在我这里工作站既是xdm server又是X server)

接下来,我输入:

mv /usr/bin/X11/startx /usr/bin/X11/startx.original 
chmod 755 /usr/bin/X11/startx.xdmcp 
ln -s /usr/bin/X11/startx.xdmcp /usr/bin/X11/startx 

这允许那些想登录进他们的工作站输入startx就得到一个图形控制台的用户,得到一个可用 主机的列表来登录(包括他们自己的工作站)

结论

回顾一下,我们设置了网络上的服务器和工作站使用 xdm ,间接模式的XDMCP和选择器以便允许用户选择他们想用来管理的X会话。这是个便于管理的 解决方案,允许对X会话的完美控制(译者:有些夸张了),它也容易使用。提供给用户一个可用主 机的菜单,管理他们的X会话。

如果需要从windows这样的平台进行这样的访问,并且你不想购买也不想你的工作站上安装 一个X服务器的话,对你来说,vnc 是个不错的选择。


参考信息(译者提供)


用红帽子的chkconfig管理Init脚本 - http://www.dbanotes.net/OpenSource/Managing_Initscripts_with_RedHat's_chkconfig_CN.htm




本文译者

Fenng,某美资公司DBA,业余时间混迹于各数据库相关的技术论坛且乐此不疲。 目前关注如何利用ORACLE数据库有效地构建企业应用。对Oracle tuning、troubleshooting有一点研究。
个人技术站点:http://www.dbanotes.net/ 。 可以通过电子邮件 [email protected] 联系到他。

原文出处

http://www.dbanotes.net/OpenSource/Configuring_xdm.htm

回上页<-|->回首页

All Articles (by Fenng) are licensed under a Creative Commons License.
I would welcome any feedback. Please send questions, comments or corrections to [email protected]
Valid XHTML 4.01 / Valid CSS