刻录 RedHat CD HOWTO

Luigi Bitonti

          
        

Morten Kjeldgaard

          
        

Peter von der Ah

          
        

Guillaume Lelarge - 审阅和法语翻译。

修订历史
修订版 v2.12003-10-17修订者:lb
添加了 RedHat 9。修复了一些小错误。感谢所有发送评论和补丁的人。
修订版 v2.032003-03-10修订者:lb
向 HOWTO 添加了一些评论和修复。现在即使对于版本 >= 7.x,也正确包含了 anaconda 更新。
修订版 v2.022003-03-06修订者:lb
签名检查现在适用于针对与运行脚本的 RedHat 版本不同的软件包。更正了脚本的版本比较部分中的一个错误。
修订版 v2.012002-12-04修订者:lb
新版本 HOWTO 的第二个版本。所有脚本都经过审查和清理。updateDist.sh 脚本现在在检查签名之前检查是否已下载所有更新。
修订版 v2.002002-10-28修订者:lb
HOWTO 的新版本(2.00)的第一个版本

本文档描述了如何从不同版本的 Red Hat Linux 发行版(最高至包括第 9 版)制作自己的 CD,这些 CD 等同于 Red Hat 商业提供的 CD。描述了发行版的结构,以及将更新的 RPMS 包含到发行版中所需的过程。还提供了一些关于如何自定义默认安装的提示和示例。包含了一些脚本,可以尽可能多地自动执行 CD 镜像的(重新)生成。先决条件是良好的网络连接和 CD 刻录机(尽管,对 shell 脚本的工作知识可能会非常有用)。


目录
1. 简介
1.1. 免责声明和许可
2. Red Hat FTP 站点的剖析
2.1. Redhat 9 目录组织
2.2. “RedHat”目录 -- 发行版的核心
2.3. “updates”目录
2.4. 8.0 树的差异
2.5. 7.x 树的差异
2.6. 6.x 树的差异
3. RPM 软件包
3.1. 比较 RPM 软件包的两个版本
4. 获取发行版的本地副本
4.1. 使用 wget 和 bash
4.2. 使用 mirror
5. 包含更新
5.1. 更正文件保护模式
5.2. 替换更新的 RPMS
5.3. 重建安装程序
6. 刻录 CD
6.1. 测试镜像
6.2. 刻录光盘
7. comps 文件
7.1. RedHat 版本 < 6.1 中 comps 文件的格式
7.2. RedHat 版本 6.1 中 comps 文件的格式
7.3. RedHat 版本 6.2 中 comps 文件的格式
7.4. RedHat 版本 7.3 中 comps 文件的格式
7.5. RedHat 版本 8.0 和 9 中 comps 文件的格式
8. 从 CD 安装
8.1. 从可引导 CD 启动
9. 其他 Linux 发行版
10. 本文档...
10.1. 相关文档
10.2. 致谢

1. 简介

制作自己的 CD 可能有几个原因。也许你是个吝啬鬼,想省下 Red Hat 发行版的费用。或者,也许你希望在你的 CD 中包含具有所有当前更新的最新发行版。这一点非常重要,因为在 Red Hat 发行版的每个主要版本发布之后,都会有很多更新,其中一些与安全相关。只需查看 勘误表页面。或者,你可能希望自定义默认安装,添加默认树中不存在的一些软件包,并取消选择某些软件包的安装,否则这些软件包将包含在默认设置中。

这就是你将在接下来的章节中学到的内容(希望如此)。我将在示例中使用 i386 架构和发行版的 7.3、8.0 和 9 版本。与先前版本(<=6.1)相关的注释包含在本文档的先前版本中,并由原始作者编译。与 6.2 版本相关的注释基于我未完成的测试(并且我不知道我是否会完成)以及你可以在相关文档部分中找到的一些文档。以下各节中给出的 RedHat 7.3 和 8.0 的过程很可能适用于 Red Hat 支持的所有平台(Alpha、ppc 等),适用于所有 7.x(并且可能在不久的将来适用于 8.x/9)版本,但我仅在具有 Redhat Linux 7.3、8.0 和 9 的 i386 平台上对其进行了测试(我对更多信息感兴趣)。

Note

所描述的操作具有法律含义,这意味着如果你以不符合 Redhat 商标政策的方式修改 CD,则不能将 CD 作为 RedHat Linux 重新分发。为了使它们可以合法重新分发,你应始终遵守 RedHat 网站上声明的指南。

Note

始终记得设置rhcd.conf文件中的变量,并在运行本文档其余部分中找到的且与 RedHat Linux 版本 >=6.2 相关的脚本之前导出 RHCDPATH 环境变量。脚本提供了一个示例 rhcd.conf 文件,该文件应该有很好的注释。


1.1. 免责声明和许可

本文档的发布是为了希望能对您有所帮助,但不提供任何担保,亦不暗示适销性或符合特定用途。

对于因遵循本文档中的建议而造成的任何类型的身体、经济、道德或其他类型的损害,作者、分发者或本文档的任何其他贡献者均不承担任何责任。


2. Red Hat FTP 站点的剖析

秉承 Linux 社区的精神,Red Hat Software 已经在其 FTP 站点上提供了其 Linux 发行版,适用于多个平台。这些都可以从顶级发行目录 (pub/redhat/linux/) 中获得。让我们看一下发行树。


2.1. Redhat 9 目录组织

截至撰写本文时,最新的发行版仅适用于 i386 平台。鉴于单个架构的存在,顶层目录显得有些浅显。(pub/redhat/linux/9/en/os/ )。
 
        i386/
      

否则,对于比 9 稍旧的版本,顶层目录包含不同平台的发行版。例如,Redhat Linux 7.1 版本的相应目录的结构是这样的
 
        alpha/   i386/   ia64/   ppc/   s390x/
      

Redhat 9 发行版中 i386 目录的根目录如下所示
 
	-rwxr-xr-x    2 root     root          248 Mar 14  2003 autorun
	drwxr-xr-x    7 root     root         4096 Mar 14  2003 dosutils
	-rw-r--r--    3 root     root         6192 Mar 14  2003 EULA
	-rw-r--r--    3 root     root        18385 Mar 14  2003 GPL
	drwxr-xr-x    3 root     root         2048 Mar 14  2003 images
	drwxr-xr-x    2 root     root         2048 Mar 14  2003 isolinux
	-rw-r--r--    3 root     root         6127 Mar 14  2003 README
	-rw-r--r--    2 root     root        13052 Mar 14  2003 README-Accessibility
	-rw-r--r--    2 root     root         6686 Mar 14  2003 README.de
	-rw-r--r--    2 root     root         6990 Mar 14  2003 README.es
	-rw-r--r--    2 root     root         6492 Mar 14  2003 README.fr
	-rw-r--r--    2 root     root         6805 Mar 14  2003 README.it
	-rw-r--r--    2 root     root         7995 Mar 14  2003 README.ja
	-rw-r--r--    2 root     root         7312 Mar 14  2003 README.ko
	-rw-r--r--    2 root     root         5070 Mar 14  2003 README.pt
	-rw-r--r--    2 root     root         6613 Mar 14  2003 README.pt_BR
	-rw-r--r--    2 root     root         5879 Mar 14  2003 README.zh_CN
	-rw-r--r--    2 root     root         5892 Mar 14  2003 README.zh_TW
	drwxr-xr-x    4 root     root         2048 Mar 14  2003 RedHat
	-rw-r--r--    2 root     root        25824 Mar 14  2003 RELEASE-NOTES
	-rw-r--r--    2 root     root        29902 Mar 14  2003 RELEASE-NOTES-de.html
	-rw-r--r--    2 root     root        30409 Mar 14  2003 RELEASE-NOTES-es.html
	-rw-r--r--    2 root     root        32354 Mar 14  2003 RELEASE-NOTES-fr.html
	-rw-r--r--    2 root     root        30064 Mar 14  2003 RELEASE-NOTES.html
	-rw-r--r--    2 root     root        29925 Mar 14  2003 RELEASE-NOTES-it.html
	-rw-r--r--    2 root     root        34666 Mar 14  2003 RELEASE-NOTES-ja.html
	-rw-r--r--    2 root     root        33520 Mar 14  2003 RELEASE-NOTES-ko.html
	-rw-r--r--    2 root     root        29496 Mar 14  2003 RELEASE-NOTES-pt_BR.html
	-rw-r--r--    2 root     root        22747 Mar 14  2003 RELEASE-NOTES-pt.html
	-rw-r--r--    2 root     root        25217 Mar 14  2003 RELEASE-NOTES-zh_CN.html
	-rw-r--r--    2 root     root        26645 Mar 14  2003 RELEASE-NOTES-zh_TW.html
	-rw-r--r--    3 root     root         1910 Mar 14  2003 RPM-GPG-KEY
	-r--r--r--    1 root     root         1823 Mar 14  2003 TRANS.TBL
      

SRPMS目录包含源代码形式的 RPMS 软件包。

