大规模 Linux 网络的自动化安装

作者:Ali Raza Butt

在 PC 上安装 Linux 长期以来被认为是编程大师的领域。新手用户通常需要数周甚至更长时间才能正确配置系统。然而,随着新兴的安装技术和软件包管理,尤其是来自 Red Hat 的技术,Linux 正处于变得用户友好的边缘。然而,即使使用这些较新的方法,Linux 仍然令人沮丧的一个方面是大规模安装。这并不是因为它困难,而是因为它是一项单调乏味的工作。本文的目的是讨论一种简化大规模安装的技术基础。此外,还讨论了一种利用网络唤醒技术自动开启局域网的方案。

安装自动化:为什么?

标准的 Linux 安装会询问许多关于要安装什么、要配置什么硬件、如何配置网络接口等问题。回答这些问题一次是有益的,甚至可能很有趣。但是,想象一下一位系统工程师必须设置一个包含大量机器的新 Linux 网络。现在,同样的问题需要解决,同样的问题需要重复回答。这使得任务非常低效,更不用说令人恼火和厌烦了。因此,需要自动化此参数和选项选择。

简单地复制硬盘的想法自然而然地浮现在脑海中。这可以快速完成,所有必要的功能和软件都将被复制,而无需选择选项。然而,事实是,简单地复制硬盘会导致各个计算机变得过于相似。反过来,这又产生了一个全新的任务,即必须重新配置每台 PC 上的各个设置。例如,每台机器的 IP 地址都必须重置。如果未正确执行此操作,则会导致奇怪且莫名其妙的行为。

Kickstart 又如何呢?

我们这些使用过 Red Hat Linux 的人可能都知道,它已经提供了一种称为 Kickstart 的自动化安装方法。这个有用的功能实际上构成了我们开发的方法的基础。Kickstart 允许我们预先指定我们在安装过程中对所有必要问题的答案。所需安装的规范列在一个名为 ks.cfg 的特殊文件中。然后将此文件放在 NFS 服务器上,并使用软盘启动目标系统。Red Hat 发行版上的安装提示允许您从多种安装方法中进行选择。只需在提示符下输入“ks”即可选择 Kickstart 作为所需的技术。如果一切都已正确完成,瞧!您在最后收到的唯一消息将是成功安装的声明。

我们的场景

我们被赋予的任务是建立一个由 64 台 Pentium III 机器组成的 Linux 实验室,这些机器通过 100MB 以太网连接。六十台机器将被设置为工作站,四台将被设置为各种服务器。对于如此大量的机器,很明显非常需要强大的安装手段。我们的技术实力显而易见,整个设置过程花费了我们大约 60 个小时,分布在 15 天内。让我们详细了解一下我们采用的方法。

给 Kickstart 一脚油门!

为在我们的实验室中用作工作站而获得的六十台计算机(参见图 1)有硬盘,但没有软盘驱动器。为了让 Kickstart 运行起来,我们需要拆下机箱并手动将软盘连接到每台机器,启动机器,安装 Linux,最后取出软盘。这是一个漫长的过程,因为软盘总是会坏,即使它们没有坏,也需要一两分钟的时间等待软盘加载。当您双手合十,盯着屏幕等待时,这可能会变成令人不快的两分钟,只是为了收到可怕的“启动失败”消息。此外,如果磁盘确实坏了,则需要更长的时间才能将另一个映像写入新磁盘。

Automated Installation of Large-Scale Linux Networks

图 1. Linux 实验室

必须采取更明智的方法。我们将 Red Hat 安装盘与一个非常好的网络启动包 etherboot 合并,以获得磁盘的网络可启动映像。现在,由于我们也已将此映像放在 NFS 服务器上,因此软盘上只需要一个 16KB 的加载程序,该加载程序将在 20 秒内启动。然后,此加载程序将通过网络检索实际映像。可以在不到 30 秒的时间内轻松制作一个新的软盘。

