Red Hat Training
A Red Hat training course is available for Red Hat Satellite
第 3 章 构建自定义软件包
在构建软件包的时候通常会出现一些错误,特别是在必须通过 Red Hat Network 发布和安装这些软件包时尤为常见。本章介绍了如何成功地构建使用 Red Hat Network 发布的软件包,其中包括了为什么要使用 RPM,如何为 RHN 构建软件包以及如果正确地签注软件包。
3.1. 为 Red Hat Network 构建软件包
Red Hat Network 使用RPM 软件包管理程序(RPM Package Manager)(RPM)技术来决定每个客户端系统可应用的软件附加和更新。在 Red Hat Network 搜索到的软件包通常是 RPM 格式,而在 Red Hat Network 网站的「软件」标签页中提供完整的 ISO 映像,但在 RHN Satellite Server 安装中无效。如果您的 Satellite 启用了对 Solaris 的支持,您可以使用 RHN Push 将 Solaris 软件包上传到 Solaris 客户端使用的自定义频道中。
RPM 是一个为用户提供简单安装、卸载、升级和验证软件包的工具。它还允许软件开发者为最终用户和开发者提供源码和编译版本打包文件。
3.1.1. RPM 的优点
RPM 有以下的优点:
- 容易升级
- 使用 RPM,您可以单独升级系统的组件而不用完全重新安装。当 Red Hat 发布 Red Hat Enterprise Linux 的新版本时,用户不需要重新安装就可以进行升级。RPM 允许智能、全自动、本地升级您的系统。在升级的过程中可保留软件包中的配置文件,因此用户不会丢失他们特定的配置。安装和升级软件包的时候使用同一个 RPM 文件,因此更新软件包时不需要特殊的升级文件。
- 软件包查询
- RPM 提供的查询选项允许您在整个 RPM 数据库中查询所有软件包或只查询特定的文件。您还可以轻松地找到文件所属软件包以及该软件包的来源。软件包中的文件位于一个压缩归档中,这个文件有一个包括这个软件包信息及其内容的自定义二进制标头。RPM 可以快速、方便地查询软件包的标头信息。
- 系统验证
- RPM 的另一个功能是可以进行软件包验证。如果您怀疑与一个软件包关联的文件已经被删除,您可以通过检查这个软件包来确定这个文件的状态。这个验证的过程会提示您所有异常情况。如果存在错误,您可以轻松地重新安装这个文件。在重新安装的过程中将保留配置文件。
- 原始源码
- RPM 的一个重要的功能就是允许使用原始软件源码,原始源码是由这个软件的原始开发者提供的。使用 RPM 可将原始源码及其使用的补丁程序以及完整构建说明打包。这个功能是非常重要的。例如,当发行一个新版本时,您不需要从头开始来编译它。您可以查看补丁来决定您可能需要做什么。使用此项技术,您可以方便地查看正确构建软件所需的所有编译的默认设置和修改。保留原始源码看起来可能只对开发人员有用,但实际上它也可以为最终用户提供高质量的软件。
3.1.2. RHN RPM 指南
RPM 的优势在于可以准确定义依赖关系并发现冲突。Red Hat Network 使用 RPM 的这个功能来处理软件的依赖关系。Red Hat Network 提供了一个自动环境,这意味着在安装一个软件包的过程中不需要人工参与。因此,当为那些需要通过 Red Hat Network 发布的软件包构建 RPM 时,以下的原则非常重要:
- 了解 RPM。要正确地构建软件包,了解 RPM 的基本功能是非常重要的。有关 RPM 的信息请参考以下资源:
- 当为一个子频道构建 RPM 时, 请在新安装的、与子频道的基本频道使用同一版本的 Red Hat Enterprise Linux 中构建软件包。请确定首先从 Red Hat Network 中应用所有更新。
- 在安装 RPM 软件包时一定不能使用
--force
或--nodeps
选项。如果您无法在您构建的系统中“干净”地安装 RPM,Red Hat Network 将不能在系统中自动安装它。 - RPM 软件包的文件名必须是 NVR(name(名称)、version(版本)、release(发行))格式且必须包括这个软件包的体系结构。正确的格式应该是
name-version-release.arch.rpm
。例如,一个有效的 RPM 软件包文件名是pkgname-0.84-1.i386.rpm
,它的名称是 pkgname,版本是 0.84,发行是 1,体系结构是 i386。 - RPM 软件包应该由其维护者签注。虽然未签注的软件包也可以通过 Red Hat Network 发布,但必须将 Red Hat Update Agent(
up2date
)配置为强制接受它们。我们强烈推荐使用经过签注的软件包,相关的内容可以在 第 3.2 节 “RHN 软件包的数字签名” 中找到。 - 如果软件包被修改(包括修改了签名或重新被编译),就必须相应增大版本或发行号。换句话说,通过 RHN 发布的每个 RPM 的 NVRA(包括体系结构)必须与其唯一构建对应以避免混淆。
- RPM 软件包不能自己作废。
- 如果一个软件包被分成多个单独的软件包,需要格外小心其相依性。除非由于编译的问题,否则请不要分割现有软件包。
- 软件包不能接受交互式的预安装(pre-install)、安装后(post-install)、预卸载(pre-uninstall)和卸载后(post-uninstall)脚本。如果软件包需要用户的直接参与,这个软件包将无法在 Red Hat Network 中工作。
- 在预安装、安装后、预卸载和卸载后脚本中不要写入任何 stderr 或 stdout 内容。如果不必要,请将信息重新输出到
/dev/null
,否则请将它们写入一个文件中。 - 创建 spec 文件时,使用
/usr/share/doc/rpm-<version>/GROUPS
中的组定义。如果没有完全匹配的项,选择最接近的一个。 - 使用 RPM 的相依性性能确定此程序在安装后可正常运行。
重要
请不要通过归档来创建一个 RPM,然后再在安装后脚本中恢复它们。这将违背 RPM 的初衷。
如果文件列表中不包含归档中的文件,您将无法验证或检查它们之间的冲突。在大多数情况下,RPM 本身可以有效地将文件打包或解压缩。例如,如果您没有在
%postun
项中进行清除,请不要在 %post
中创建文件。