images目录包含启动和驱动程序软盘镜像,如果需要,可以将其复制到软盘。在 9 版本中,只有一个启动盘镜像可用。此启动镜像名为bootdisk.img。如果不是直接从 CD-ROM 或 HD 执行安装,则除了这个启动盘之外,还需要一个辅助驱动盘。一个boot.iso文件现在已添加到从 cdrom 驱动器启动计算机并更轻松地启动(网络)安装(即,无需摆弄太多的软盘)。有关详细信息,请参见 安装 部分以及其中的参考资料,并查阅目录中的 README 文件以获得对各种文件的更详细的说明。

isolinux目录包含从 CD 启动所需的文件(以及重建以相同方式工作的可启动 CD)。此过程已从软盘仿真转移到无仿真。这有助于避免空间限制和兼容性问题。

dosutils目录包含一些其他操作系统的各种程序,这些程序有时对支持安装过程很有用。在这种情况下,还包含一个说明性的 README 文件。

该列表由许多文件和RedHat目录完成。后者是下一节的主题,而前者的内容只需读取它们的名称即可直接显现(可能除了 EULA 或最终用户许可协议)。


2.2. “RedHat”目录 -- 发行版的核心

目录树中最重要的部分位于RedHat目录

 
        drwxr-xr-x    2 root     root        53248 Jun 14 03:15 RPMS
        drwxr-xr-x    2 root     root          4096 Jun 14 04:15 base
      

RPMS目录中,该目录包含 Red Hat 发行版的主要部分,由一组 RPM(Redhat Package Manager)文件组成。RPM 软件包通常包含二进制可执行文件以及相关的配置文件和文档。有关更多信息,请参见 RPM 软件包部分。

base目录包含安装过程中需要的不同文件,例如comps.xml文件,该文件定义了在“选择要安装的软件包”阶段使用的组件(软件包组)。有关此文件以及如何使用它的更多信息,请参见 comps 文件部分。

中的另外两个重要文件base目录是hdlisthdlist2包含来自所有 RPM 的大部分标头字段RPMS目录。这意味着只需读取这些文件即可确定 RPM 软件包之间的所有相互依赖关系,而无需读取所有 RPM 软件包,这在 FTP 安装期间非常方便。这些文件的另一个用途是将软件包名称映射到文件名(例如,perlperl-5.004-6.i386.rpm)。这意味着如果你想从 RedHat 合并更新(参见 包含更新部分)或将你自己的软件包添加到RPMS目录,你需要更新hdlisthdlist2。这将在后面的 重建安装程序中进行描述。除了这些文件之外,还可以找到从中加载安装环境(即内核、python 解释器、anaconda 等)的镜像。


2.3. “updates”目录

/pub/redhat/linux/updates目录包含了自3.0.3版本以来所有RedHat发行版的更新。你可以在这里找到因为各种原因而更新的软件包。你应该特别留意安全更新。每当有修复可用时,RedHat都会在勘误页面上公布这些更新。最重要的是,在updates目录是

 
        drwxrwsr-x    3 root      root          4096 Jul 13 10:13 5.2
        drwxrwsr-x    3 root      root          4096 Jul 13 10:13 6.0
        drwxrwsr-x    3 root      root          4096 Jul 13 10:13 6.1
        drwxrwsr-x    4 root      root          4096 Jul 13 10:14 6.2
        drwxrwsr-x    4 root      root          4096 Jul 13 10:14 7.0
        drwxrwsr-x    4 root      root          4096 Jul 13 10:14 7.1
        drwxrwsr-x    4 root      root          4096 Jul 13 10:13 7.2
        drwxrwsr-x    3 root      root          4096 Jul 13 10:14 7.3
        drwxrwsr-x    3 root      root          4096 Jul 13 10:14 8.0
        drwxrwsr-x    3 root      root          4096 Jul 13 10:14 9
      

目录下的每个子目录结构都类似于Redhat 9 目录树部分描述的那样。因此,对于每个版本,你会在en/os/子目录中找到一系列代表各种架构的子目录和一个noarchSRPMS子目录,分别用于存放适用于所有架构或源代码形式的软件包。

 
        drwxrwsr-x    2 root      root          4096 Sep 23 05:28 SRPMS
        drwxrwsr-x    2 root      root          4096 Aug 28 18:25 athlon
        drwxrwsr-x    2 root      root          8192 Sep 23 05:28 i386
        drwxrwsr-x    2 root      root          4096 Jul 13 10:14 i486
        drwxrwsr-x    2 root      root          4096 Aug 28 18:26 i586
        drwxrwsr-x    2 root      root          4096 Aug 28 18:26 i686
        drwxrwsr-x    2 root      root          4096 Jul 13 10:14 noarch
      


2.4. 8.0目录树的差异

8.0发行版的布局与前面描述的几乎相同。在这方面,唯一的主要差异可以在images目录中找到。

images目录包含引导和驱动程序软盘镜像,可以根据需要复制到软盘上。在8.0版本中,有三个引导盘镜像可用。第一个引导镜像称为boot.img,当直接从CD-ROM执行安装时,这是必需的。如果需要从NFS挂载的磁盘或FTP安装,则需要bootnet.img磁盘镜像。通过PCMCIA适配器安装需要pcmcia.img软盘。有关详细信息,请参阅安装章节以及其中的参考资料,并查阅目录中的README文件,以获得对各种文件的更详细解释。


2.5. 7.x目录树的差异

这两个发行版在这方面非常相似。对我们来说唯一值得关注的变化(通过简单检查主目录树很容易注意到)是一个缺失的isolinux目录和RedHat/base目录中的一些变化。第一个是由于8.0之前的版本中,安装CD的启动方式不同(在8.0版本中,"软盘仿真"已被"无仿真"取代),而第二个是由于comps文件格式在Redhat 8.0之后的版本中迁移到XML(这就是为什么它被重命名为comps.xml的原因)。Redhat/base/comps文件实际上是一个简单的文本文件,在Redhat 7.3及之前的版本中,语法非常不灵活。


2.6. 6.x目录树的差异

对于6.2版本( pub/redhat/linux/6.2/en/os/),6系列的最后一个版本,组织结构如下(之前的版本在这方面非常相似,如果不是完全相同)

        alpha/   i386/   sparc/
      

i386目录的根目录看起来像这样
        -rw-r--r--    1 root     root        18385 Sep  7  1999 COPYING
        -rw-r--r--    1 root     root         3400 Mar  8  2000 README
        -rw-r--r--    1 root     root        16300 Mar  8  2000 RELEASE-NOTES
        -rw-r--r--    1 root     root         1908 Sep 25  1999 RPM-GPG-KEY
        drwxr-xr-x    1 root     root          512 Sep 27 15:22 RedHat
        drwxr-xr-x    1 root     root        17408 Sep 27 15:22 SRPMS
        -rwxr-xr-x    1 root     root          538 Sep 26  1999 autorun
        -rwxr--r--    1 root     root         2048 Mar  9  2000 boot.cat
        drwxr-xr-x    1 root     root          512 Sep 27 15:22 doc
        drwxr-xr-x    1 root     root          512 Sep 27 15:22 dosutils
        drwxr-xr-x    1 root     root          512 Sep 27 15:22 images
        drwxr-xr-x    1 root     root          512 Sep 27 15:22 misc
      

在下面的段落中,我将只列出与最新版本的差异,未明确提及的内容是(或被认为是)不变的。

doc目录包含大量信息。最重要的是,RedHat安装手册可以在目录中的HTML格式中找到,或者在Redhat网站上( Redhat 6.2 安装指南)。接下来是参考指南和入门指南。7.x/8.0/9版本的文档位于单独的CD上(在ftp站点上的不同目录树中)。

images目录包含可以根据需要复制到软盘的引导盘镜像,就像8.0、7.3和9一样。有关详细信息,请参阅安装章节以及其中的参考资料。misc目录包含安装所需的一些程序的源代码和可执行文件。

目录树中最重要的部分(再次)位于RedHat目录

        drwxr-xr-x   2 root     root    28672   Oct 26 09:01   RPMS
        drwxr-xr-x   2 root     root     4096   Oct 26 09:01   base
        -rw-r--r--   1 root     root        0   Jan 19  1999   i386
        drwxr-xr-x   6 root     root     4096   Oct 26 09:01   instimage
      

RPMS目录,您应该已经知道了。有关更多信息,请参阅RPM软件包部分。base目录保存安装过程中需要的不同记账文件,就像7.3、8.0和9版本一样。唯一的明显区别是一个单独的hdlist文件和一个缺失的stage2.img文件,其功能应该由instimage目录中的文件提供。实际上,它包含一个精简的实时文件系统,其中包含安装过程所需的许多程序和共享库。

updates目录与为版本9描述的目录非常相似,唯一的区别是具有更多与架构相关的目录。


3. RPM 软件包

Red Hat 发行版的主要部分由一组 RPM (Redhat Package Manager) 文件组成。 RPM 包通常包含二进制可执行文件,以及相关的配置文件和文档。 rpm 程序是一个功能强大的软件包管理器,可用于安装、查询、验证、更新、删除和构建 RPM 格式的软件包。Rpm方便地维护已安装的所有软件包的数据库,因此可以随时获得有关已安装软件的信息。

