VNC,透明地
这个分为两部分的文章系列介绍了一种新颖的方法,为您的 Linux 系统设置基于 VNC 的 X Window 系统桌面。在本系列文章结束时,您将拥有一个配置,允许用户通过显示管理器(如 GDM、KDM 或 XDM)登录到他们的 X-Window 桌面(运行 GNOME、KDE 或其他首选窗口管理器环境)。更重要的是,用户将可以从工作站控制台和网络上的任何其他位置安全地访问相同的桌面和相同的状态。
通常,工作站系统运行显示管理器。在本文中,我们将此类应用程序(如 XDM、GDM(GNOME 显示管理器)或 KDM(KDE 显示管理器))统称为显示管理器。显示管理器为用户提供图形登录提示。当用户登录时,显示管理器启动相应的窗口管理器(如 fvwm2、GNOME 或 KDE)。从窗口管理器中,用户可以运行他或她希望的任何应用程序。当用户注销时,应用程序关闭,窗口管理器退出,显示管理器重新出现,准备允许另一用户登录。如果同一用户再次登录,显示管理器将重新启动窗口管理器,并且所有应用程序都必须重新启动。这就是传统的 X Window 系统桌面的工作方式。我们将这样的桌面会话称为 X 桌面。我们还说,当用户使用工作站的键盘和显示器时,他或她正在登录到控制台。这与通过网络连接相反。
在 Choong Ng 在 Linux Journal 上发表的题为“虚拟网络计算”的文章 [可在 www.linuxjournal.com 获取] 中,我们学习了如何设置 VNC 以允许从网络上的任何计算机对桌面进行有状态访问。我所说的有状态是指,当用户未连接到桌面时,桌面不会终止,而是保持等待用户重新连接。当用户使用 VNC 客户端连接到 VNC 服务器时,每个窗口都位于上次离开的位置,每个应用程序的状态都与上次使用时相同,并且每个打开的文件都保持在相同的位置打开。控制窗口管理器和应用程序的 VNC 服务器的性质允许这样做。
因此,网络上的任何计算机都可以运行 VNC 客户端(如 vncviewer)来连接到工作站并显示桌面。我们甚至可以在运行 VNC 服务器的工作站上运行 VNC 客户端。我们将这样的桌面会话称为 VNC 桌面,我们将运行 VNC 服务器(及其窗口管理器)的工作站称为 VNC 工作站。
VNC 桌面存在一个问题。假设您要登录到 VNC 工作站的控制台。您的 VNC 桌面也在此工作站上运行,您从网络上的许多不同计算机连接到同一个桌面。您希望继续通过网络访问 VNC 桌面。同时,当您通过显示管理器登录到控制台时,您希望看到与通过 VNC 连接时看到的相同的桌面。但是,如果您通过显示管理器登录到工作站,它将启动一个新的窗口管理器。基本上,您启动了一个新的 X 桌面,它独立于已在此工作站上运行的 VNC 桌面。
如果您想连接到 VNC 桌面,则必须运行 VNC 客户端,例如 vncviewer。这是很尴尬的,因为基于 X 的桌面的一个窗口本身就是另一个桌面(VNC 桌面)。跟踪多个级别的重定向可能会很麻烦。除了令人困惑之外(由于不清楚用户实际使用的是哪个桌面),它也是低效的,因为它需要同时运行两个窗口管理器,而实际上只需要一个。
本文解释了如何配置 X 服务器、显示管理器和 VNC 服务器,以便通过显示管理器登录时看到的桌面是 VNC 桌面,没有第二个窗口管理器,并且所有文件和应用程序的状态都与上次离开时相同。
我们讨论的方案可以在任何 Linux 发行版上工作。它需要工作的 X 服务器、显示管理器和 VNC。我使用以下命令检查了这些软件包
rpm -q XFree86 vnc XFree86-xdm kdebase gdm
只需安装 XFree86-xdm kdebase 或 gdm 即可。我应该注意,本文中讨论的所有配置文件位置均与 Red Hat 7.1 随附的位置相同。可以配置任何 Linux 系统以允许透明 VNC 桌面,但如果配置文件位于不同的位置,您可能需要下载软件或找到配置文件。
无论您喜欢哪种显示管理器,都应在启动时启动它。这通常通过 /etc/inittab 中类似于以下的行来完成
x:5:respawn:/etc/X11/prefdm -nodaemon
prefdm 通常是您首选的显示管理器的链接的副本。X 和您首选的显示管理器必须已启动并正在运行。
VNC 服务器也必须正在运行,并且必须配置为运行您首选的窗口管理器。这可以通过编辑文件 $HOME/.vnc/xstartup 来调用您首选的窗口管理器来完成。对于 KDE,使用 startkde &;对于 GNOME,使用 gnome-session &;对于 FVWM2,使用 fvwm2 &。此外,请确保已在 $HOME/.vnc/passwd 中运行 vncpasswd 以创建密码文件。
Red Hat 7.1 提供了一种在启动时轻松启动 VNC 桌面的方法。使用 linuxconf 将 vncserver 启动脚本(在 /etc/init.d/vncserver 中)设置为在启动时启动。但是,默认的启动脚本并没有给我我希望的灵活性。编辑 /etc/init.d/vncserver,查找包含以下内容的行
"su - ${display##*:} -c \"cd && [ -f .vnc/passwd ] && vncserver :${display%%:*}\""
将其更改为如下所示
"su - ${display##*:} -c \"cd && [ -f .vnc/passwd ] && vncserver ${ARGS} :${display%%:*}\""然后编辑 /etc/sysconfig/vncservers,使其如下所示
# The VNCSERVERS variable is a list of # display:user pairs. # # Uncomment the line below to start a VNC server on # display :1 as my 'myusername' (adjust this to your # own). You will also need to set a VNC password; # run 'man vncpasswd' to see how to do that. # # DO NOT RUN THIS SERVICE if your local area network # is untrusted! For a secure way of using VNC, see # <URL:www.uk.research.att.com/vnc/sshvnc.html>. VNCSERVERS="1:jdimpson" ARGS="-geometry 1024x768 -alwaysshared "将 ARGS 中的值“1024x768”更改为表示您的实际 X 桌面大小。将您希望的任何其他 VNC 服务器参数添加到此 ARGS 变量中。将 VNCSERVERS 中的 jdimpson 更改为您希望运行 VNC 桌面的任何用户。“VNCSERVERS”中的值“1”使 VNC 服务器作为显示器 1 运行。您可以像这样启动其他桌面
VNCSERVERS="1:jdimpson 2:phred 3:sysadmin"在 Red Hat 系统上,通过执行以下命令确保 VNC 服务器正在运行
/etc/init.d/vncserver start此时,您可以使用任何 VNC 客户端连接到 VNC 桌面。
在我的 Red Hat 7.1 系统上,我创建了一个名为 $HOME/.xsession 的文件。此文件说明了当通过显示管理器登录时应运行哪个程序,通常是窗口管理器。登录时,显示管理器会检查此文件的存在。如果存在,显示管理器将运行文件中列出的程序。显示管理器认为此文件包含启动用户所需窗口管理器的命令。但是,我们不运行 GNOME 或 KDE 等窗口管理器,而是运行 VNC 客户端。编辑 $HOME/.xsession,使其如下所示
exec vncviewer -passwd $HOME/.vnc/passwd -fullscreen localhost:1
如果您使用的是其他 Linux 发行版,则很可能相同的机制对您也适用,但您应仔细检查。一种快速检查方法是将以下行
exec fvwm2放在此文件中(假设您的系统上已加载 fvwm2)。当登录到显示管理器时,如果 fvwm2 启动,则您已成功。如果未启动,则您必须深入研究系统的文档或配置文件;尝试理解 /etc/X11/xdm/Xsession 的作用。
登录到显示管理器登录窗口。您将看到您首选的桌面。
当您使用显示管理器登录到服务器时,它将被在 VNC 服务器下运行的您选择的窗口管理器替换。如果您有同一网络上的另一台计算机,请尝试使用 VNC 客户端连接到您的服务器。您应该看到 两 个桌面的副本。当您使用一台计算机移动窗口时,您也会在另一台计算机上看到窗口移动。
如果在登录到显示管理器后,屏幕闪烁并且显示管理器登录横幅返回,则表示出现问题。确保 vncserver 正在运行,并确保 .xsession 文件正确。
请注意,在此设置中,您不应使用窗口管理器可能包含的任何注销功能。这样做将结束 VNC 桌面,这可能不是您想要做的。相反,只需按 Ctrl-Alt-Backspace 即可终止 X 服务器。您将看到显示管理器返回到屏幕。如果您重新登录,您将回到您离开的位置。因此,您可以将控制台交给其他人,但不会丢失桌面状态。
当服务器启动时,它将为 /etc/sysconfig/vncservers 文件中的每个用户运行 VNC 服务器。启动时,VNC 服务器会读取您主目录中的 .xsession 文件,并使用它来运行您首选的窗口管理器。然后,VNC 服务器将简单地坐在 RAM 中,等待连接(本地连接或来自网络的连接)。
显示管理器也在启动时启动,这会向您显示图形登录横幅。
未配置 VNC 服务器且其主目录中没有正确的 .xsession 文件的用户,在登录到显示管理器时将获得正常的 X 桌面。配置了所有这些内容的用户将获得 VNC 桌面,并且还可以从网络上的任何位置访问 VNC 桌面。但是,安全地执行此操作是下一篇文章的主题。
我在此处描述的设置有很多优点。对我而言,主要优点是能够从工作中的任何计算机访问我的桌面状态,如果我在站点的另一侧,会议之间有半个小时的间隔,并且我想查看我的电子邮件或日历,这很好。
将 VNC 用作默认桌面的主要缺点是您会损失图形性能。例如,由于重绘延迟时间长,在 VNC 桌面上播放电影速度很慢。大多数快节奏动作游戏也很慢。此外,当 VNC 服务器运行时,它对于您运行的所有应用程序都充当 X 服务器,但它没有任何加速。即使您的真实 X 服务器已加速,您也无法利用它。(您可以注销,以其他用户身份登录,播放电影或游戏,完成后注销,然后以您的普通用户身份再次登录。您的原始桌面将像您离开时一样在那里。)
此配置无法很好地扩展以支持多个用户。您可以在 /etc/sysconfig/vncservers 文件中定义许多 VNC 会话以在启动时启动。但是,所有这些 VNC 桌面都将处于空闲状态,直到它们被使用。并且对于每个 VNC 桌面,都会运行一个 VNC 服务器,运行一个窗口管理器,并且在 GNOME 或 KDE 的情况下,会运行许多辅助应用程序。所有这些都会占用 RAM,并且它们可能会相互竞争资源,例如声卡。类似 Citrix MetaFrame 和 Microsoft Terminal Server 等商业解决方案需要功能强大的计算机来支持许多用户,我猜这个解决方案在这样的硬件上也能很好地工作。
另一种替代解决方案是使用 XDMCP,这是传统 X 世界提供远程 X 访问的方式(类似于 X 终端)。但是这样做会失去状态性,因为每次连接到服务器时都会重新启动桌面,并且您失去了远程和本地共享同一桌面的能力。有关更多信息,请参阅您的显示管理器(xdm、gdm 或 kdm)或 www.linuxdoc.org/HOWTO/XDMCP-HOWTO 的文档。
另一种解决方案是使用 -inetd 选项从 inetd/xinetd 运行 VNC。但是,这样做会导致 VNC 服务器为每个连接重新启动,不允许对一个桌面进行多个连接,并在原始连接退出后关闭。因此,它失去了状态性以及远程和本地共享桌面的能力。有关更多信息,请参阅 VNC 服务器文档。
另一种选择是 x0rfbserver。这是一个在您的普通 X 桌面中运行的应用程序,它会将桌面的内容中继到 VNC 客户端。它运行良好,并且可以让您充分利用 X 服务器支持的任何加速显卡。它也比运行 X 服务器加上 VNC 服务器更节省 RAM(除了 x0rfbserver 本身(相当小)之外,它只需要一个 X 服务器)。但这需要您始终保持 X 桌面在控制台上运行,因此它无法扩展以支持多个用户。有关更多信息,请参阅 www.hexonet.de/software.en。

Jeremy D. Impson 是纽约州奥维戈洛克希德·马丁系统集成公司的高级副研究科学家。他在那里是移动通信和游牧计算中心的成员,在那里他使用开源软件开发移动计算系统。可以通过 jeremy.impson@lmco.com 与他联系。