Hacking Red Hat Kickstart

作者:Brett Schwarz

安装 Linux 是一项相对容易的任务。然而,我面临着在多台机器上重复安装它的任务,这既耗时又容易出错。这个问题影响了我们整个团队和依赖我们的其他团队。因此,我开始使用 Red Hat Kickstart 来自动化安装。这有所帮助,但仍然有改进的空间。我最终想要的是一个可以放在一张 CD 上、动态地对硬盘进行分区并包含所有更新软件包的自动化安装。我希望能够启动安装,然后离开机器,只在安装完成时才回来。为了实现这一目标,我使用自定义版本的 Red Hat 安装程序 Anaconda 补充了 Kickstart。

尽管 Red Hat 没有正式支持,但它提供了几种工具和文档来帮助自定义安装。我在这里描述几种可能的方法,这些方法应该为读者提供足够的入门信息。

本文涵盖以下主题:用更新替换软件包、减小安装尺寸以适合一张 CD、在自定义安装中利用 Kickstart 以及创建自定义消息屏幕。

读者应该对 Linux 安装有很好的了解。我还假设没有使用深奥的硬件,因为可能需要其他自定义来适应此类硬件。

设置构建机器

第一步是准备构建计算机。由于安装程序工具特定于特定版本,因此构建计算机需要具有与目标机器上使用的 Red Hat 版本相同的版本。在我们的示例中,使用 Red Hat 8.0。 Red Hat 8.0 和以前的版本之间存在一些差异,如果您使用以前的版本,则需要研究它们。

一旦构建计算机安装了正确的版本,就需要安装 Anaconda 软件包。这些通常不是默认安装的,因此需要手动安装。它们位于标准 Red Hat 发行版的第二张 CD 上,名称为 anaconda、anaconda-runtime 和 anaconda-help(可选)。

下一步是创建一个目录结构,用于存放安装文件。分区应具有足够的可用空间,大约 3GB。实际位置基于您的偏好;对于本文,基本目录位于 /RH80。在此目录下,我们为每张 CD 创建目录

mkdir -p /RH80/CD{1,2,3}

我们不关心源代码包,因此不包括 CD4 和 CD5。

我们创建一个额外的目录,我们可以在其中创建自定义安装

mkdir /RH80/ONE_CD

现在我们可以将 CD 的内容复制到各自的目录中。挂载第一张 CD,然后发出此命令