发行版中的二进制 RPM 文件是在运行该发行版的系统上构建的。这很重要,因为软件包中的大多数程序都依赖于共享库。 从 RedHat 5.0 版开始,使用了 GNU 标准 C 库的新版本 2(它是 64 位干净的)。 该库的这个版本通常被称为glibc或在 Linux 中:libc 6。 发行版中的所有可执行文件都已链接到该库。 如果您尝试安装来自不同发行版的二进制文件,则它们很可能无法工作,除非您安装 libc5 软件包以实现向后兼容。 Redhat Package Manager 本身的各个版本之间也存在不兼容性,这会导致某些软件包即使在应该(并且可能)运行的机器上也会安装失败。

RPM 包的名称包含后缀.arch.rpm,其中arch是架构,通常对于 Intel 平台二进制文件具有值i386。 您安装的软件包必须与机器上可用的共享库版本相匹配。 rpm 程序通常非常擅长确保确实如此,但是,有一些方法可以绕过此检查,如果您强制以这种方式安装软件包,您应该确保您知道自己在做什么。 但是,使用 RedHat 安装启动盘,可以确保在机器上安装正确的 RPM 软件包集。

如果您发现安装过程中未在您的系统上安装 RPM 软件包,请不要绝望。 您可以随时(以 root 身份)安装 RPM 软件包,例如
      # rpm --install  WindowMaker-0.18-1b.i386.rpm
    

如果您知道 RPM 软件包的 URL,您甚至可以直接从 Internet 安装
      # rpm --install ftp://rufus.w3.org/redhat-contrib/noarch/mirror-2.9-2.noarch.rpm
    

如果要更新(或安装,如果机器上不存在)RPM 软件包,请使用命令
      # rpm --update  WindowMaker-0.18-1b.i386.rpm
    

如果您只想在机器上已安装先前版本的情况下更新 RPM 软件包,请使用命令
      # rpm --freshen  WindowMaker-0.18-1b.i386.rpm
    

RPM 软件包的另一个版本包含用于构建二进制文件的原始源代码。 这些软件包的后缀为.src.rpm,位于SRPMS目录中。 这些软件包组成了 8.0(或 7.3)发行版的五个 CD 中的最后两个 CD 和第三个 CD 的一部分。 对于版本 9,它们位于三个单独的 CD 上。 对于 6.2(以及之前的,不太旧的版本),情况略有变化,因为只有一个安装 CD 不包括 SRPMS 软件包,您可以根据需要将其刻录到不同的光盘上。

要获得有关 Redhat 软件包管理器的更多信息,我建议您阅读手册页和相当详细的书籍maximum rpm

在下一节中,我将介绍一个 C 程序,它将在本指南其余部分的各种脚本中使用。 给定同一 RPM 软件包的两个版本,它只返回哪个版本较新。 该程序基于 Redhat Package Manager(版本 4.1)中使用的代码,并在给出--freshen选项时使用。


3.1. 比较 RPM 软件包的两个版本

包含在三个文件 Makefile rvc.h rvc.c中的 C 代码是从 Redhat Package Manager 中提取的,并(略微)修改以适应我们的需求。 它们形成一个简单的 C 程序,给定一个软件包的两个版本 A 和 B,如果 A 分别比 B 更新、相等或更旧,则返回 1、0 或 -1,如果发生错误则返回其他值(您可以阅读代码注释以获得更详细的信息)。 要编译程序(您需要make程序和gccC 编译器),将文件放在同一目录中并发出命令
        $ make
      

以下各节中使用的几乎每个脚本都需要此程序,并且在文件rhcd.conf中设置RVC变量即可找到。

您可以在存档rhcd-sripts.tar.gzrpmvc目录中找到源代码的副本和预编译版本。

Note

updateDist.sh (ver. < 1.17)updateCD.sh (ver. < 1.12) 脚本使用此程序的方式存在错误。 我强烈建议避免使用版本号低于报告的版本号的脚本,即使问题没有真正频繁地出现(至少表面上如此)。


4. 获取发行版的本地副本

您需要在可写磁盘上拥有发行版的副本,该磁盘可以从具有 CD 刻录机的计算机访问(duh!)。 如果要合并最新的更新,则此目录也应可从 Linux 机器访问,无论是从本地磁盘、不同计算机上的 NFS 挂载磁盘还是 JAZ 磁盘。 您可以从 RedHat CD 复制发行版(推荐),也可以通过 FTP 获取。 如果您选择使用 FTP,则有两种方法可以执行此操作。 您可以使用以下部分中介绍的基于wget的 shell 脚本,或者使用最多包括 1.34 版本的指南中建议的mirror软件包(在使用镜像部分中报告)。


4.1. 使用 wget 和 bash

这可能不是最简单的方法,即使它可能是最准确的。我喜欢它,因为它通过比较文件的 RPM 版本而不是日期/时间和名称(像标准的镜像包那样)来工作,并且如果配置了通过 rhcd.conf 文件中的 CHECKSIG 变量这样做,它会在每次下载更新时检查更新的签名。

创建一个目录来存放安装文件,并 cd 进入该目录,然后执行以下命令(这会将大约 3GB 的数据下载到您的硬盘上)

 
        $ wget -r -c -t0 -l0 --retr-symlinks -nH --cut-dirs=9 \
            ftp://ftp.mirror.ac.uk/sites/ftp.redhat.com/pub/redhat/linux/updates/7.3/en/os/i386
      

您可能需要更改 ftp 下载镜像,以及因此传递给 --cut-dirs 选项的参数。实际上,它与 -nH 一起使用,以避免重新创建 ftp 站点目录层次结构。有关如何正确使用该选项的更多信息,您可以查看 wget 文档和 man 手册。

如果您想从下载中排除一个或多个目录,您可以使用 -X list 选项,其中 list 表示以逗号分隔的目录列表。例如,要排除SRPMS目录,您可以使用
 
        $ wget -r -c -t0 -l0 --retr-symlinks -nH --cut-dirs=9 \
            -X /sites/ftp.redhat.com/pub/redhat/linux/updates/7.3/en/os/i386/SRPMS \
            ftp://ftp.mirror.ac.uk/sites/ftp.redhat.com/pub/redhat/linux/updates/7.3/en/os/i386
      

如果您考虑到SRPMS目录的大小(约 1.2GB),这可能会很有用,或者至少,我发现它很有用。

如果您想检查 GPG 签名以确保软件包的真实性(我建议这样做),您应该安装 gnupg 软件包(仅在 Redhat 7.3 上需要),并导入您可以从 CD 的根目录找到的 security@redhat.com 公钥 (RPM-GPG-KEY) 或从 RedHat 网站导入。对于 7.3 及更早的版本,通过运行命令:gpg --import <filename> 导入密钥;对于 8.0 和 9 版本,应该改为 rpm --import <filename> (有关此方面的更多信息,请查看 GNU Privacy GuardRPM - Redhat Package Manager 网站)。

如果您想检查 rpm 软件包,您可以使用以下命令(我假设您正在从完成下载的目录中发出该命令)

对于 7.3 及更早版本
 
        $ find . -name "*.rpm" -exec rpm -K --nopgp {} \; |grep "NOT *OK"
      

对于 8.0 和 9 版本(以及我猜想的未来版本)
 
        $ find . -name "*.rpm" -exec rpm -K {} \; |grep "NOT *OK"
      

如果您不想为所有这些步骤 "烦恼",我希望您至少检查下载文件的完整性(这并不意味着没有人篡改过它们),验证 md5 签名。这可以通过以下方式完成:

对于 7.3 及更早版本
 
        $ find . -name "*.rpm" -exec rpm -K --nopgp --nogpg {} \; |grep "NOT *OK"
      

对于 8.0 和 9 版本(以及我猜想的未来版本)
 
        $ find . -name "*.rpm" -exec rpm -K --nosignature {} \; |grep "NOT *OK"
      

Red Hat 发行版的内容在发行版之间不会更改,因此您只需一次下载这些软件包。对发行版的所有更改都在updates目录中。因此,如果您想保持 Red Hat 发行版的最新镜像,您只需保持updates目录的当前状态。这可以使用脚本 updateDist.sh 完成。在使用此脚本之前,您必须配置 rhcd.conf 配置文件,并导出一个指向此文件所在目录的 RHCDPATH 变量。

        $ export RHCDPATH=/home/luigi/tmp/rhcd-scripts
        $ sh updateDist.sh
      

该脚本将下载新的更新,排除 EXCLUDELIST 变量中包含的子目录,并将旧的更新(即,刚被新版本取代的)在完成两个测试后移动到由 OLDDIR 变量表示的目录。第一个测试比较.listing文件(由wget生成)与本地目录的内容,以确保所有文件都已下载。第二个测试根据两个变量 CHECKSIGUSEGPG 的值验证软件包签名(如果您希望完成该操作,请将它们都设置为 "yes")。如果在签名检查过程中出现故障,该脚本会将有问题的软件包移动到 OLDDIR,为其分配 ".UPDcheckfail" 扩展名,并在不将旧更新移动到 OLDDIR 的情况下退出。


4.2. 使用镜像

