深入探讨:配置 xdm
您是否曾经想过远程访问工作站的桌面?或者访问服务器机器上的桌面?这正是我最近需要解决的问题。我负责设置和管理一组 Linux 服务器。第五次去实验室访问 GUI 控制台(需要门禁卡、密钥代码、爬楼梯等)后,是时候找到一种解决方案,让我可以使用工作站访问各种服务器机器上的 X 桌面。
有些人可能认为,用于处理远程会话的标准 X 工具足以解决我的问题,例如
telnet host1 export DISPLAY=mywkstn:0 gnome-session
(或某些其他会话管理器)。
然而,我正在寻找的解决方案需要提供不仅仅是基本的功能。它需要更易于管理、看起来更自动化,并且更易于 Linux 新手开发人员使用。身份验证、会话管理等方面存在一些陷阱,需要一些 X 工作原理的知识。例如,使用远程 X 客户端时,我经常忘记输入 xhost +host1。当试图向 Linux 新手解释 xhost 身份验证方案时,我也曾收到困惑的眼神。由于这个开发项目不是教开发人员 X 基础知识的时候,我正在寻找一种能够满足所有这些要求的解决方案。
有几种解决方案可以让我更轻松地管理 X 会话。我为这个项目选择的解决方案是 X 显示管理器 xdm,尽管另一个流行的解决方案是 vnc。我选择 xdm 而不是 vnc 有两个原因。首先,vnc 需要服务器端为每个共享桌面运行一个守护进程。其次,我已经在我所有的工作站上安装了 X 服务器软件,并且认为没有必要安装额外的客户端软件。其他的选择是 kdm 和 gdm,分别是 KDE 和 GNOME 软件包的一部分。
X 是大多数 UNIX 环境中使用的图形支持系统。如果您在 Linux 桌面上使用 GNOME 或 KDE,那么您正在使用 X Window 系统。它由 X 联盟(www.X.org)定义和维护。大多数 Linux 用户使用 XFree86 项目(www.xfree86.org)提供的 X Window 系统的实现。xdm 是一个显示管理器,可以实现灵活的会话管理功能。虽然 xdm 通常被认为是“自动启动我的 X 东西的 GUI 登录屏幕”,但实际上它功能更强大,我们稍后会看到。
在 X 世界中,术语客户端和服务器可能会让人有些困惑。具体来说,X 服务器是控制键盘、鼠标和显示资源的应用程序。客户端是向服务器发出请求以代表其执行操作的应用程序(即,显示具有某些指定特征的窗口)。对于我们这些习惯于将工作站上运行的应用程序视为客户端的人来说,这有点不同。
xdm 使用 X 联盟的 X 显示管理器控制协议 XDMCP 与 X 服务器通信。这允许 X 服务器从运行 xdm 的服务器获得会话服务。X 服务器可以发送三种类型的查询
直接—直接要求指定的主机显示登录屏幕。
广播—向网络上的所有主机广播消息,第一个应答的主机提供登录处理服务。
间接—联系运行 xdm 的指定主机,并询问它可以与之通信的已知主机。xdm 服务器将显示愿意管理 X 会话的可用服务器列表。X 服务器最终将直接与选定的主机通信以获得登录处理服务。
创建 xdm 的最初原因之一是为了管理 X 终端。这些设备基本上是一个显示器、键盘和鼠标,带有嵌入式 X 服务器软件;所有智能都位于网络中的服务器上。xdm 用于推送登录屏幕和管理这些设备的会话。几年前,这些设备很流行,因为对 UNIX 工作站的访问受到限制。想要在其办公桌上访问图形桌面的用户要么幸运地在其办公桌上拥有一台 UNIX 工作站,要么需要这些设备之一。最近,这些设备变得不太流行,并且正在被运行 X 服务器软件的 PC 取代,例如 Linux 和其他 Unices(Solaris x86、xBSD 等)或 Windows(运行 Hummingbird Exceed 或类似软件)。
当使用 xdm 管理这些 X 会话时,有一些配置陷阱。乍一看,似乎如果您配置 xdm(为了利用 XDMCP),您要么启动本地 X 服务器(即,当 xdm 启动时控制台进入图形模式),要么,如果您在 xdm 中禁用本地显示并使用 startx,它不会让您访问选择器。这里描述的配置允许任何 XDMCP 客户端访问 Linux 服务器桌面(当然,受 X 安全条款的约束)。它还演示了一种配置 xdm 的方法,以便同时获得本地 X 桌面和从工作站访问其他服务器桌面的能力。
安全性和访问控制由 xdm 管理,但超出本文的范围。xdm 仅应在受控环境中使用。此外,应阻止所有防火墙上的传入端口 177。如果您对 X 安全问题感兴趣,以下 man 页面是一个很好的起点:xdm(1)、xauth(1)、Xsecurity(7)、lbxproxy(1)--低带宽 X 代理、xfwp(1)--X 防火墙代理,以及 ssh(1) 和 sshd(8) man 页面,特别是关于 X11 端口转发。
xdm 是高度可配置的;以下只是配置它以实现特定目标的一种方法。
在我的 Red Hat 7 系统上,xdm 位于 /etc/X11/xdm 中。其主要配置文件是 xdm-config(参见列表 1)。
xdm 的配置文件采用 X 资源格式。有用于配置各种文件位置的资源。我们对 servers、accessFile 和 resources 资源指向的文件感兴趣。喜欢冒险的人会对 session 和 DisplayManager._X.setup 感兴趣,其中 X 是显示编号。
请注意,DisplayManager.requestPort:0 已被注释掉。此资源指定用于侦听 XDMCP 请求的 UDP 端口。如果将其设置为 0(默认值),则 XDMCP 请求将被忽略,并且 xdm 仅管理本地显示(请参阅 Xservers 文件)。我们将其注释掉,以便 xdm 将侦听默认端口(USP 端口 177)。
我的 Xservers 文件如下所示
#:0 local /usr/X11R6/bin/X
如果此行未被注释掉,那么每次我启动 xdm 时都会得到一个图形登录屏幕。也就是说,它将通过运行命令 /usr/X11R6/bin/X 在显示器 0 上启动和管理本地 X 服务器。我们想要能够做的是选择我们将连接到的主机。我们使用 Xaccess 文件来实现这一点
#any indirect host can get a chooser * CHOOSER BROADCAST # # If you'd prefer to configure the set of # hosts each terminal sees, # then just uncomment these lines # (and comment out the CHOOSER line above) # and edit the %hostlist line as appropriate # #%hostlist host-a host-b #* CHOOSER %hostlist #尽管 Xaccess 文件是一个非常灵活的工具,但我们只会使用它来启动选择器(间接模式)。选择器是一个小的 X 应用程序,它显示网络上可用主机的列表,允许我们选择我们要连接的主机。我喜欢使用 BROADCAST 选项,因为新主机会自动显示在列表中。有些人可能更喜欢专门命名主机,如使用 %hostlist 宏所示。这种方法有时是必需的,尤其是在广播无法到达所有所需主机的大型网络中。
如果您对更精细的控制感兴趣,可以使用服务器列表而不是 BROADCAST。这将允许您直接指定可用主机的列表。
如果您想配置 xdm 以不同方式处理来自不同 X 服务器的请求,您可以指定主机名或主机列表而不是 *。以下是示例。
以下行告诉 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 以使用选择器处理间接查询(我们首选的方法)。在我们的下一个示例中,host-a 获得一个选择器窗口,其中包含应答 BROADCAST 的所有主机的列表,而其他所有人仅获得 %hostlist 指定的列表
%hostlist server-a server-b host-a CHOOSER BROADCAST * CHOOSER %hostlist.最后,为了完成基本功能,我们可以查看 Xresources 文件。我保留了我的默认设置,但有些人可能想要自定义外观和感觉。在此文件中,您可以更改颜色、字体和其他样式选项。我发现 Chooser*geometry 资源最有用,因为它允许您设置选择器应用程序窗口的大小。
您也可以在 xdm-config 中配置一些管理功能。例如,DisplayManager.errorLogFilelogfile 将设置日志文件的位置。此日志文件包含 xdm、Xsetup、Xstartup、Xsession 和 Xreset 脚本的 stderr 输出。
成功完成登录过程后,xdm 会启动 session 资源中指定的脚本文件。这允许用户自定义 X 会话的行为。管理员很可能想要查看 Xsession 脚本。用户将想要创建一个 $HOME/.xsession 或 $HOME/.Xclients 文件来自定义会话管理器的行为(即,启动窗口管理器、时钟等)。
为了测试我们的配置,我们需要找到 X (which X)。在我的系统上,它位于 /usr/X11R6/bin/X 中。无论如何,您应该最终看到一个登录屏幕。要测试直接模式,您需要键入
/usr/X11R6/bin/X -query remotexdmhost
对于间接广播模式,键入
/usr/X11R6/bin/X -broadcast对于使用选择器的间接模式,键入
/usr/X11R6/bin/X -indirect remotexdmhost一旦这些工作正常,我就创建了 /etc/rc.d/init.d 脚本来自动启动和自动停止 xdm 服务。有关更多信息,请参阅 2001 年 4 月Linux Journal 中关于使用 chkconfig 实用程序的文章。
然后,我创建了以下脚本,以简化用户的生活。在他们的工作站上,我创建了一个名为 /usr/bin/X11/startx.xdmcp 的文件。如果主机名为“wkstn1”,则该文件包含
#!/bin/sh /usr/X11R6/bin/X -indirect wkstn1
其中 hostname 是 xdm 服务器的名称(在我的情况下,工作站既是 xdm 服务器又是 X 服务器)。
接下来,我输入了
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 可能是您的替代方案。
