3. RPM 软件包

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

发行版中的二进制 RPM 文件是在运行发行版本身的系统上构建的。这很重要,因为软件包中的大多数程序都依赖于共享库。从 RedHat 5.0 版本开始,使用了新版本 2 的 GNU 标准 C 库(它是 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 软件包管理器的更多信息,我建议您阅读 man 手册和相当详细的书籍 maximum rpm

在下一节中,我将介绍一个 C 程序,该程序将在本 HOWTO 的其余部分中的各种脚本中使用。它只是返回给定同一 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.gz 存档的rpmvc目录中找到源代码副本和预编译版本。

Note

updateDist.sh (版本 < 1.17) 和 updateCD.sh (版本 < 1.12) 脚本对该程序的使用方式存在错误。我强烈建议避免使用版本号低于报告的版本号的脚本版本,即使问题并非经常出现(至少表面上是这样)。