翻译: Feng Dahui
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服务器发送:
Direct(直接的) --请求指定的主机直接显示一个登陆屏。
Broadcast(广播的)--给网络上的所有主机广播一条消息,
第一个应答的提供这个登录服务。
Indirect(间接的) --联系一个指定的运行xdm的主机并询问是否知道哪个主机可以通信 。
xdm 服务器可以实现一个可用的可以管理X会话的服务器列表。
X server 偶尔会结束与所选的用来得到登陆进程服务的主机的
直接通信。
发明xdm 的一个最初的原因是要允许管理X终端。这些设备基本上就是显示器,键盘,和鼠标并带有嵌入的X服务器软件 ;所有的智能都在网络上的服务器上。xdm 被用来“推“登录屏幕并管理这些设备的会话。若干年前,这些东西很流行,因为访问 UNIX 工作站受到限制。一个用户如果想访问图形工作站的话,要不是足够幸运的拥有一台UNIX工作站就需要一套这样的设备。后来这些设备变得有些过时,并逐渐被运行X服务器软件的个人电脑Linux 和其他的 Unices (Solaris x86, xBSD, etc.)或者是Windows(运行Hummingbird Exceed或类似的软件)代替 。
当使用xdm管理这些X任务的时候在设置上有些费劲儿。乍一看,可能会出现这样的情况:如果你设置xdm (为了使用 XDMCP 的优点), 没看到本地的 X 服务器启动 (i.e.,当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
-----------------------------------------
你可以设定xd