cp -a /mnt/cdrom/* /RH80/CD1/
对 CD2 和 CD3 重复此步骤。

将 CD 目录的内容复制到 ONE_CD 目录,但使用硬链接而不是实际复制文件。这节省了空间并且速度更快

cd /RH80
cp -al CD1/* ONE_CD/
cp -al CD{2,3}/RedHat/RPMS/* ONE_CD/RedHat/RPMS/

您会收到一条覆盖 TRANS.TBL 的消息;您可以回答 no。

选择软件包

接下来,我们缩减 ONE_CD 目录的内容,使其适合一张 CD。我假设 CD 大小为 700MB。我不会详细介绍如何执行此操作,因为从发行版中删除的文件列表因安装而异。但是,以下是一些缩减发行版的技巧

  • 不要包含源代码 RPM。

  • 删除 dosutils 目录,因为这些将是自动化安装。

  • 删除任何不必要的软件包。这可能很复杂,因为您需要确保依赖关系仍然完整。

您应该记录已删除的文件。如果需要回退,可以使用此列表,如果以后编辑 comps.xml 文件,您将需要它。

对于软件包选择,我将所有基本和核心组软件包及其依赖项(根据 comps.xml 文件)记录到一个文件中。为了找到此信息,我使用了脚本 getGroupPkgs.py(请参阅“资源”)

cd /RH80/ONE_CD/RedHat/base
getGroupPkgs.py comps.xml > /RH80/pkglist

任何其他软件包名称都可以附加到此文件的末尾。在我的列表完成后,我使用 syncRpms.py 脚本(请参阅“资源”)删除了列表中没有的软件包。参数是软件包目录,软件包列表是从 getGroupPkgs.py 生成的。此脚本删除软件包列表中未列出的软件包并打印出软件包名称。我们将其重定向到一个文件,以便我们有一个日志

cd /RH80
syncRpms.py ONE_CD/RedHat/RPMS/ pkglist > pkgs_rem
我们可以使用 du 命令监控安装大小。 -h 选项以人类可读的格式显示结果,-s 选项提供整个目录树的摘要
du -hs /RH80/ONE_CD
hdlist 文件在重新生成后(见下文)实际上会减小大小,因为我们删除了许多软件包。这反过来又减小了 CD 映像的大小。

删除软件包的棘手之处在于它们可能会破坏依赖关系。即使 getGroupPkgs.py 基于 comps.xml 文件解析了依赖关系,也不能保证它们是准确的。添加其他软件包也可能会破坏依赖关系。验证其准确性的一种方法是创建一个临时 RPM 数据库,然后使用您选择的软件包在该数据库上进行测试安装

cd /RH80/ONE_CD/RedHat/RPMS
mkdir /tmp/testdb
rpm --initdb --dbpath /tmp/testdb
rpm --test --dbpath /tmp/testdb -Uvh *.rpm

查找有关依赖关系失败的任何错误消息。如果出现任何错误消息,请通过添加或删除导致差异的文件来解决依赖关系,然后重复上述测试。

一旦软件包依赖关系得到解决,您就可以下载与您的安装相关的软件包更新。将这些文件放在单独的目录下

mkdir -p /RH80/updates/RPMS/

从构建目录中删除旧文件,然后将更新后的文件链接到构建目录。对每个更新的软件包执行此操作(其中 old_rpmfile 是软件包的先前版本)

cd /RH80/ONE_CD/RedHat/RPMS/
rm
# ... remove each old rpm
cd /RH80/updates/RPMS/
cp -l
# ... do this for each rpm
您应该记录更新的软件包,以防需要回退它们。最好再次检查依赖关系和大小,以防它们在软件包更新后发生更改。

接下来,我们使用 rpm 的 -K 选项检查每个软件包的内部校验和。首先我们需要导入密钥

cd /RH80/ONE_CD/RedHat/RPMS
rpm --import /usr/share/rhn/RPM-GPG-KEY
rpm -K *.rpm | grep "NOT *OK"

这不是绝对必要的,但由于我们下载了软件包更新,因此这验证了它们的有效性。

准备安装文件

更新所有软件包后,我们需要重新生成 hdlist 文件。它们仅包含软件包的标头,这使 Anaconda 可以更快地检索标头信息。由于我们更新了软件包,因此我们需要使用 genhdlist 工具重新生成这些文件,该工具是 anaconda-runtime 软件包的一部分

/usr/lib/anaconda-runtime/genhdlist /RH80/ONE_CD/

接下来,我们需要处理 comps.xml 文件。此文件定义软件包组和软件包依赖关系(尽管它们不能保证)。文件结构在 Red Hat 8.0 中更改为基于 XML;在以前的版本中,它只是一个带有某些晦涩标记的简单文本文件。我们需要确保组内定义的软件包包含在我们的安装中。我们只需要关注我们正在安装的组。如果软件包丢失(或者如果添加了软件包),我们需要编辑 comps.xml 文件(请参阅“资源”)。但是,由于我们选择了 Core 和 Base 组中的所有软件包,因此我们无需编辑此文件。我们只需要在 Kickstart 文件中的 %packages 指令下指定这些组即可。有关 Kickstart 文件摘录,请参见清单 1。

清单 1. Kickstart 文件摘录

从技术上讲,我们可以省略 @Core 和 @Base 组,因为它们是默认安装的。此处包含它们仅用于说明目的。

创建自定义消息屏幕

我们还想创建一个自定义消息屏幕,以向用户提供特殊说明。消息屏幕保存在 boot.img 文件中(对于 CD-ROM 安装),位于 images 目录下。这是一个 DOS 文件系统,因此我们可以挂载它以访问内容

cd /RH80/ONE_CD/images
mount -o loop -t msdos boot.img /mnt/boot

在 /mnt/boot 中查看,您会看到六个消息文件:boot.msg、options.msg、general.msg、param.msg、rescue.msg 和 snake.msg。我们创建自己的消息文件并将其命名为 custom.msg,这是一个任意名称。由于 snake.msg 实际上未使用,因此我们用 custom.msg 替换 syslinux.cfg 中的该条目。在 /mnt/boot 中编辑 syslinux.cfg,并将 F7 snake.msg 替换为 F7 custom.msg。

对 syslinux.cfg 文件进行了一些其他修改;请参阅清单 2。默认条目从 linux 更改为 ks。如果发生超时或者用户在启动提示符下按 Enter 键,则使用 ks 标签。此外,超时值从 600 减少到 60,因此如果用户没有输入,安装可以更快地开始。显示条目也已更改。我们希望显示我们的自定义消息,而不是 boot.msg 作为初始消息屏幕。对于 ks 标签下的 append 行,我们添加了两件事。第一个是关键字 text,用于启用基于文本的安装。然后我们将关键字 ks 更改为 ks=cdrom:/ks.cfg。这硬编码了 Kickstart 位置,因此用户不必在启动提示符下指定它。

清单 2. 修改后的 syslinux.cfd 文件

接下来,我们创建 custom.msg 文件。清单 3 显示了我们的 custom.msg。文件的内容可以标记,例如在单词周围添加颜色。例如,^O09Custom^O02 将 Custom 的颜色更改为蓝色,^O02 将其改回。有关更多信息,请参阅“资源”部分中的 syslinux 参考。

清单 3. 自定义消息

组成自定义消息后,我们需要卸载引导映像

umount /mnt/boot
构建 CD

在实际创建 CD 之前,您可能希望通过执行网络安装对其进行测试。有关如何执行此操作,请参阅 Red Hat Kickstart 文档。

我们希望此自定义安装是自动化的,因此我们将 Kickstart 文件放在 CD 本身中。您可以使用任何文本编辑器创建 Kickstart 文件,也可以使用名为 Kickstart Configurator 的 GUI 工具。

在 %pre 部分中,添加一个 shell 脚本来探测硬盘驱动器并根据驱动器数量动态创建分区信息。我们利用了 Kickstart 执行 %pre 部分然后重新读取 Kickstart 文件的事实。当它第二次读取它时,它会包含 /tmp/partinfo 文件,其中 %include 指令位于该文件(请参阅清单 1)。 /tmp/partinfo 文件是脚本的输出。我们使用 list-harddrives 命令,该命令列出可用的硬盘驱动器及其大小。动态创建分区使我们无需创建多个硬编码分区信息的 Kickstart 文件。

创建 Kickstart 文件后,将其命名为 ks.cfg 并将其放在安装树的根目录 (/RH80/ONE_CD/) 中。可以创建多个 Kickstart 文件并将它们全部放在 CD 上。不同的 Kickstart 文件可能针对不同的硬件配置。

我们现在可以创建 ISO 映像。从我们之前的步骤来看,发行版应该足够小,可以放在一张 CD 上,并且包含所有更新的软件包。 mkisofs 程序创建映像,然后我们可以将映像复制到 CD。创建 ISO 映像的命令是

cd /RH80/ONE_CD
mkisofs -r -T -J \
-V "My Custom Installation CD" \
-b images/boot.img \
-c images/boot.cat \
-o /RH80/mydist.iso \
/RH80/ONE_CD

有关选项的描述,请参阅表 1。

表 1. mkisofs 使用的选项

mkisofs 的最后一个参数是需要包含在映像文件中的内容的源目录(例如,我们的自定义安装目录)。您可能想要使用其他几个参数。例如,-A、-P 和 -p 选项向映像添加额外的标签信息。 -m 和 -x 选项还允许您从映像中排除某些目录和文件模式。有关更多信息,请参阅 mkisofs 手册页。

接下来,向 ISO 映像添加校验和。这不是绝对必要的,但它为最终用户提供了一种检查 CD 完整性的方法。用于向 ISO 映像添加校验和的工具称为 implantisomd5。要向 ISO 映像添加校验和,请使用以下命令

implantisomd5 /RH80/mydist.iso

配套工具 checkisomd5 可用于验证您的校验和

checkisomd5 /RH80/mydist.iso
CD 也可以在安装期间进行验证。从 CD 启动后,用户可以发出此命令
linux mediacheck
现在我们可以将映像刻录到 CD。我假设 CD 刻录机已在您的系统上设置好。我们在下面使用 cdrecord,但您也可以使用其他程序。命令调用如下
cdrecord -v speed=4 dev=0,0,0 /RH80/mydist.iso
speed 和 dev 选项取决于您的系统。可以使用 cdrecord 的 -scanbus 选项确定 dev 参数的设备
cdrecord -scanbus
使用 CD

将映像刻录到 CD 后,将 CD 插入目标机器并启动机器。您应该会看到您之前创建的自定义消息。此时,您可以按启动提示符下的 Enter 键或让它超时。超时后,它会使用默认标签,我们将其指定为 ks (Kickstart)。

如果我们做的一切都正确,安装应该在没有用户交互的情况下进行。根据我的经验,安装大约需要十分钟。这可能会因您的确切配置而异。

结论

通过 Kickstart 和自定义的 Anaconda 相结合,可以创建强大而灵活的安装。此安装大大缩短了周期时间,并减少了我的项目的错误。我几乎毫不费力地多次安装了多台机器。在本文中,我仅触及了利用 Kickstart 和 Anaconda 的几种方法,但还有许多其他可能性。我鼓励有兴趣的人阅读“资源”部分中的文档,并加入 Kickstart 和 Anaconda 邮件列表以获取更多信息。

资源

Hacking Red Hat Kickstart
电子邮件:bschwarz@pamd.cig.mot.com

Brett Schwarz 与他的妻子、儿子和狗住在华盛顿州西雅图附近。尽管他熟悉多个平台,但他选择的平台是 Linux。他是一名计算机和无线系统顾问。可以通过他的主页 www.bschwarz.com 与他联系。

加载 Disqus 评论