桌面游击战术:便携式瘦客户端方法
作为一种操作系统,Linux 已经达到了进入主流计算的程度。人们不再对其名字感到困惑,当听到它被用于企业应用程序时也不会摇头。Linux 已经在现实世界中证明了其在成本、可扩展性和性能方面的价值主张。Linux 要征服的最后阵地是桌面。
Linux 在桌面上的现实情况是我们在一个正在部署 Linux 的组织工作时所面临的情况。几台服务器已经成功迁移到 Linux。现在,经理们正谨慎地关注着桌面。我们演示了几种面向桌面的发行版:Lindows、Xandros、Knoppix 和 Red Hat。在这些发行版中,经理们最喜欢 Red Hat 的环境和支持结构。
尽管他们喜欢在 Linux 桌面中看到的东西,但经理们觉得对演示的反应过于主观和理论化,无法承诺大规模部署。他们想看看用户对这种转变的反应。唯一的方法是通过试点小组。
我们面临着两个主要限制。首先,经理们希望在不严重中断日常运营的情况下运行试点小组。如果我们在试点小组现有的桌面上安装 Linux,我们将不得不在半天内完成整个工作。如果试点小组不喜欢他们所看到的,我们将不得不尽快恢复现有的 Windows 桌面。
其次,我们使用的是各种各样的旧机器。这些桌面是奔腾 II 和奔腾 III 计算机的混合体,具有不同的内存和硬盘配置,并且没有 CD-ROM 驱动器。更糟糕的是,硬盘通常只有不到 500MB 的可用空间。我们无法在这些机器上双启动一个像样的 Linux 发行版。
因此,摆在我们面前的挑战是:我们如何才能快速将 Linux 引入桌面,渗透用户的防御?同样重要的是,如果事实证明反对势不可挡,我们如何才能将 Linux 从环境中移除?我们将不得不采取游击战术来征服桌面。
对我们有利的一件事是办公室网络。幸运的是,公司投资了不错的以太网基础设施,并且所有机器都已经连接。这种设置立即引导我们考虑采用瘦客户端方法来完成我们的项目。
瘦客户端方法意味着我们将从一台胖服务器上运行所有应用程序。桌面本身将仅负责在显示器上输出显示,并接受来自键盘和鼠标的输入。但是我们如何才能做到这一点呢?
我们知道几个开源瘦客户端项目,最值得注意的是 Linux 终端服务器项目 (www.ltsp.org) 和 Netstation (netstation.sourceforge.net)。尽管这些软件包已被证明很受欢迎,但我们发现它们设置和维护起来很复杂。它们要求我们组装一个紧密耦合的服务器和客户端环境:例如,关键的客户端文件需要通过 NFS 提供服务。
我们更喜欢的方法是 AT&T 的虚拟网络计算机 (VNC) (www.uk.research.att.com/vnc)。VNC 是一种远程显示系统,允许您从网络上的任何位置查看计算桌面环境并对其进行控制,就像您坐在该计算机前一样。VNC 的优点在于它适用于客户端和服务器的各种平台。服务器和客户端主要通过 VNC 协议进行通信,因此它们没有那么紧密地联系在一起。我们几乎可以在任何类型的客户端和任何类型的服务器上运行它。
我们认为我们已经找到了答案,因此我们在 Linux 机器上安装了 VNC 服务器。我们在桌面上安装了 VNC 客户端,在 Windows 环境中运行。使用 VNC,我们的用户可以访问在我们服务器上运行的 Linux 桌面。
不用说,这种方法惨败。用户遵循阻力最小的路径,选择忽略 Windows 桌面上的 VNC 图标。他们没有尝试 Red Hat,而是继续使用他们的旧应用程序。幸运的是,我们在部署到试点小组之前发现了这一点。
我们只剩下一个办法:我们将不得不打包一个基于小软盘的发行版,其中包含一个 VNC 客户端。然后,在试点的持续时间内断开他们的硬盘驱动器,用户将别无选择,只能使用我们的瘦客户端网络。如果试点失败,我们将重新连接他们的硬盘,他们将回到旧的环境中。
以下是我们在其中确定的瘦客户端方法的大致轮廓。我们组装了一个带有 SVGA VNC 客户端的基于小软盘的发行版,然后我们设置了我们的 Linux 机器作为我们瘦客户端的胖服务器。然后,我们将我们的软盘发行版部署到客户端机器。我们所有的工作都是使用 Red Hat 9 的库存发行版完成的,除了我们从互联网上下载的一些软件包。
我们的瘦客户端启动软盘基于 BusyBox (www.busybox.net),它在软盘上提供了一个完整的可启动系统。它最初由 Bruce Perens 创建,目前由 Erik Andersen 维护。但是,要获得每个步骤的完整解释,我们将您推荐给 Bruce Perens 撰写并在 LJ 中发表的三篇文章,以及 BusyBox 网站上的文档(请参阅 www.linuxjournal.com/article/4335、www.linuxjournal.com/article/4395 和 www.linuxjournal.com/article/4528)。
下面,我们概述了我们瘦客户端方法中最复杂的部分。如果您想直接设置您的瘦客户端网络,请跳过本节并使用我们网站上提供的软盘映像 (cng.ateneo.net/cng/wyu/software)。您只需修改 network.cnf 和 libvga.config 文件以适应您网络的具体情况。
步骤 1:我们首先为我们的系统创建了一个具有适当节点和配置文件的文件系统。我们首先在一台 Linux 工作站上完成了此操作。为了简化和自动化该过程,我们编写了一个名为 genfilesys.sh 的脚本。您可以从 cng.ateneo.net/cng/wyu/software 下载此脚本。我们从 Bruce Perens 的脚本(也可以从 LJ FTP 站点 ftp.linuxjournal.com/pub/lj/listings/issueXXX/7109.tgz 获取)改编了这个脚本,并为 SVGALIB 和 UDHPC 添加了配置文件
mkdir svilinux-filesystem ./genfilesys.sh ./svilinux-filesystem
在 genfilesys.sh 中,我们还设置了视频模式和鼠标类型的参数,这些参数在 libvga.config 中定义。您可能需要修改此文件以适应您的环境。
步骤 2:构建 uClibc。uClibc 是一个 C 库,其中包含运行我们的 VNC 查看器所需的补充例程。我们从 www.uclibc.org 下载了源代码包 uClibc-0.9.20.tar.bz2,并将其编译到我们的准备文件系统中
tar xvjf src/uClibc-0.9.20.tar.bz2 cd uClibc-0.9.20 make make install make PREFIX=../svilinux-filesystem install_target export PATH=/usr/i386-linux-uclibc/bin:$PATH cd ..
步骤 3:构建 BusyBox。我们从 www.busybox.net 下载了 BusyBox 源代码包 busybox-1.00-pre2.tar.gz,并在我们的工作站中构建了它
tar xvzf src/busybox-1.00-pre2.tar.gz cd busybox-1.00-pre2 make config make dep make make PREFIX=../svilinux-filesystem install cd ..
对于配置,我们选择启用 CONFIG_AWK、CONFIG_TELNET、CONFIG_UDHCPC 和 CONFIG_FEATURE_INITRD;我们禁用了 CONFIG_SYSLOGD。
步骤 4:配置 SVGALIB。因为我们使用的是 VNC,所以至少我们需要将 SVGA 支持纳入我们的小型发行版中。为此,我们从 www.svgalib.org 下载了 SVGALIB 并对其进行了编译
tar xvzf src/svgalib-1.4.3.tar.gz cd svgalib-1.4.3 vi Makefile.cfg (defaults are okay) make install make prefix=../svilinux-filesystem installsharedlib ln -s libvgagl.so.1.4.3 \ ../svilinux-filesystem/lib/libvgagl.so.1 ln -s libvga.so.1.4.3 \ ../svilinux-filesystem/lib/libvga.so.1
不要使用 SVGALIB 的实验版本,因为它使用内核助手来处理帧缓冲区。使用此版本意味着重新编译内核以包含此支持,从而进一步膨胀内核。
步骤 5:配置 SVGA VNC 查看器。我们需要配置我们自己的 SVGA VNC 查看器,因此我们从 www.tightvnc.com 和 packages.qa.debian.org/s/svncviewer.html 下载了源代码。此 VNC 查看器仍然可以与 Red Hat 的库存 VNC 服务器一起使用。
tar xvjf src/tightvnc-1.2.9_unixsrc.tar.bz2 cd vnc_unixsrc xmkmf cd libvncauth xmkmf make cd ../.. tar xvzf src/svncviewer-0.1.1.tar.gz gzip -dc src/svncviewer_0.1.1-5.diff.gz | \ patch -p0 cd svncviewer-0.1.1 vi Imakefile
(添加-I/usr/local/include到 INCLUDES 和-L/usr/local/lib -L../vnc_unixsrc/libvncauth到 SVGALIB。)
rm makefile xmkmf make strip -s -x -X svncviewer install svncviewer ../svilinux-filesystem/bin
步骤 6:生成 ROM 文件系统。我们生成了一个 ROM 文件系统,可以加载到我们的启动软盘上
genromfs -f initrd -d ./svilinux-filesystem gzip -9 initrd
步骤 7:构建小型内核。为了最大限度地减小内核的大小,我们决定构建一个静态链接的 bzImage 样式内核。我们删除了所有不必要的项目,例如不需要的驱动程序和功能。我们需要包含的功能是
RAM 磁盘支持(在“块设备”菜单中)。
初始 RAM 磁盘 (initrd) 支持(也在“块设备”菜单中)。
ROM 文件系统支持(在“文件系统”菜单中)。
DOS FAT 文件系统(在“文件系统”菜单中)。
VFAT (Windows 95) 文件系统(在“文件系统”菜单中)。
我们通过在我们的内核源代码目录中调用来配置和编译内核
make menuconfig make dep clean bzImage
步骤 8:使用 SYSLINUX 创建可启动软盘。SYSLINUX 是一个用于 Linux 的引导加载程序,可从 MS-DOS 软盘运行。它是标准 Red Hat 9 安装的一部分。因此,当我们的准备好的软盘在驱动器中时,我们调用了
syslinux /dev/fd0
这改变了我们软盘的引导扇区,并将第二阶段引导程序 ldlinux.sys 文件复制到其中。
然后,我们将我们的 RAM 磁盘 initrd.gz 和编译后的内核 bzImage 复制到软盘
mount -t msdos /dev/fd0 /mnt cp initrd.gz /mnt/initrd.gz cp /usr/src/linux/arch/i386/boot/bzImage /mnt/linux
步骤 9:创建 SYSLINUX 配置文件。我们在我们的软盘中创建了一个名为 syslinux.cfg 的文件,其中包含以下行
TIMEOUT 20 DEFAULT linux LABEL linux KERNEL linux APPEND root=/dev/ram0 initrd=initrd.gz
这告诉 SYSLINUX 等待两秒钟,然后启动默认系统。内核使用以下参数启动root=/dev/ram0和initrd=initrd.gz.
步骤 10:接下来,我们在我们的启动软盘中创建了一个空的网络配置文件 network.cnf
HOSTNAME=vnc DEVICE=eth0 DHCP=yes VNCHOST=192.168.0.100
步骤 11:此时,我们在其中一台目标机器上测试了我们的启动软盘,看看它是否可以工作。
步骤 12:确信我们的启动软盘可以工作后,我们继续从中制作映像,以便我们可以重新创建其他启动软盘
umount /mnt dd if=/dev/fd0 of=./vnclinux.img mkdir loopback mount -o loop vnclinux.img loopback/ umount loopback/ rm -rf loopback dd if=./vnclinux.img of=/dev/fd0
我们的下一个主要步骤是为我们的瘦客户端设置一台胖服务器。我们首先在将成为我们胖服务器的机器上安装了 Red Hat 9。Red Hat 9 的默认 GNOME 工作站配置选项足以满足我们的需求。GNOME 和 X 需要正确配置。
接下来,我们检查了我们需要的软件是否已经安装——VNC 和 GDM 至关重要。我们还安装了 OpenOffice.org、Mozilla、Evolution 和 x3270 客户端,因为我们的用户环境需要这些软件。
然后,我们必须修改 GDM 配置。默认情况下,GDM 配置为不允许 XDMCP 连接。我们编辑了位于 /etc/X11/gdm/gdm.conf 中的 GDM 配置文件。我们需要更改的选项在 [xdmcp] 部分。我们将其更改为启用 XDMCP,如下所示
[xdmcp] Enable=1 HonorIndirect=1 Port=177
编辑配置文件后,我们重新启动了 GDM。这可以通过发出以下命令来完成
killall -HUP gdm
对于您自己的实现,请注意 /var/log/messages 文件中是否有任何不必要的错误消息。如果 GDM 未成功重新启动,您可以编辑 GDM 配置文件并启用详细调试。
然后,我们为我们的 VNC 服务器将以下条目添加到 /etc/services 配置文件中
vnc 5900/tcp
我们还创建了一个名为 /etc/xinetd.d/vnc 的文件,该文件需要包含以下行
service vnc { disable = no id = vnc socket_type = stream protocol = tcp wait = no user = gdm server = /usr/bin/Xvnc server_args = -inetd -geometry 800x600 -depth 16 -query localhost log_on_failure += USERID }
在以server_args开头的行中,-inetd参数之后的参数是标准 X 参数。通常传递给 X 服务器的任何参数都可以在此处传递。在本例中,生成的 GDM 会话加载在 800×600 屏幕上具有 16 位颜色的 X 会话中。这些值可以根据用户偏好进行更改。但是,颜色深度和屏幕分辨率越大,网络带宽消耗就越大。然后使用以下命令重新启动 Xinetd 超级服务器
/sbin/service xinetd restart
从这里开始,DHCP 服务器已准备好进行配置。我们希望允许工作站从 DHCP 服务器获取其网络配置选项,包括其 IP 地址。我们简单的配置文件 dhcpd.conf 如下所示
subnet 192.168.0.0 netmask 255.255.255.0 { option routers 192.168.0.1; option subnet-mask 255.255.255.0; option domain-name "svi.com.ph"; option doman-name-servers 192.168.1.1; range dynamic-bootp 192.168.0.128 192.168.0.255; default-lease-time 21600; max-lease-time 43200; }
设置好胖服务器后,需要对其进行测试。在 Windows 中,我们调用了一个 VNC 客户端并键入了我们胖服务器的 IP 地址。然后,我们看到了胖服务器的登录屏幕。我们使用我们的瘦客户端启动软盘尝试了相同的操作,结果类似。
在周四和周五,我们为我们的试点小组进行了培训。该小组的需求很简单,代表了组织中一半的人口:他们需要基本的办公生产力工具,例如电子邮件、Web 浏览和对大型机的终端访问。OpenOffice.org、Evolution、Mozilla 和 x3270 充分满足了他们的需求。
在星期六,我们断开了他们系统的硬盘驱动器,并为每个工作站复制了启动软盘。我们花了一天中的一半时间测试每台机器是否有任何故障。我们还将他们的文件迁移到胖服务器上的帐户,以便他们可以随时访问这些文件。我们还将打印机连接到胖服务器。最后,我们将服务器桌面设置为突出显示常用图标。
当用户在星期一到达时,迎接他们的是桌面上的 Red Hat 登录屏幕。SVGA 驱动的 VNC 显示器清晰,从加载时间到实际使用,应用程序的整体性能都非常快。总的来说,一切都如用户从我们的培训中所期望的那样进行。
试点的最初几天引起了用户的一些抱怨,但这在意料之中。毕竟,他们面临的环境与他们习惯的环境不同。更频繁的查询涉及如何使用 OpenOffice.org、他们的文件位置以及他们将如何打印。
在第一周结束时,问题逐渐减少。当同事问他们机器上运行的是什么奇怪的程序时,我们的试点小组甚至自豪地做出了回应。在我们应对 Blaster 蠕虫病毒感染潮期间,我们方法的真正价值无意中显现出来。当他们的同事面临系统速度减慢和在消毒 PC 时损失生产时间时,我们的试点小组继续在他们的机器上工作。
我们强烈认为,从试点中优雅退出的可能性对管理层和用户的看法都产生了积极影响。到目前为止,他们已选择不使用该退出选项。最终用户的反应是积极的,有些人甚至提出了可用性建议。
一个意想不到的额外好处已经浮出水面:它使公司能够观察和记录这种方法的部署和支持的速度、简易性和成本。反过来,这为管理层提供了考虑将其用作企业范围内的灾难就绪基础设施中的关键组件的选项。因此,在没有不可撤销地将公司投入大规模迁移的情况下,原型系统已在整个组织中播种,并正在由拥护者培育。
当前的战略选择包括继续部署这些终端,以提高和改进支持技能和用户熟悉度。我们相信,这种技能组合和态度在整个企业中的扩散将增强未来的决策演算,并进一步巩固 Linux 作为一种实用且卓越的替代方案的地位。
William Yu 负责位于马尼拉的 IT 外包公司 SVI Technologies, Inc. 的信息规划和安全。他的兴趣领域包括高性能计算、网络安全和信息系统规划。他还是马尼拉雅典耀大学的教员。
Dominique Cimafranca 是 IBM 菲律宾公司的 Linux IT 专家。他已为多家企业客户在 IBM 的全系列硬件平台上实施了 Linux。在过去的三年中,他一直在撰写关于 Linux 和技术问题的文章。