加载程序实际上是一个 ROM 映像;因此,为了使其更可靠,我们将其刻录在 EPROM 上。用于网络安装的 Red Hat 启动盘映像保存在 DHCP/TFTP 服务器上。为了让安装运行起来,ROM 被插入网卡,机器从网络启动。同一个 ROM 可以重复使用以启动其他机器。由于 ROM 坚固耐用且体积小,因此开发了一种高效的启动安装方法。我们称之为超级 Kickstart。

准备工具

在我们开始设置超级 Kickstart 之前,我们需要获取和设置一些软件包。第一个是 etherboot 包(参见资源)。为了达到我们的目的,该软件包必须稍作修改,如下所示。

在目录 etherboot/netboot/mknbi-linux 中,编辑文件 mknbi.h,如列表 1 所示。

列表 1

现在,编辑 etherboot 的配置文件 etherboot/src/Config.32,如下所示。找到行

CFLAGS+=        -DDHCP_SUPPORT -DMOTD -DIMAGE_MENU

并将其更改为

CFLAGS+=        -DDHCP_SUPPORT
如果目标机器的 BIOS 未正确配置网卡,您可能还需要在编译软件包之前在此行末尾添加 -DCONFIG_PCI_DIRECT

接下来,我们移动到顶层 etherboot 目录并执行 make all 以编译所有二进制文件。

然后,我们创建了一个目录来保存此设置的所有必要可执行文件。我们将文件 etherboot/src/floppyload.bin 和相应的 ROM 映像 .rom 和 .lzrom 从 etherboot/src-32/ 目录复制到此位置。文件 mknbi 也从 etherboot/netboot/mknbi-linux/ 复制到此目录。

第二个需要的工具是 streplace 实用程序(参见资源)。此有用的软件包用于在文件中替换字符串,同时配置特定于主机的参数,这些参数随每个工作站而变化,例如,主机名和 IP 地址。编译二进制文件后,也将其复制到上面提到的工作目录。有了这些工具,我们很高兴地进入了下一步。

不再需要安装盘

仔细查看 Red Hat 安装盘,发现它包含一个 Linux 内核、一个初始 ramdisk 映像和一些配置文件。为了我们的目的,我们只使用了内核和初始 ramdisk 映像。要查看磁盘映像的内容,请使用以下命令将其作为环回设备挂载

mount -o loop
cd mount_point

然后,我们将内核映像 (vmlinuz) 和初始 ramdisk (initrd.img) 复制到我们之前创建的目录中。此外,文件 syslinux.cfg 提供了启动 Kickstart 安装所需的内核选项。我们记下了这些选项。到此为止,我们不再需要安装盘了。

设置 Kickstart 选项文件

Kickstart HOWTO 详细讨论了 ks.cfg 文件的语法。虽然信息量很大,但生成此文件需要太长时间。因此,我们设计的方法是首先使用“正常”CD-ROM 方法在机器上安装 Red Hat Linux 6.1。我们手动指定了我们即将成为目标机器的所有软件包、选项和设置。一旦系统启动并运行,就对其进行了最佳性能测试,然后将其用作其余安装的原型。

还需要安装一个名为 mkkickstart 的特殊软件包。mkkickstart 实用程序可以从安装中提取信息并将其打印到标准输出。我们使用它来精确地执行此操作

mkkickstart >ks.cfg

现在使用 ks.cfg 作为配置文件运行的任何 Kickstart 安装都将创建我们原型工作站的副本。我们对该文件进行了一些小的编辑以实现一些更改。列表 2 是文件开头部分的示例。

列表 2

安装后和自定义

Kickstart 技术提供了执行安装完成后所需的任何必要安装后过程的规定。此功能除了允许个人自定义外,在安装标准 Red Hat 发行版中未包含的软件包时尤其有用。在我们的案例中,这些包括 Linux 版 JDK(Java 开发工具包)等等。我们在安装后部分添加了以下行,并创建了一个单独的脚本和 Perl 程序(参见列表 3 和 4),它们将在 Red Hat 安装完成后执行

