其中涉及三个步骤,前两个步骤在所有版本中(几乎)相同,而最后一个步骤变化很大,因为 anaconda 安装程序发生了变化
更正文件保护模式
替换更新的 RPM
重建安装程序
在 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 |
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 |
![]() | 在将更新合并到主RedHat/RPMS目录后,您的发行版副本不再是 Red Hat 发行站点的镜像。实际上,它更加最新!因此,如果您尝试使用 mirror 镜像发行版,则已更新的 RPM 的旧版本将再次下载,并且更新将被删除。基于 bash/wget 的过程不会遇到此问题,但会将主树置于不一致的状态。在这种情况下,旧软件包和新软件包将混合在一起,但是您可以找到并删除它们,方法是将rvc二进制文件包装在一个简单的 shell 脚本中(我将其作为读者的练习...)。 |
随着 anaconda 安装程序(从 6.1 版本开始)的引入以及 7.x/8.0 发行版的尺寸(以及 ... CD 数量)的大幅增加,本节中的内容发生了很大变化。在 6.2 版本之前,构成此部分的唯一步骤是生成新的hdlist文件。对于 6.2 版本,由于 anaconda 安装程序、rpm 软件本身(从 3.x 版本到 4.x 版本)的变化以及更新的软件包迁移到此新版本(实际上,6.2 版本的更新与两个主要版本一起打包)rpm软件),这似乎只在一定程度上是正确的。我们将考虑三种不同的程序,尝试涵盖所有版本。
从 CD 安装时,CD 上的安装程序依赖于文件RedHat/base/hdlist,该文件描述了 CD 上可用的 RPM 软件包。
hdlist文件可以通过程序misc/src/install/genhdlist生成。此程序必须以发行版根目录的绝对路径作为唯一参数运行。这是updateHdlist脚本,该脚本调用该程序(来自本 HOWTO 的 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 |
![]() | RedHat < 6.1 的重要说明 | ||
---|---|---|---|
RedHat 6.1 中的安装与早期版本完全不同,RedHat 引入了 anaconda。现在可以在不同的位置找到genhdlist程序,因此在上面的脚本中,我们使用了
|
在某些情况下,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 |
在此版本的脚本中,genhdlist.c的 C 源代码副本通过sed管道传输,以在/tmp中创建一个副本,该副本将在 RedHat 5.2 下编译。然后使用此版本的genhdlist来创建hdlist文件
![]() | RedHat 5.2 的重要说明 |
---|---|
正如 RedHat 5.2 及更早版本分发的那样,如果genhdlist目录中有 非 RPM 文件,则RedHat/RPMS崩溃!这会导致问题,因为在 5.2 发行版中,有两个非 RPM 文件名为ls-lR和ls-lR.gz到RedHat/RPMS。因此,您必须从目录中删除所有非 RPM 文件。或者,您可以应用补丁 genhdlist.c.diff 到misc/src/install/genhdlist.c并执行 make。补丁将导致genhdlist忽略任何非 RPM 文件。 |
您需要创建一个镜像文件,该文件将被写入 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 . |
表 1. mkisofs 选项和参数
-r | Rock Ridge 扩展,具有权限位的有用值 | |
-J | Joliet 扩展,用于在某些不同的操作系统中使用 CD | |
-T | 在每个目录中生成 TRANS.TBL 文件,即使在不支持 Rock Ridge 扩展的系统上也能正确映射文件名。 | |
-v | 详细输出 | |
-V <卷 ID> | 指定要写入到主块中的卷 ID(卷名或标签)。 | |
-c <引导目录> | 指定制作“El Torito”可引导 CD 时要使用的引导目录的路径和文件名。路径名必须相对于 mkisofs 指定的源路径。 | |
-b <eltorito 引导镜像> | 指定制作“El Torito”可引导 CD 时要使用的引导镜像的路径和文件名。路径名必须相对于 mkisofs 指定的源路径,并指定软盘镜像(这就是为什么我们使用原始 CD 上找到的软盘镜像之一的原因。您可能想要使用pcmcia.img镜像来使用 pcmcia 设备(如网卡或 CDROM 读取器)进行安装。 | |
-o <文件名> | 包含生成的 iso 镜像的文件名 | |
. | 这是我们生成的 iso 镜像的根目录(我们从每个 CD 的根目录工作,因此一个点就足够了)。 |
您将在 刻录 CD 中找到有关如何在介质上刻录镜像的详细信息。可以通过诸如 X-CD-Roast 之类的图形前端执行mkisofs和cdrecord步骤,该前端目前应支持创建可引导 CD(我从未使用过它,因此不要期望我给您任何解释)。
显然,在刻录最新的 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 版本的过程,在上一节中进行了解释)。最后两个步骤,分别是创建 iso 镜像和刻录实际介质,分别在 创建 CD iso 镜像 和 刻录 CD 中进行了描述。
随着 7.x 系列发行版的发布,很多事情再次发生了变化。现在需要完成更多操作才能获得全新的最新 CD 系列。确切地说,随着 7.0 版本的发布,它们已变得不止一个,现在必须拆分树以适应介质。这是通过splitdistro脚本完成的,该脚本是用 python 编写的,就像大多数 anaconda 安装程序一样。要完成此部分,您必须使用安装了 anaconda-runtime 软件包的 Linux RedHat 7.3、8.0 或 9 机器(它可能具有 7.3.7、8.0.4 或 9.0.4 版本),具体取决于您要重建的版本。该过程由七个步骤组成
重新生成hdlist和hdlist2文件
更新comps.xml(或comps)文件
重建安装程序
将发行版拆分为 CD 大小的块
重新生成hdlist和hdlist2文件(再次)
生成 iso 镜像
在 iso 镜像中添加和检查 md5 签名
所有步骤都组合在一个脚本中,该脚本在最后一节中介绍。
包含在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 |
对于 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 |
这是借助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 Linux 8.0 中,comps 文件的格式已完全更改,现在基于 XML。正如您在 comps 文件 中可以读到的那样,它提供了更大的灵活性和易于定制性。如果您已修改或打算修改已安装软件包的列表,则需要完成此步骤。反过来,这意味着您拥有修改后的 comps-9.tar.gz comps-9.tar.gz (原始版本对我不起作用)或 comps-8.0.tar.gz 软件包(取决于您要构建的版本),其中包括在 Redhat 网站和comps-extrasrpm 软件包中找到的主 comps 文件。按照以下步骤操作 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 |
再次,在发出 make 命令之前,您应该修改文件comps-milan.xml.in,使用您喜欢的文本编辑器,并遵循 comps 文件 和 Redhat 网站的 anaconda comps 部分中找到的指南和建议。
最后一节中介绍的脚本将在 make 命令之后执行所有必需的步骤,使用 COMPSFILE 变量查找comps-milan.xml文件(它不需要具有该名称,我只是使用原始名称,但是如果您愿意,可以更改它)。
如果您使用的是 Redhat 7.3,则comps文件(您是否注意到名称不同...)是一个文本文件,具有完全不同的语法,在 comps 文件 中进行了更详细的描述。在这种情况下,唯一必要的操作是修改文件以满足您的需求,并将其复制到主树中的RedHat/base/comps文件,覆盖原始文件。
这将使用您更新的软件包在发行版的本地副本中重建 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 选项是唯一明显的区别。
这将创建五个目录,每个目录对应于一个不同的 CD,并将硬链接放入到发行版本地副本中包含的实际文件。
![]() | 如果您不使用下一段中报告的修改版本splitdistro脚本,则这对于 Redhat 7.3 完全不起作用。对于 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 |
对于 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 版本。
这是重新创建 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] |
在这里,您将准备要刻录到实际 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 . |
$ 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 . |
其余镜像可以通过此 "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 |
这实际上是一个可选步骤,但是它允许使用 "checkmedia" 选项来验证 CD 签名,然后再安装它们,以保证它们的正确性。
以下命令允许在 iso 镜像上注入和验证 md5 签名
$ /usr/lib/anaconda-runtime/implantisomd5 iso-image $ /usr/lib/anaconda-runtime/checkisomd5 iso-image |
完成所有这些步骤后,我们将发现自己拥有五个要刻录的 CD 镜像。考虑到键入所有这些内容有点耗时,因此在下一节中介绍了一个脚本,该脚本将在一次运行中完成所有列出的操作(不要忘记正确配置参数)。
updateBuild.sh 脚本将在一次运行中(以 root 用户身份)执行重建 RedHat 7.3、8.0 或 9 的发行版 CD 所需的所有步骤。在使用此脚本之前,您必须配置 rhcd.conf 配置文件,并在导出指向此文件所在目录的 RHCDPATH 变量之后。如果您想在 CD 中包含修改后的 comps.xml(或 comps)文件,如 comps 文件 中所述,则应立即将其复制到通过 COMPSFILE 变量定义的位置(在执行脚本之前)。不要忘记添加修改后的splitdistro脚本到/usr/lib/anaconda-runtime目录,如果您需要它的话。
# export RHCDPATH=/home/luigi/tmp/rhcd-scripts # sh updateBuild.sh |