Mirror 是一个复杂的 perl 脚本,用于比较远程站点上目录的内容与本地目录的内容。它将使用 FTP 获取远程站点上但本地站点上没有的文件,并删除本地站点上但远程站点上没有的文件。mirror 程序通过配置文件进行配置。mirror 软件包可以从 rufus.w3.org 获得 RPM。制作本地副本mirror.redhat镜像配置文件,并编辑文件顶部的相关字段。在默认部分之后,定义这些软件包

 
        package=updates
          site=ftp.mirror.ac.uk
          exclude_patt=(SRPMS/)
          remote_dir=/sites/ftp.redhat.com/pub/redhat/linux/updates/7.3/en/os/i386
          local_dir=/home/luigi/tmp/redhat-cd/redhat-7.3-updates

        package=dist
          site=ftp.mirror.ac.uk
          exclude_patt=(SRPMS/)
          remote_dir=/sites/ftp.redhat.com/pub/redhat/linux/7.3/en/os/i386
          local_dir=/home/luigi/tmp/redhat-cd/redhat-7.3
      

以下命令将在您的本地磁盘上下载整个 RedHat 树的副本。在执行此操作之前**三思**,您将要传输大约 1.5Gb 的数据(如果您已排除SRPMS目录)!

 
        $ mirror -pdist mirror.redhat 
      

这会将 Red Hat FTP 站点镜像到您的本地磁盘上。Red Hat 发行版的内容在发行版之间不会更改,因此您只需一次下载此软件包。对发行版的所有更改都在updates目录中。因此,如果您想保持 Red Hat 发行版的最新镜像,您只需保持updates目录中。这可以使用以下命令完成:

 
        $ mirror -pupdates mirror.redhat 
      

您可以定期(例如,每周一次)通过 cron 脚本运行此命令。RedHat 发行版在全球范围内的大量 FTP 服务器上可用,这些服务器每天从 ftp.redhat.com 的主站点更新。您应该选择一个靠近您的 FTP 站点,请参阅 RedHat 镜像站点列表

Note

我个人还没有测试过这个程序。这是针对较旧版本的 howto(版本 1.34 及更早版本,关于 RedHat <=6.1)提出的唯一方法。


5. 包括更新

涉及三个步骤,前两个步骤在所有发行版中(几乎)相同,而最后一个步骤由于 anaconda 安装程序的更改而发生很大变化

  1. 更正文件保护模式

  2. 替换更新的 RPM

  3. 重建安装程序

要合并更新,您需要从 Linux 机器对发行版目录具有写入权限,并安装一个可用的 rpm 版本,而要重建 anaconda 安装程序,您需要使用与您正在重建安装程序相同的 Redhat Linux 版本(否则该过程将失败)。如果您维护updates目录的镜像,您可以随时通过重复这些步骤来生成包含当前更新的 CD。


5.1. 更正文件保护模式

在 6.2 及更早版本的安装过程中,某些程序直接从 CD 运行。不幸的是,FTP 程序并不总是保留复制的文件和目录的保护模式。因此,必须确保在将目录刻录到 CD 上之前,授予程序、shell 脚本和共享库执行权限。这是通过在您的本地发行版副本上运行 updatePerm.sh 脚本来完成的。它实际上只需要用于 6.2 及更早的版本,对 7.3/8.0/9 版本过程有用的唯一部分是目录权限更新,即使其余部分没有坏处并且事物保持一致。它几乎等于updatePerm脚本包含在以前版本的 howto 中,只是做了一些细微的更改。在使用此脚本之前,您必须配置 rhcd.conf 配置文件,并导出一个指向此文件所在目录的 RHCDPATH 变量。

        $ export RHCDPATH=/home/luigi/tmp/rhcd-scripts
        $ sh updatePerm.sh
      


5.2. 替换更新的 RPMS

updateCD.sh 脚本将所有新文件从更新目录复制到 RPMS(和 SRPMS)目录。该脚本使用rvc程序,该程序在 比较 RPM 版本 部分中介绍过,用于确定更新目录中的哪些软件包是最新的。旧软件包会被移动到 ${OLDDIR} 目录。如果 CHECKSIG 变量设置为 "yes",则主树中的所有软件包都将检查其签名的正确性。如果一个软件包的签名检查失败(检查类型是通过 USEGPG 变量配置的,该变量的值在 rhcd.conf 文件中分配),它将被移动到 OLDDIR 目录,并添加 "CDcheckfail" 扩展名。

在使用此脚本之前,您必须配置 rhcd.conf 配置文件,并导出一个指向此文件所在目录的 RHCDPATH 变量。

        $ export RHCDPATH=/home/luigi/tmp/rhcd-scripts
        $ sh updateCD.sh
      

Note

在将更新合并到主RedHat/RPMS目录后,您的发行版副本不再是 Red Hat 发行站点的镜像。实际上,它更最新!因此,如果您尝试使用 mirror 镜像发行版,则会再次下载已更新的 RPM 的旧版本,并且更新将被删除。基于 bash/wget 的过程没有这个问题,但会将主树置于不一致的状态。在这种情况下,旧软件包和新软件包将混合在一起,但是您可以找到并删除它们,将rvc二进制文件包装在一个简单的 shell 脚本中(我将把它作为读者的练习留给读者...)。


5.3. 重建安装程序

随着 anaconda 安装程序的引入(自 6.1 版本起)以及 7.x/8.0 发行版看到的尺寸(以及 ... CD 数量)的大幅增加,本节中的内容已经发生了很大的变化。在 6.2 版本之前,构成本节的唯一步骤是生成一个新的hdlist文件。随着 6.2 版本的发布,由于 anaconda 安装程序的更改,以及 rpm 软件本身(从 3.x 版本到 4.x 版本)的更改,以及更新的软件包迁移到这个新版本(实际上 6.2 版本的更新同时使用这两个主要版本进行打包),这种情况似乎只在一定程度上成立。rpm软件)。我们将考虑三种不同的程序,以涵盖所有版本。


5.3.1. RedHat <= 6.1

5.3.1.1. 重新生成 hdlist 文件

当从 CD 安装时,CD 上的安装程序依赖于文件RedHat/base/hdlist来描述 CD 上可用的 RPM 包。该hdlist文件可以通过程序生成misc/src/install/genhdlist。此程序必须使用发行版根目录的绝对路径作为唯一参数运行。这是updateHdlist脚本,它调用该程序(来自本教程的 1.34 版本)

            #!/bin/bash

            RHVERSION=6.1
            ARCH=i386

            echo generating hdlist...
            RHROOT=/home/luigi/tmp/redhat-${RHVERSION}
            GENHDDIR=${RHROOT}/${ARCH}/misc/src/anaconda/utils
          
            chmod u+x ${GENHDDIR}/genhdlist
            chmod 644 ${RHROOT}/${ARCH}/RedHat/base/hdlist
            ${GENHDDIR}/genhdlist ${RHROOT}/${ARCH} || echo "*** GENHDLIST FAILED ***"

            exit 0
          

NoteRedHat < 6.1 的重要提示
 

RedHat 6.1 中的安装与早期版本完全不同,并且 RedHat 引入了 anaconda。该genhdlist程序现在位于不同的位置,因此在上面的脚本中,我们使用了
              GENHDDIR=${RHROOT}/${ARCH}/misc/src/anaconda/utils
            
而对于 6.0(包括)之前的版本,该行应为
              GENHDDIR=${RHROOT}/${ARCH}/misc/src/install
            

在某些情况下,genhdlist无法运行,因为可执行文件不是静态链接的。在这种情况下,您可以添加新行${RHROOT}/${ARCH}/RedHat/instimage/usr/lib/etc/ld.so.conf并运行ldconfig -v.

另一种解决方案是重新编译genhdlist。以下修改对updateHdlist脚本在 RedHat 5.2 下工作
	    #!/bin/bash

	    RHVERSION=6.1
	    ARCH=i386

	    RHROOT=/misc/redhat/redhat-${RHVERSION}
	    GENHDDIR=${RHROOT}/${ARCH}/misc/src/anaconda/utils

	    echo Compiling genhdlist...
	    sed -e 's/FD_t/int/' \
	        -e 's/fdOpen/open/' \
	        -e 's/fdClose/close/' \
	        -e 's/fdFileno//' < ${GENHDDIR}/genhdlist.c > /tmp/genhdlist.c
	    cc -o /tmp/genhdlist -I/usr/include/rpm /tmp/genhdlist.c -lrpm -lz

	    echo generating hdlist...
	    chmod 644 ${RHROOT}/${ARCH}/RedHat/base/hdlist
	    /tmp/genhdlist ${RHROOT}/${ARCH} || echo "*** GENHDLIST FAILED ***"

	    exit 0
	  

在此版本的脚本中,C 源代码的副本genhdlist.c通过管道传递sed以在/tmp中创建一个将在 RedHat 5.2 下编译的副本。然后使用此版本的genhdlist来创建hdlist文件

NoteRedHat 5.2 的重要提示
 

与 RedHat 5.2 及更早版本一起分发时,genhdlist如果在RedHat/RPMS目录中有 RPM 文件,则会崩溃! 这会导致问题,因为在 5.2 发行版中,有几个非 RPM 文件名为ls-lRls-lR.gzRedHat/RPMS。因此,您必须从目录中删除所有非 RPM 文件。或者,您可以将补丁 genhdlist.c.diff 应用于misc/src/install/genhdlist.c并执行 make。该补丁将导致genhdlist忽略任何非 RPM 文件。


5.3.1.2. 创建 CD ISO 镜像