%post
cd /root
tar -xvzf install:/kickstart/install.tar.gz
cd installfiles
 ./postinstall
cd /root
rm -rf installfiles

tar 文件 (install.tar.gz) 放在安装服务器 (install) 上,可以从那里检索并执行以自定义系统。我们的特殊自定义包括从我们的 ftp 服务器解压 JDK,设置 linuxconf 以进行 Web 访问,指定 DNS 服务器以及允许从服务器对工作站进行 root 远程 shell 访问。

列表 3

列表 4

设置网络启动

剩下的一个问题是将 ks.cfg 文件放在哪里以及如何放置,以便目标系统即使在经过 DHCP/TFTP 启动后也能够接收到它。对安装过程的分析表明,初始 ramdisk 中的 tmp 目录是 Kickstart 系统查找配置文件的位置之一。

将每个 ks.cfg 复制到适当的位置,然后将内核添加到 initrd 以制作封装的代码块的过程全部由一个名为 superkick 的脚本执行。查看此脚本(参见列表 5)将显示设置网络可启动映像所涉及的步骤。

列表 5

我们编写了另一个脚本 doitfor,以自动自定义每个工作站的 ks.cfg 文件和安装后文件。如列表 6 所示。此脚本执行的主要任务是使用 streplace 实用程序在每个 ks.cfg 中插入特定的主机名和 IP 地址。此脚本将主机名和 IP 地址作为输入,并生成要使用 DHCP/TFTP 启动上传的启动映像。

列表 6

DHCPD 配置

为了让安装运行起来,我们需要设置 DHCPD 服务器或 BOOTP 服务器。BOOTP 方法的问题在于必须提供网卡 MAC 地址列表才能向目标机器颁发 IP 地址。对于大量的安装,这将是一项非常繁琐的工作,因此我们选择了 DHCPD。DHCPD 选项很多,但我们只需要最基本的选项,即默认名称服务器地址、起始 IP 和域名。

现在这里棘手的问题是,如果我们启动一台机器,将为其颁发 IP 地址。只要它保持开启状态,IP 地址就不会被重用,并且任何后续开启的机器都将自动获得 DHCP 守护程序授予的下一个 IP 地址。如果第一台机器被关闭,则其 IP 地址将变为可用。由于 DHCP 可以自由分配任何未使用的 IP 地址,因此很有可能将相同的 IP 地址分配给另一台新机器。如果然后运行安装,则这台新机器最终将与关闭的机器具有相同的主机名和 IP 地址。简而言之,它们将具有相同的网络设置,并且无法正常工作。

为了解决这个问题,我们更改了 DHCPD 允许提供的第一个 IP 地址。这是通过重新配置 /etc/dhcpd.conf 文件(参见列表 7)并重新启动 DHCPD 来完成的。doitfor 脚本包含每次为新目标创建启动映像时执行此任务的代码。一旦分配了 IP 地址,就可以将 DHCPD 切换到下一个 IP 地址,并且可以开始下一个安装,而不会出现问题。

列表 7

安装过程

一旦 DHCPD 配置为为目标提供所需的 IP 地址,我们就可以通过两种方式进行操作。第一种是将 ROM 映像刻录到 EPROM 中,并将 EPROM 插入网卡。这显然需要一个 EPROM 编程器。第二种也是更简单的方法是使用命令

cat floppyload.bin <yourcard.rom> >>/dev/fd0

创建带有 ROM 映像的可启动软盘,从而启动安装。最初的一些安装是使用软盘方法进行的。后来,EPROM 写入器的可用性使我们能够采用 EPROM 技术,该技术运行良好,并且对体验和实验很有好处。

请注意,一次完成两个或三个以上的安装会使网络过载并降低效率。在两台机器同时安装的情况下,我们能够在平均 15 分钟内完成安装。我们安装过程的确切细节如下。

