comps文件文件定义了在安装过程中如何捆绑软件包。在 Red Hat 发行版中,这是根据它们提供的功能完成的,例如
打印机支持
X Window 系统
GNOME
KDE
邮件/WWW/新闻工具
...
内核开发
额外文档
在安装过程的某个时候,用户会看到一个名为“要安装的组件”的对话框。一些组件已被预先选择,另一些则没有。组件列表中的最后一项称为“全部”。在该对话框中,还有一个选项允许用户精确地自定义将要安装的软件包。除非您修改RedHat/base/comps文件,否则手动自定义安装或选择组件列表中的“全部”是安装您自己的软件包的唯一方法。
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 选项表示您将看不到该条目,除非您选择 “专家”安装。第一个组件称为 “Base”,它很特殊,因为它必须存在并且不会出现在对话框中(您无法取消选择基本安装,这是有道理的...)。接下来是属于该组件的 rpm 软件包列表。请注意,这是存储在 rpm 文件中的软件包名称,不是软件包文件名的任何部分(尽管按照惯例应该相同)。
通过将您的软件包添加到文件文件中,您可以自定义自己的发行版,并确保默认安装您的软件包。需要注意的一件事是您的软件包之间的相互依赖性,但在这里,您需要自己处理 :-) 一个警告:小心不要在文件中添加或删除额外的空格。检查现有的文件文件(制作原始文件的副本)以了解它是如何完成的(或检查i386/misc/src/install/pkgs.c如果您想查看如何解析文件)。
对于 RedHat 6.1 版本,文件文件的格式已更改。解码发生在${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 |
或者作为
i386: mkbootdisk |
<required-component1> 强制执行来自另一个组件的依赖关系,其定义为
@ <component> |
因此,例如,如果在组件定义中找到以下行
@ Networked Workstation |
<component-dependent-RPM> 用于选择组件的一些其他软件包的安装,给定另一个组件的存在。其定义如下
? <component> { <RPM 1> ... <RPM n> } |
因此,例如,如果在组件定义中,您碰巧读取以下行
? KDE { kpppload } |
对于 RedHat 6.2 版本,文件文件的格式显然只是略有变化。解码同样发生在${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 |
<arch-dependent-component> 将 6.1 版本中引入的 <arch-dependent-RPM> 的概念扩展到整个组件,正如您所理解的定义
(!)?arch: <component> |
对于 RedHat 7.3 版本,文件文件的格式获得了一些更多的句法能力。解码(再次)发生在comps.py脚本中,如果您安装了 anaconda 软件包,现在可以在/usr/lib/anaconda/目录中找到它。组件或软件包对语言或架构的依赖关系现在可以使用 and 运算符连接。例如
(arch !s390 and arch !s390x and arch !ia64): readline2.2.1 |
这意味着如果架构不是 s390、s390x、ia64 中的任何一个,则安装软件包 readline2.2.1。这可以使用组件代替软件包和语言代替架构来完成。所有这些都绝对足以满足下一节中将介绍的自定义默认安装的简单示例。
本节中我们将介绍的示例意味着修改 comps 文件以更改软件包安装的默认值。事实上,我通常更喜欢在某些情况下,默认安装仅包括基本软件包,并对其中的一些软件包进行稍微修改。在第一个呈现的示例中,我们将构建一个默认安装,其中将 libsafe 添加到 “Base” 组件,并且取消选择通常默认安装的大部分软件包,从而构建一个最小安装。在第二个示例中,我们将修改一些组件以构建另一个(这次几乎完美地)满足我们需求的最小安装(它们实际上是我的需求,您的结果可能会有很大差异)。如果您想在您的 CD 中包含修改后的 comps 文件,您应该在开始 重建 7.3/8.0 安装程序 中描述的操作之前将其复制到主树中。
要以这种方式自定义您的安装,您必须使用您喜欢的文本编辑器编辑文件文件(注意不要在文件中留下有害的空格或制表符),并将其移动到Redhat/base目录,覆盖原始文件。
在包含的 第一个 comps 文件 中,libsafe 软件包已添加到 “基本系统” 组件,并且几乎每个组件都被取消选择,以便进行仅包含两百个软件包的默认安装(我知道它们可能仍然太多...)。
在包含的 第二个 comps 文件 中,我们在之前的设置的基础上进行构建,并进一步精简了默认安装(这次默认安装中只有 154 个软件包)。您所做的所有修改都应考虑到软件包之间的相互依赖关系以及安装阶段使用的应用程序(例如,即使您可以在安装后这样做,您也不能从 Base 组件中删除 kudzu)。必须说的是,可以使用 kickstart 获得类似的结果。有关更多信息,您可以阅读 RedHat Linux 自定义指南。
对于 RedHat 8.0 和 9 版本,文件文件的格式已完全更改,现在使用一个 XML 文件,其名称为comps.xml。有关文件语法的详细信息,请参见 RedHat 网站的 anaconda comps 部分。
现在,我们将重现为 7.3 版本提供的示例,同时考虑到各个组所做的修改。最重要的组(“Base” 组)在此处分为两个组,分别命名为 “Base” 和 “Core”。“Base” 组应代表可能的最小安装。
这次,要自定义您的安装,您必须使用您喜欢的文本编辑器编辑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 个软件包的默认安装(可能又太多了...)。
在包含的 第二个 comps 文件 中,我们在之前的设置的基础上进行构建,并进一步精简了默认安装(这次,默认安装中只有 158 个软件包)。同样,可以使用 kickstart 获得类似的结果,有关更多信息,您可以阅读 RedHat Linux 自定义指南。在此示例中,我没有完全取消选择 “Base” 组的安装,因为通常需要安装的软件包太多了,所以我只是取消选择了这些软件包的默认安装,使它们成为可选的。如您所见,甚至redhat-logos软件包在 “Core” 组中也被设置为可选。考虑到该组中的所有软件包加在一起应该代表尽可能小的安装,您可能不想这样做(顺便说一句,我的 CD 即使使用这个也可以工作,可能存在我尚未看到的故障)。tripwire软件包也被添加到了 "Base" 组。最后一个值得注意的修改是对 "dialup" 组的修改,即使该组未被选中,也会被安装,因为 "Base" 组依赖于它(正如在组定义本身中所声明的那样)。我只选择了这个组中我通常需要的一些软件包进行安装,其余的则未选择。
我们将(再次)重现针对 7.3/8 版本提供的示例,同时考虑到各个组所做的修改。
和 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 个软件包(嗯...复杂性正在升高...)。
在 第二个 comps 文件 中,我们在之前的设置基础上进一步简化了默认安装(这次,默认安装中只有约 175 个软件包)。这与为 Redhat 8.0 提供的示例非常相似,因此我将避免用相同的解释来烦您。同样,使用 kickstart 可以获得类似的结果,有关它的更多信息,您可以阅读 The RedHat Linux Customization Guide。