您需要创建一个将写入 CD 的镜像文件。该文件将为 500Mb 或更大,因此请找到具有足够可用空间的分区。您可能需要 root 权限才能使用 mount 和 cdrecord。在这里,您将准备要刻录的可引导 CD 的 ISO 镜像。实际上,严格来说,没有必要创建可引导 CD,因为您可以使用引导软盘代替它,但这绝对是一个很棒的功能(并使您的光盘在行为上更类似于原始光盘)。这些是我用来完成任务的命令
            $ mkdir /images-destination-dir
            $ mkisofs  -r  -J  -T  -v  -V "Red Hat 6.1 (Hedwig)" \
                -c boot.cat  -b images/boot.img \
                -o /images-destination-dir/i386-disc.iso .
          
这是刻录(可引导)光盘所必需的,并且从发行版的顶层目录执行。该/images-destination-dir目录是您正在生成的 ISO 镜像的容器,并且在开始该过程之前必须存在(显然)。在下表中,您可以阅读各种选项及其含义的简要说明(其中大部分是从mkisofs手册页中提取的)。

表 1. mkisofs 选项和参数

-r 具有权限位有用值的 Rock Ridge 扩展
-J Joliet 扩展,以便在某些不同的操作系统中使用 CD
-T 在每个目录中生成一个 TRANS.TBL 文件,即使在不支持 Rock Ridge 扩展的系统上也能正确映射文件名。
-v 详细输出

-V <卷标>

 指定要写入主块的卷 ID(卷名或标签)。

-c <引导目录>

 指定在制作 "El Torito" 可引导 CD 时要使用的引导目录的路径和文件名。路径名必须相对于指定给 mkisofs 的源路径。

-b <eltorito 引导镜像>

 指定在制作 "El Torito" 可引导 CD 时要使用的引导镜像的路径和文件名。路径名必须相对于指定给 mkisofs 的源路径,并指定一个软盘镜像(这就是为什么我们使用在原始 CD 上找到的软盘镜像之一的原因)。您可能想使用pcmcia.img镜像来使用诸如网卡或 CDROM 阅读器之类的 pcmcia 设备进行安装。

-o <文件名>

 包含生成的 ISO 镜像的文件名
. 这是我们生成的 ISO 镜像的根目录(我们正在从每个 CD 的根目录工作,因此一个点就足够了)。

您将在 刻录 CD 中找到有关如何在介质上刻录镜像的详细信息。该mkisofscdrecord步骤可以通过图形前端来执行,例如 X-CD-Roast,它目前应该支持创建可引导 CD(我从未用过它,所以不要指望我会给你任何解释)。


5.3.2. RedHat 6.2

显然,在刻录最新的 CD 时,这是一个麻烦的孩子。 Redhat Package Manager (RPM) 版本 4 的引入,使得更新 anaconda 安装程序的过程失败。因此,列出的过程仅在更新的软件包是使用早于或等于 3.0.4 的 RPM 软件版本构建时才有效(因此,基本上是 3.0.4 或 3.0.5)。

如果您使用的是 Redhat 的原始软件包,则必须避免使用 2001 年 3 月 28 日之后发布的更新(我认为这有点毫无用处),或者必须使用旧的 rpm 格式重建软件包。有关降级过程和实现它的工具的详细信息可以在文档 rpmhack 中找到。我个人没有测试过这个过程,即使您在 anaconda-devel 和 kickstart 邮件列表中读到它似乎有效(您可以在 Redhat 网站的 邮件列表 部分找到它们)。

如果您决定坚持使用旧的原始软件包并完成更新(在安装完成后使用 rpm 4.0.2 软件包),则有两种可能的方法可以执行此操作,具体取决于您要完成 CD 的哪种更新。如果某些更新直接涉及安装过程(例如,内核、python、kudzu),则您必须使用文档 构建 Red Hat Linux 6.2 CDROM 中解释的安装程序重建过程,否则您仍然可以使用旧的过程(先前部分中解释的针对 6.1 之前和包括 6.1 的版本的过程)。最后两个步骤分别是在 创建 CD ISO 镜像刻录 CD 中描述的。


5.3.3. RedHat 9、8.0 和 7.3

随着发行版的 7.x 系列的发布,很多事情再次发生了变化。现在需要完成更多的操作才能获得一套全新的最新 CD。确切地说,随着 7.0 版本的发布,它们变得不止一个,现在必须拆分该树以适应媒体。这是通过splitdistro脚本完成的,该脚本像大多数 anaconda 安装程序一样用 python 编写。要完成此部分,您必须使用安装了 anaconda-runtime 软件包的 Linux RedHat 7.3、8.0 或 9 机器(它可能具有 7.3.7、8.0.4 或 9.0.4 版本),具体取决于您要重建的版本。该过程由七个步骤组成

  1. 重新生成hdlisthdlist2文件

  2. 更新comps.xml(或comps)文件

  3. 重建安装程序

  4. 将发行版拆分为 CD 大小的块

  5. 重新生成hdlisthdlist2文件(再次)

  6. 生成 ISO 镜像

  7. 在 ISO 镜像中添加和检查 md5 签名

所有步骤都分组在上一节中提供的单个脚本中。


5.3.3.1. 在主树上的初步操作

包含在anaconda-runtime软件包中的某些脚本需要将主树移动到以我们正在构建的架构命名的子目录中(所以i386/对我而言)。我们将在启动该过程之前将所有内容移动到这样的目录中,并更改不需要此修改的脚本的调用。

对于 redhat 9 和 8.0
            $ chmod  -R  u+w  /absolute-path-to-toplevel-dir 
            $ mkdir  -p  /absolute-path-to-toplevel-dir/i386
            $ cd /absolute-path-to-toplevel-dir 
            $ /bin/mv  *  i386
          
您应该将 "/绝对路径-到-顶层目录" 替换为您的本地发行版副本的根目录所在的目录的绝对路径(可能在某个硬盘驱动器上的某个位置)。您将从最后一个命令的执行中收到一个错误,因为i386/目录无法在自身下移动,但您无需担心。

对于 redhat 7.3
            $ chmod  -R  u+w  /absolute-path-to-toplevel-dir 
            $ mkdir  -p  /absolute-path-to-toplevel-dir/i386
            $ cd /absolute-path-to-toplevel-dir 
            $ for i in `ls` ; do [ $i != "SRPMS" -a $i != i386 ] && /bin/mv $i i386 ; done
          
这次您不应该从最后一个命令收到任何错误消息(希望如此)。


5.3.3.2. 重新生成 hdlist 和 hdlist2 文件

这是通过以下两个命令借助genhdlist程序完成的。
            $ /usr/lib/anaconda-runtime/genhdlist  /absolute-path-to-toplevel-dir/i386 
            $ chmod  644 /absolute-path-to-toplevel-dir/i386/RedHat/base/hdlist{,2} 
          
同样,"/绝对路径-到-顶层目录" 是您的本地发行版副本的根目录所在的目录的绝对路径。第二个命令是确保为文件设置正确的权限所必需的。如果您已通读 Redhat 目录,您应该已经了解这些文件是关于什么的。


5.3.3.3. 更新 comps.xml 文件

在 Redhat Linux 8.0 中,comps 文件的格式已完全更改,现在基于 XML。正如您在 The comps file 中阅读的那样,它提供了更多的灵活性和易于定制性。如果您修改或打算修改已安装软件包的列表,则需要完成此步骤。反过来,这意味着拥有修改后的 comps-9.tar.gz comps-9.tar.gz(原始的对我不起作用)或 comps-8.0.tar.gz 软件包(取决于您要构建的版本),包括在 Redhat 网站上找到的主 comps 文件和comps-extras已安装的 rpm 软件包。请按照以下步骤操作 Redhat 9 和 8.0
            $ cd /some-dir-of-your-choice
            $ tar xzvf /path-to-comps-9.tar.gz/comps-9.tar.gz 
            $ cd comps
            $ make
            $ cat comps-milan.xml |sed 's!</comps>!!g' >comps-tmp.xml
	    $ /usr/share/comps-extras/getfullcomps.py  comps.xml \
                 /absolute-path-to-toplevel-dir i386 >> comps-tmp.xml
	    $ echo '</comps>' >> comps-tmp.xml
	    $ cp comps-tmp.xml /absolute-path-to-toplevel-dir/i386/RedHat/base/comps.xml
          
除了 "/绝对路径-到-顶层目录" 之外,您还应注意为 "/您的选择的某个目录""/comps-9.tar.gz 的路径" 分配有效名称。其余命令可以简单地复制。而且...如果您要构建 Redhat 8.0 发行版,则必须(显然)将 9 更改为读取 8.0。

再次,在发出 make 命令之前,您应该修改文件comps-milan.xml.in使用您喜欢的文本编辑器,并按照 The comps file 和 Redhat 网站的 anaconda comps 部分中的指南和建议进行操作。

上一节中提供的脚本将使用 COMPSFILE 变量查找comps-milan.xml文件(它不需要具有该名称,我只是使用原始名称,但您可以根据需要进行更改)后,执行所有需要的步骤。

如果您使用的是 Redhat 7.3,则comps文件(您是否注意到不同的名称...)是一个文本文件,具有在 The comps file 中更详细描述的完全不同的语法。在这种情况下,唯一必要的操作是修改文件以满足您的需求并将其复制到RedHat/base/comps文件覆盖主目录中的原始文件。