首先,我们在服务器上运行 shell 脚本 doitfor,以指定我们接下来要安装哪台机器。将软盘驱动器或 EPROM 插入目标系统并启动系统。启动映像被自动检索,安装过程开始。在此过程继续进行的同时,我们继续处理下一台机器,方法是运行带有与下一个目标对应的新参数的 doitfor 脚本。启动下一台机器将导致两个安装同时运行。一旦第一台机器上的安装完成,我们就可以从第三台机器开始,依此类推。唯一的麻烦是插入 ROM/软盘并启动。尽管如此,它还是比使用软盘和手动设置的标准方法快得多。

如果在启动时,检测到的网卡的 MAC 地址报告为 FF:FF:FF:FF:FF:FF,则表明网卡未正确初始化。有两种方法可以克服这个问题。一种是在初始设置期间关闭主板的即插即用操作系统功能,强制 BIOS 配置网卡。请注意,只有在安装启动期间才需要关闭此功能;如果需要,以后可以将其打开。第二种方法是在前面讨论的 etherboot 的配置文件中启用 -DCONFIG_PCI_DIRECT 选项。

时间同步

由于文件在大量工作站之间共享,因此机器的时钟同步变得至关重要,以便文件时间戳在全球范围内具有可比性。时间同步有助于维护日志、更新和分发更新等。我们只需设置所有机器在每次启动时将其时间与参考服务器的时间匹配,方法是利用 rdate 实用程序。要在客户端启用此功能,我们只需在 rc.local 文件中添加以下行

rdate -s

在服务器端,必须在 /etc/inetd.conf 中启用默认时间服务。这是通过找到并删除以下行开头的 # 符号并重新启动 inetd 来完成的

#time   stream  tcp     nowait  root    internal
也可以使用 NTPD 或 TIMED 等高级时间服务器,但 rdate 非常适用于本科实验室,而不会因神秘的配置问题而引起麻烦。
Root 密码统一

许多志愿者帮助进行了安装。安装完成后,出于安全原因,我们要求更改每台机器上的 root 密码。这意味着要么对所有机器使用 Linuxconf Web 访问,要么系统管理员必须手动更改每台工作站上的密码。我们编写了一个脚本 change_password_on_all.pl(参见资源),以从单个服务器实现此密码更改。该脚本要求将所有工作站配置为允许使用 rsh 实用程序从服务器进行远程 shell root 访问。此规定是在安装后步骤中配置的。但是,应该注意的是,尽管这不是一种非常安全的交换关键信息的方法,但它在我们的受控实验室环境中运行良好。此外,如果谨慎行事,仅在 LAN 未使用时运行脚本,则此方法可以证明非常有用。

启动/关闭自动化

现在我们继续讨论如何通过从一台机器控制局域网启动和关闭自动化。要理解这一点,我们必须仔细研究 AMD 的 Magic Packet 技术。现在许多网卡都配备了网络唤醒功能。这意味着当机器关闭时(即,ATX 机箱有电但未处于“开启”状态),它通过连接主板和网卡的三线接头为启用网络唤醒的网卡提供少量电力。因此,网卡实际上是活动的,并且能够监视局域网上是否有特殊数据包,称为 Magic Packet(参见资源)。接收到此类数据包后,网卡会生成一个脉冲,该脉冲可用于开启机器。Magic Packet 实际上是一个 0xFF 字符流,后跟 NIC 的 MAC 地址,重复特定次数。在正常操作期间偶然发生此类数据包的概率非常低。因此,可以安全地假设接收到此类数据包确实表明它是为目标机器准备的。