5.3.3.4. 重新构建安装程序

这将使用您更新的软件包在您本地的发行版本副本中重新构建anaconda安装程序。 对于Redhat 9,执行
            $ /usr/lib/anaconda-runtime/buildinstall  \
                --pkgorder /absolute-path-to-toplevel-dir/pkgorder.txt  \
                --comp dist-9 --product "Red Hat Linux" --version 9  \
                --release "Redhat 9 (Shrike)" /absolute-path-to-toplevel-dir/i386  
          
再次,"/绝对路径/到/顶层目录"是您本地发行版本副本根目录所在的位置。

对于Redhat 8.0,过程几乎相同(缺少 "--product" 选项)
            $ /usr/lib/anaconda-runtime/buildinstall  \
                --pkgorder /absolute-path-to-toplevel-dir/pkgorder.txt  \
                --comp dist-8.0 --version 8.0  --release "Redhat 8.0 (Psyche)" \
                /absolute-path-to-toplevel-dir/i386  
          

或者,如果您仍然使用Redhat 7.3(像我一样)
            $ /usr/lib/anaconda-runtime/buildinstall  \
                --pkgorder /absolute-path-to-toplevel-dir/pkgorder.txt  \
                --comp dist-7.3 --version 7.3 /absolute-path-to-toplevel-dir/i386  
          

唯一的显著区别是没有(在8.0中是强制性的)--release 选项。


5.3.3.5. 分割发行版

这将创建五个目录,每个目录对应于一个不同的CD,并将它们中的硬链接指向您本地发行版本副本中包含的真实文件。

Note

如果您不使用修改后的版本,这将完全不适用于Redhat 7.3splitdistro脚本,报告在下一段中。 对于Redhat 8.0和9,提供了一个修改后的版本splitdistro主要是因为即使修复了前一个脚本中的问题,如果软件包不足以填充所有CD(前四个完全填充,最后一个即使只是部分填充),现在执行也会失败。

            $ $/usr/lib/anaconda-runtime/splitdistro  \
              --fileorder /absolute-path-to-toplevel-dir/pkgorder.txt  --release \
                "Redhat 9 (Shrike)"  /absolute-path-to-toplevel-dir  i386 
          
对于8.0和7.3,您唯一需要更改的是传递给 --release 选项的字符串(应该读取 "Redhat 8.0 (Psyche)""Redhat 7.3 (Valhalla)"

对于Redhat 7.3,使用的 splitdistro7.3 (python) 脚本版本是从anaconda-runtime 7.3.7 软件包中提取并由我修改的。您应该将其替换为原始版本(也许在复制后者之后),命名为/usr/lib/anaconda-runtime/splitdistro.

唯一的修改(除了一些小的修复)是,如果脚本经历的SRPMS目录未找到(不会终止,但会生成没有源软件包的CD),则更改其行为。

对于Redhat 8.0,使用的 splitdistro8.0 (python) 脚本版本是从anaconda-runtime 8.0.4 软件包中提取并再次由我修改的,以获得我认为需要的改进。您应该将其替换为原始版本(也许在将其复制到某个地方之后),命名为/usr/lib/anaconda-runtime/splitdistro无论如何,如果您想要构建一个包含所有SRPMS软件包的发行版本(以便填充所有5个CD,否则脚本将失败),则原始版本运行良好。

脚本经历的唯一修改是,如果SRPMS目录未找到(不会终止失败,但会生成没有源软件包的CD),或者有一个CD上没有任何软件包(不会失败,而是生成一个空目录),则更改其行为。

对于Redhat 9,您可以在这里找到一个脚本副本,其中包含应用于8.0版本中的相同修改: splitdistro9。 前一段中针对Redhat 8.0所说的一切都适用于9版本。


5.3.3.6. 重新生成hdlist和hdlist2文件

这是重新创建hdlist和hdlist2文件所必需的,使用之前步骤中获得的一些信息。 对于此程序的执行,7.3、8.0和9之间没有区别。 要执行的命令如下
             $ /usr/lib/anaconda-runtime/genhdlist  \
                 --fileorder /absolute-path-to-toplevel-dir/pkgorder.txt  --withnumbers \
                 /absolute-path-to-toplevel-dir/i386-disc[1-3]
           
如您所见,如果您还记得第一次运行它,则传递给该程序两个新选项。 第一个选项是 --fileorder,它告诉genhdlist使用文件pkgorder.txt我们在第二步(重新构建安装程序)中生成的。 此文件保存有关软件包如何在不同CD上拆分的信息,并由安装程序使用以确定应以何种顺序安装软件包。 基本上,如果您避免使用它,您将(可能)最终在安装期间多次交换各种CD。 --withnumbers 选项是必需的,以便将CD编号与每个软件包相关联(如您所见,使用了通配符指示前3个iso映像)。


5.3.3.7. 生成iso映像

在这里,您将准备要刻录到实际CD上的iso映像。 第一个光盘和其他光盘需要使用两个不同的命令。 这是由于需要获得一个可引导的第一个CD。 实际上,这不是绝对必要的,因为您可以使用启动软盘代替它,但这绝对是一个巧妙的功能(并且使您的光盘在行为上更类似于原始光盘)。 这些是我用来完成任务的命令

              $ mkdir /images-destination-dir
              $ mkisofs  -r  -J  -T  -v  -V "Red Hat 9 (Shrike) disc 1" \
		  -c isolinux/boot.cat  -b isolinux/isolinux.bin -no-emul-boot \
                  -boot-load-size 4 -boot-info-table -o /images-destination-dir/i386-disc1.iso .
            
这是刻录RedHat 8.0和9的第一个(可启动)光盘所必需的(没有软盘仿真),并且是从发行版的顶层目录执行的。/images-destination-dir目录是您正在生成的五个iso映像的容器,并且必须在开始该过程之前存在。 对于Redhat 8.0,唯一需要更改的是卷名称(应为“Red Hat 8.0 (Psyche) disc 1”)。

              $ mkdir /images-destination-dir
              $ mkisofs  -r  -J  -T  -v  -V "Red Hat 7.3 (Valhalla) disc 1" \
                  -c boot.cat  -b dosutils/autoboot/boot.img \
                  -o /images-destination-dir/i386-disc1.iso .
            
这是刻录7.3上的第一个(可启动)光盘所必需的,并且是从发行版的顶层目录执行的(这次带有软盘仿真)。

其余的图像可以通过此 "for" 循环来编写
              $  for i in `echo 2 3 4 5` ; do mkisofs  -r  -J  -T  -v  \
                   -V "Red Hat 9 (Shrike) disc ${i}"  \
                   -o /images-destination-dir/i386-disc${i}.iso . ; done
            
刚刚呈现的循环将准备好最后四个图像,并为其提供正确的编号。 如您所见,第一次运行只有两个缺失的选项,并且,正如您所猜测的,它们仅在创建可引导CD时才需要。 在 创建CD iso映像中,您可以阅读对各种选项及其含义的简要说明(其中大部分是从man页面中提取的)。 同样,如果您正在构建Redhat 8.0,则应将卷名称更改为“Red Hat 8.0 (Psyche) disc ${i}”。


5.3.3.8. 在iso映像中植入并检查md5签名

这实际上是一个可选步骤,但允许使用 "checkmedia" 选项来验证CD在安装之前的签名,从而保证其正确性。

以下命令允许在iso映像上注入和验证md5签名
            $ /usr/lib/anaconda-runtime/implantisomd5 iso-image
            $ /usr/lib/anaconda-runtime/checkisomd5 iso-image
          

完成所有这些步骤后,我们将发现自己拥有五个要刻录的CD映像。 考虑到输入所有这些内容有点耗时,因此在下一节中提供了一个脚本,该脚本将在一次运行中完成所有列出的操作(不要忘记正确配置参数)。


5.3.3.9. 将所有步骤放在一起

updateBuild.sh 脚本将执行以在一次运行中(以root用户身份)重建RedHat 7.3、8.0或9的发行版CD所需的所有步骤。 在使用此脚本之前,您必须配置 rhcd.conf 配置文件,然后在导出指向此文件所在目录的RHCDPATH变量之后。 如果您想在CD中包含修改后的comps.xml(或comps)文件,如 The comps file 中所述,则应立即(在执行脚本之前)将其复制到由COMPSFILE变量定义的位置。 不要忘记添加修改后的splitdistro脚本到/usr/lib/anaconda-runtime目录,如果您需要它。

            # export RHCDPATH=/home/luigi/tmp/rhcd-scripts
            # sh updateBuild.sh
          


6. 刻录CD

它由一个可选步骤和一个必需步骤组成。 请记住,您可能必须是机器上的"root"才能运行cdrecord.


6.1. 测试映像

如果您有偏执症,则可以通过挂载来测试新的磁盘映像。 如果您忘记修复文件权限或设置rock ridge扩展,那么这里的错误将很明显,因为文件名和目录结构将不正确。 (可选)测试可以通过发出命令来完成

        # mount -t iso9660 -o ro,loop=/dev/loop0 iso-image /mnt/cdrom
      

其中"iso-image"是您要挂载的iso映像文件的名称(对于包括6.2在内的版本,这是唯一的名称)。 完成后,请不要忘记卸载它

        # umount /mnt/cdrom
      


6.2. 刻录磁盘

请确保为您的设备设置正确的参数。 例如,此命令适用于4X CDR,顺便说一句,这很慢。 此外,假定CD刻录机位于SCSI总线0上,ID号为0,LUN为0(您可以通过发出cdrecord -scanbus并将它们分配给-dev=参数来获得这些值)。

        # cdrecord -v speed=4 dev=0,0,0 /images-destination-dir/disc1.img
      


7. comps文件

comps文件定义了在安装过程中如何捆绑软件包。 在Red Hat发行版中,这是根据它们提供的功能完成的,例如

在安装过程中的某个时候,会向用户显示一个名为“要安装的组件”的对话框。 一些组件已被预先选择,而另一些组件则未被预先选择。 组件列表上的最后一项称为“所有内容”。 在对话框中,还有一个选项,使用户可以自定义将要安装的软件包。 除非您修改RedHat/base/comps文件,否则通过手动自定义安装或在组件列表中选择“所有内容”是安装您自己的软件包的唯一方法。


7.1. <的文件格式compsRedHat版本中的文件 < 6.1

comps文件当前以描述comps格式版本的标头开头,后跟一个空行。
        0.1
        <empty line>
      

在此之后,列出了组件,并以空行分隔
        <component 1>
        <empty line>
        <component 2>
        <empty line>
        ....
        <component n>
        <empty line>
        EOF
      

每个组件都有以下定义
        (0|1) (--hide)? <name>
        <RPM 1>
        <RPM 2>
        ...
        <RPM n>
        end
      

在每个组件的名称之前,给出了0或1。此处的1值表示默认情况下选择了该组件,而0表示未选择该组件。 --hide选项表示您将不会看到该条目,除非您选择"expert"安装。 第一个组件称为"Base",这是特殊的,因为它必须存在,并且不会显示在对话框中(您无法取消选择基本安装,这是有道理的...)。 接下来是属于该组件的rpm软件包列表。 请注意,这是存储在rpm文件中的软件包名称,而不是软件包文件名的任何部分(尽管按照惯例,它应该相同)。

通过将您的软件包添加到comps文件中,您可以自定义自己的发行版,并确保默认情况下将安装您的软件包。 要注意的一件事是软件包之间的相互依赖性,但是在这里,您需要自己解决 :-) 谨告诫:注意不要在文件中添加或删除额外的空格。 检查现有的comps文件(制作原始文件的副本)以查看它是如何完成的(或检查i386/misc/src/install/pkgs.c(如果你想了解文件是如何被解析的)。


7.2. RedHat 6.1 版本中 comps 文件的格式

在 RedHat 6.1 版本中,comps文件的格式发生了改变。解码发生在${RHROOT}/${ARCH}/misc/src/anaconda/comps.py。我还没有分析这个 python 脚本,下面的规则仅仅是通过阅读文件和测试一些配置得到的。

在 6.1 版本中,组件的定义被扩展,除了 <RPM> 元素外,还包含了一些可选元素。这些元素是:
          <arch-dependent-RPM 1>
          ...
          <arch-dependent-RPM n>
          <required-component 1>
          ...
          <required-component n>
          <component-dependent-RPM 1> 
          ...
          <component-dependent-RPM n>
        

<arch-dependent-RPM> 定义了一个软件包和特定架构之间的依赖关系,其定义如下:
          (!)?arch: <RPM>
        

例如,在实际应用中,它可以表现为:
          !alpha: kernelcfg
        
这意味着:如果架构不是 alpha,则安装软件包 kernelcfg

或者:
          i386: mkbootdisk
        
这意味着:如果架构是 i386,则安装软件包 mkbootdisk

<required-component1> 强制依赖于另一个组件,其定义如下:
          @ <component>
        

因此,例如,如果在组件定义中找到以下行:
          @ Networked Workstation
        
这意味着组件本身需要安装另一个名为 Networked Workstation 的组件。

<component-dependent-RPM> 用于选择一些附加软件包的安装,基于另一个组件的存在。其定义如下:
          ? <component> { 
            <RPM 1>
            ...
            <RPM n>
          }
        

因此,例如,如果在组件定义中读到以下行:
        ? KDE { 
          kpppload
        }
      
那么如果安装了 KDE 组件,软件包 kpppload 将与定义所在的组件中包含的软件包一起安装。


7.3. RedHat 6.2 版本中 comps 文件的格式

在 RedHat 6.2 版本中,comps文件的格式,看起来,只是略有变化。解码仍然发生在${RHROOT}/${ARCH}/misc/src/anaconda/comps.py即使在这种情况下。同样,我还没有分析这个 python 脚本,下面的规则仅仅是通过阅读文件和测试一些配置得到的。

在 6.2 版本中,组件的定义被扩展,包含另外两个可选元素,它们是:
        <lang-dependent-RPM 1>
        ...
        <lang-dependent-RPM n>
        <arch-dependent-component 1>
        ...
        <arch-dependent-component n>
      

<lang-dependent-RPM> 用于指定在选择了特定语言时安装软件包。其定义如下:
        (lang <language>): <RPM>
      

例如,以下行:
        (lang ja_JP)): locale-ja
      
意味着:如果选择了日语,则安装 locale-ja 软件包,以及当前组件安装的其他软件包。

<arch-dependent-component> 将 6.1 版本中引入的 <arch-dependent-RPM> 的概念扩展到整个组件,正如你可以从定义中理解的那样:
        (!)?arch: <component>
      


7.4. RedHat 7.3 版本中 comps 文件的格式

在 RedHat 7.3 版本中,comps文件的格式获得了更多的语法能力。解码(再次)发生在comps.py脚本中,如果你安装了 anaconda 软件包,现在你可以在/usr/lib/anaconda/目录中找到它。组件或软件包对语言或架构的依赖现在可以用 and 运算符连接。例如:
        (arch !s390 and arch !s390x and arch !ia64): readline2.2.1
      

这意味着如果架构不是 s390、s390x、ia64 中的任何一个,则安装 readline2.2.1 软件包。这可以对组件而不是软件包,以及语言而不是架构进行操作。对于下一节中将要介绍的默认安装的简单自定义示例来说,这些绝对足够了。


7.4.1. 自定义 RedHat 7.3 版本的默认安装

本节中我们将要讲解的示例涉及修改 comps 文件以更改软件包安装的默认值。事实上,我通常更喜欢,尤其是在某些情况下,仅包含基本软件包的默认安装,并对其中一些软件包进行细微的更改。在第一个示例中,我们将构建一个默认安装,其中 libsafe 被添加到 "Base" 组件中,并且大部分通常默认安装的软件包都被取消选择,以便构建一个最小化的安装。在第二个示例中,我们将修改一些组件以构建另一个最小化的安装,该安装(这次几乎完美地)满足我们的需求(实际上,这是我的需求,你的情况可能肯定会有所不同)。如果你想在你的 CD 中包含修改后的 comps 文件,你应该在开始 重新构建 7.3/8.0 安装程序 中描述的操作之前,将其复制到主目录树中。


7.4.1.1. 添加 RPMS 和取消选择默认组件

要以这种方式自定义你的安装,你必须使用你最喜欢的文本编辑器编辑comps文件(注意不要在文件中留下有害的空格或制表符),并将其移动到Redhat/base目录,覆盖原始文件。

在包含的 第一个 comps 文件 中,libsafe 软件包被添加到 "Base system" 组件中,并且几乎每个组件都被取消选择,以便获得一个仅包含两百个软件包的默认安装(我知道它们可能仍然太多...)。


7.4.1.2. 修改一些标准组件

在包含的 第二个 comps 文件 中,我们基于先前的设置并进一步精简默认安装(这次默认安装中只有 154 个软件包)。一些组已经被拆分,以便为安装提供更多的粒度。你所做的所有修改都应该考虑到软件包之间的相互依赖关系以及安装阶段使用的应用程序(例如,即使你可以在安装后这样做,你也无法从 Base 组件中删除 kudzu)。必须说明的是,可以使用 kickstart 获得类似的结果。有关更多信息,你可以阅读 RedHat Linux 自定义指南


7.5. RedHat 8.0 和 9 版本中 comps 文件的格式

在 RedHat 8.0 和 9 版本中,comps文件的格式已经完全改变,现在使用一个 XML 文件,其名称为comps.xml。有关文件语法的详细信息,请参见 RedHat 网站的 anaconda comps 部分。


7.5.1. 自定义 RedHat 8.0 版本的默认安装

我们将现在重现针对 7.3 版本提出的示例,并考虑到各个组所做的修改。最重要的组("Base" 组)在这里被拆分为两个组,它们被命名为 "Base""Core""Base" 组应代表最小可能的安装。


7.5.1.1. 为 Redhat 8.0 重新审视我们的第一个示例

这一次,要自定义你的安装,你必须使用你最喜欢的文本编辑器编辑comps-milan.xml.in文件。这个文件可以在 Redhat 网站上的 comps-8.0.tar.gz 压缩包中找到。要将软件包信息添加到你创建的文件中,你需要安装comps-extrasrpm 软件包。要完成操作而发出的命令列在 更新 comps.xml 中以及 文档 中。在你创建文件后,你必须将其复制到Redhat/base目录,覆盖原始文件。如果你正在使用 updateBuild.sh 脚本,你应该只复制comps-milan.xml,(在修改了comps-milan.xml.in中找到的comps-8.0.tar.gztar/gzip 软件包并发出 make 命令之后),到你已经配置在 COMPSFILE 变量中的目标位置(rhcd.conf)。