我们编写了一个名为 switch 的 Perl 程序(参见列表 8),该程序可以打开或关闭局域网上的一个或所有机器。它生成一个 Magic Packet 并通过网络广播。目标机器在接收到此数据包后会开启。要关闭机器,直接远程 shell 调用 haltshutdown -h 就足够了。为了使事情更易于管理,我们使脚本解析 /etc/switch.conf 以获取有关局域网上哪个主机具有哪个 MAC 地址的信息。应该很明显,MAC 地址仅在开启时才需要,而在关闭时则不需要,因为通过远程 shell 调用的关闭仅需要目标 IP 地址。

列表 8

一个小缺点是,虽然无论目标机器是否运行 Linux 都可以启动,但只有在目标机器正确启动到 Linux 后才能关闭。如果目标机器无法正确启动,则此方法不提供关闭系统的功能。但是,应该注意的是,如果机器确实无法正确启动,则无论如何都需要手动注意修复它。

在我们的实验室中,我们有带有 D-link 网卡的 Intel 440BX2 主板,这些网卡支持网络唤醒功能。主板要求从 BIOS 中开启该功能。还有各种其他品牌组件也支持此功能。如果您在去年购买了硬件,则很可能已经具备这些功能。

服务器配置

我们在设置服务器配置时使用了标准程序。我们设置了 DNS、NIS、FTP、Apache、时间和 NFS 服务。一个特殊的考虑因素是,没有两个服务由单个 IP 地址提供。虽然我们只有四台实际服务器,但我们严重依赖 IP 别名来为每项服务创建虚拟角色。这种别名方法允许在发生故障时透明地将服务从一台机器转移到另一台机器,从而提供一定程度的容错能力。这种方法是我们之前在 2000 年 6 月Linux Journal 上报道的网络容错工作的一部分。

autofs

autofs 是 Linux 的内核辅助自动挂载程序,它允许系统根据需要动态挂载文件系统。这就像使用 MS Windows 一样,当您需要访问软盘驱动器时,您不必专门将驱动器连接到挂载点。例如,如果将 autofs 配置为在挂载点 /misc/cd 自动挂载 CD-ROM,则每次将 CD-ROM 插入驱动器并将目录更改为 /misc/cd 时,CD-ROM 将自动挂载在此点。如果挂载点一段时间未使用,它将自动卸载。

autofs 被发现对我们的场景非常有用。在一周的时间里,我们有许多不同的班级来到实验室。始终将所有用户文件挂载在每台工作站上会造成大量的服务器负载和网络流量——这是一种低效且不受欢迎的情况。我们将文件系统划分为四个组,并通过 autofs 单独挂载它们,而不是在 /etc/fstab 文件中硬绑定 NFS 服务器。这使服务器负载减少到原来的四分之一。

为了保持灵活性,我们使用了 NIS 来映射 autofs 映射。map auto.master 提供有关 autofs 系统的挂载点的信息,而 auto.home 提供有关应挂载哪个文件系统以及从哪个服务器挂载的信息。我们发现,如果 /etc/auto.master 文件存在,则 autofs 不会检查 NIS 映射。因此,为了使其正常工作,我们从所有将要使用 autofs 的工作站中删除了文件 /etc/auto.home。要将这些映射包含在 NIS 数据库中,请在位于 /var/yp/ 的 NIS Makefile 中选择规则 auto.home 和 auto.master。

以下行已添加到服务器上的 /etc/auto.master

/home   auto.home       --timeout 60

这些行已添加到服务器上的 /etc/auto.home

#mount point    options         source host+path
g1      -rw,hard,intr   nfs1:/home/g1
g2      -rw,hard,intr   nfs2:/home/g2
以启用构建正确的数据库。

资源和致谢

Automated Installation of Large-Scale Linux Networks
Ali Raza Butt,左图,(ali@ieee.org) 最近毕业于巴基斯坦拉合尔工程技术大学电气工程系。他于 2000 年秋季加入了普渡大学电气与计算机工程博士课程。

Jahangir Hasan,右图,最近毕业于巴基斯坦拉合尔工程技术大学电气工程系。他于 2000 年秋季加入了普渡大学电气与计算机工程博士课程。

加载 Disqus 评论