在包含的 第一个 comps 文件 中,libsafe 软件包被添加到 "Base" 组(组件)中,并且几乎每个组(组件)都被取消选择,除了 "Base""Core",以便获得一个仅包含约 220 个软件包的默认安装(可能又太多了...)。


7.5.1.2. 为 Redhat 8.0 重新审视我们的第二个示例

在包含的 第二个 comps 文件 中,我们基于先前的设置并进一步精简默认安装(这次默认安装中只有 158 个软件包)。同样,可以使用 kickstart 获得类似的结果,有关更多信息,你可以阅读 RedHat Linux 自定义指南。在这个例子中,我没有完全取消选择 "Base" 组的安装,因为我通常需要太多软件包,所以我只是取消选择这些软件包的默认安装,使它们成为可选的。正如你所看到的,甚至redhat-logos软件包在 "Core" 组中也是可选的。考虑到该组中的所有软件包应该共同代表最小可能的安装,你可能不想这样做(顺便说一下,我的 CD 即使这样也能工作,可能有一些我还没有看到的故障)。tripwire软件包也被添加到 "Base" 组中。最后值得注意的修改是对 "dialup" 组进行的,即使它被取消选择也会被安装,因为 "Base" 组依赖于它(如组定义本身所声明的那样)。我只从该组中选择了我通常需要的一些软件包进行安装,并将其余的软件包保持未选择状态。


7.5.2. 自定义 RedHat 9 版本的默认安装

我们将(再次)重现针对 7.3/8 版本提出的示例,并考虑到各个组所做的修改。


7.5.2.1. 为 Redhat 9 重新审视我们的第一个示例

与 8.0 的情况一样,要自定义你的安装,你必须使用你最喜欢的文本编辑器编辑comps-milan.xml.in文件。这个文件可以在脚本中的 comps-9.tar.gz 文件中找到 (正如我所说,它与你在 Redhat 网站上找到的不同)。要将软件包信息添加到你创建的文件中,你需要comps-extrasrpm 软件包。要完成操作而发出的命令列在 更新 comps.xml 中以及 文档 中。在你创建文件后,你必须将其复制到Redhat/base目录,覆盖原始文件。如果你正在使用 updateBuild.sh 脚本,你应该只复制comps-milan.xml,(在修改了comps-milan.xml.in中找到的comps-9.tar.gztar/gzip 软件包并发出 make 命令之后),到你已经配置在 COMPSFILE 变量中的目标位置(rhcd.conf)。

在包含的 第一个 comps 文件 中,libsafe 软件包被添加到 "Base" 组(组件)中,并且几乎每个组(组件)都被取消选择,除了 "Base""Core",以便获得一个仅包含约 240 个软件包的默认安装(mmmhhh,复杂性正在迅速提高...)。


7.5.2.2. 为 Redhat 9 重新审视我们的第二个示例

在包含的 第二个 comps 文件 中,我们基于先前的设置并进一步精简默认安装(这次默认安装中只有约 175 个软件包)。这与为 Redhat 8.0 提出的示例非常相似,所以我将避免用同样的解释来让你感到厌烦。同样,可以使用 kickstart 获得类似的结果,有关更多信息,你可以阅读 RedHat Linux 自定义指南


8. 从 CD 安装

从新光盘安装时,您可能首先需要创建一个可引导的安装软盘。重要提示:使用全新的、刚刚用MS-DOS格式化过的软盘! 使用旧的、磨损的、有故障的软盘可能会在安装过程中导致奇怪的问题! 在 Linux 系统上,您可以使用dd命令创建软盘

      $ dd if=/mnt/cdrom/images/boot.img of=/dev/fd0 bs=1440k 
    

在运行 DOS 或 Windows-9x 的系统上,您需要使用rawrite.exe程序,该程序位于光盘上的dosutils目录中。 在运行 Windows-9x/Me/NT/2k 的机器上,您可以使用rawritewin.exe程序,该程序位于dosutils/rawritewin目录中找到源代码的副本和预编译版本。

目录中。 关闭您要安装(或执行系统升级)的机器,插入引导软盘和您新刻录的光盘,让机器从软盘引导。 有关安装过程的更多信息,请参阅文档和 Installation-HOWTOBootdisk-HOWTO


8.1. 从可引导光盘启动

大多数现代机器都能够直接从光盘启动,前提是光盘是通过 创建CD iso镜像 章节中概述的步骤制成可引导光盘。 但是,通常您需要更改 BIOS 的设置才能使光盘驱动器可引导。 请参阅您的主板文档以了解如何操作。


9. 其他 Linux 发行版

howto 的先前版本(<=1.34)中提供的信息,以及当前文档中报告的信息,适用于 Redhat Linux 6.1 及以下版本,据信也适用于 Redhat 克隆发行版,例如 Mandrake。 该过程据报道未经测试(正如您可以在 howto 本身中读到的那样)。

类似的考虑适用于 Apple PowerMac 的 LinuxPPC 发行版。 在为 PowerMac 平台制作发行版时,您需要使用 mkhybrid) 而不是mkisofs这将是唯一的区别。

为新版本的 Redhat (>6.1) 提供的信息不应该与 Mandrake 一起使用,Mandrake 现在与 Redhat 的安装程序有很大的不同。 我真的不知道 Redhat 的其他一些克隆是否可以通过这种方式更新其发行版 CD,如果您告诉我,我会很高兴。


10. 本文档...

可以从 此处 获取本文档最新版本的 SGML 源代码。 由 Morten Kjeldgaard 和 Peter von der Ah 撰写的先前版本可以在 imsb.au.dk 上找到


10.1. 相关文档

10.1.1. 与当前版本相关的文档

以下文档对创建此 howto 很有用

Tony Nugent 编写的(非官方)RedHat 7 定制安装程序 mini-HOWTO。 本文档非常有趣且有用,因此,如果您认真地想构建定制的 CD,我强烈建议您阅读它。 您可以在 www.linuxworks.com.au 上找到它

Miguel Freitas 编写了 RedHat7 CDs mini-Howto,您可以在此 网站 上阅读。

Ron Yorston 编写了 rpmhack 文档,该文档与 Redhat Linux 的 6.2 版本相关。

有人(我找不到他的名字)编写了文档 构建 Red Hat Linux 6.2 CDROM,该文档对 6.2 版本很有用。


10.1.2. 与先前版本相关的文档

Ed Schlunder <zilym@asu.edu> 编写了一个名为fix-rhcd的实用程序,可让您检查 Red Hat Linux 发行版镜像中是否存在与官方 Red Hat ftp 站点的 "ls -lNR" 列表匹配的文件大小、名称、权限和符号链接。 任何错误的权限都会更改为与 "ls" 列表匹配。 请参阅 fix-rhcd 主页

Rod Smith <smithrod@bellatlantic.net> 编写了 Do-It-Yourself Red Hat Installation 指南,其中还包括有关创建 RedHat 安装 CD 的信息。 特别是针对从非 UNIX 系统刻录 CD。 在他的 网站 上找到它。

<skooter@hol.fr> 用法语撰写的一份文件 "Comment graver un CD de la RedHat 5.x a partir de fichiers telecharges sur Internet...''" 可从 linuxfr.org 获取。

凭着对生活美好事物的理解,来自芬兰的 Jussi Torhonen <jussi.torhonen@tietosavo.fi> 告诉我们 如何制作自制 可引导的 RedHat Linux 5.2 CD-ROM。

从 LDP 项目,请参阅 CD-writing HOWTO


10.2. 致谢

除了上面提到的那些人,还要感谢以下人员提供的宝贵意见、反馈、讨论和其他


10.2.1. 当前版本致谢

  • Morten Kjeldgaard, <mok (at) imsb (dot) au (dot) dk>

  • Peter von der Ah, <pahe+rhcd (at) daimi (dot) au (dot) dk>

  • Giulia Tomaselli

  • Jacinta Conneely

  • Filippo Carcaci

  • Guillaume Lelarge <gleu (at) wanadoo (dot) fr>

  • Alain Portal <aportal (at) univ-montp2 (dot) fr>

  • anaconda-devel 和 kickstart 邮件列表上的所有人


10.2.2. 先前版本致谢

  • Lars Christensen <larsch (at) cs (dot) auc (dot) dk>

  • Thomas Duffy <tbd (at) cs (dot) brown (dot) edu>

  • Dawn Endico <dawn (at) math (dot) wayne (dot) edu>

  • Seva <seva (at) null (dot) cc (dot) uic (dot) edu>

  • Michael Thomas Cope <mcope (at) orion (dot) ac (dot) hmc (dot) edu>

  • Charles J. Fisher <charles_fisher (at) bigfoot (dot) com>

  • Eric Thomas <eric.thomas (at) ericsson (dot) com>

  • Gordon Yuen <gdccyuen (at) yahoo (dot) com>

  • Dave Morse <morse (at) nichimen (dot) com>