21.3. RPM 的显著变化


Red Hat Enterprise Linux 10 带有 RPM 版本 4.19。与之前的版本相比,这个版本引入了很多改进。

21.3.1. 改进了用户体验和安全性

基于 Sequoia 的新 OpenPGP 后端

RPM 现在使用 Sequoia PGP 验证软件包签名,该签名替换了传统的 OpenPGP 解析器。Sequoia PGP 是 OpenPGP 标准的现代基于 Rust 的实现,专注于安全性和稳健性。

新的 rpmlua 命令行工具

此工具以独立方式运行 RPM Lua 解释器,您可以使用它们开发和测试 Lua scriptlets 和 macros。如需更多信息,请参阅系统中的 rpmlua (8) 手册页。

新的 rpmsort 命令行工具

此工具允许您对通过标准输入传递的 RPM 版本进行排序,类似于 sort (1),但了解 RPM 版本方案。如需更多信息,请参阅系统中的 rpmsort (8) 手册页。

新的 dbus-announce 插件

此插件将 RPM 事务的基本信息写入系统 D-Bus,例如安装软件包时。其他程序可以订阅这些信号,以便获得此类事件的通知。

降级模式降级 支持

在以前的版本中,您可以使用-- freshen 选项升级已安装的软件包,并跳过未安装的软件包。有了这个增强,您还可以使用此操作来降级这些软件包。为此,请将-- freshen (F)选项与 oldpackage 选项相结合。

21.3.2. 改进了打包体验

支持动态 spec 生成

现在,您可以通过将包含 spec 部分的文件放在预定义的位置,在构建过程中添加子软件包。如需更多信息,请参阅 动态规格生成

rpmspec 命令行工具中的 new- shell 选项

这个选项运行交互式 RPM 宏解释器,可用于开发和测试 RPM 宏(位于 spec 文件上下文或外)。如需更多信息,请参阅系统中的 rpmspec (8) 手册页。

支持在 %autopatch中应用单个补丁

现在,您可以将特定的补丁号列为位置参数,例如 %autopatch 1 4 6 以应用补丁号 1、4 和 6。

%files 部分中正确的类似 shell 的通配和转义

文件名中的通配符模式和转义字符(如反斜杠和引号)现在以更传统的方式解释,镜像 shell 解释器的行为,如 Bash。在以前的版本中,这些规则的未记录的限制和例外可能会有意外的结果,并可能会阻止在 spec 文件的 %files 部分中使用更复杂的模式。

源 RPM 软件包中的新标签,其中包含 spec 文件的解析和扩展内容

为了帮助分析打包问题,现在将新的 RPMTAG_SPEC 标签添加到源 RPM 软件包中。此标签包括扩展 spec 文件的内容,其格式为构建期间使用的形式。您可以通过执行 rpm --qf '%{spec}' -q /path/to/my/src.rpm 命令来查看此标签。

构建并行性现在考虑系统资源

现在,在估算构建软件包时要使用的并行进程和线程数量时,RPM 会考虑可用的物理内存和地址空间。这有助于防止性能问题或在具有受限资源的系统上构建故障,如有大量 CPU 的系统,但内存有限。

您可以通过分别定义 %_smp_tasksize_proc%_smp_tasksize_thread 宏,通过指定单个进程或线程数量来调整这些估算。这两个宏都的默认值为 512 MB。例如,如果您的系统有性能问题,您可以提高 RPM 的这些值,以便为构建分配较少的 CPU。同样,如果您的系统使用率不足,您可以减少 RPM 的这些值来分配更多 CPU。

如需更多信息,请参阅 控制构建并行 的 Macros

使用 zstd 进行有效负载压缩现在支持多线程

zstdio 压缩方法现在接受一个可选的 T 参数,该参数指定在构建期间压缩有效负载时要使用的线程数量。这有助于缩短大型软件包的构建时间。要启用此功能,请相应地设置 %_binary_payload%_source_payload 宏。如需更多信息,请参阅 /usr/lib/rpm/macros 文件中相关的注释块,以及 预期的格式表

新的可选 %conf spec 文件部分

您可以使用本节配置解包源来构建,而不是在 spec 文件的 %prep%build 部分中配置它们。

lua-native 宏集成

嵌入的 Lua 解释器已更新,使其包含以下改进:

  • 通过 Lua 表轻松访问选项和参数。

    在以前的版本中,您必须使用 rpm.expand () 函数来访问 parametric Lua 宏的选项和参数。在这个版本中,这些宏分别接收其选项和参数作为 optarg 本地表。

  • 全局宏上下文.

    宏现在可以通过全局 Lua 环境中的 表访问。此表还可用于调用 parametric 宏,包括所有内置宏。

  • RPM 版本对象和 I/O 流的新绑定。

    现在,您可以使用新的 rpm.ver () 函数从 RPM 版本字符串创建对象。您可以使用这些对象执行以下操作:

    • 分别通过 evr 字段获取个别预先解析的 EVR 组件。
    • RPM 版本字符串相互比较。

    您还可以使用新的 rpm.open () 函数打开使用 RPM 的 I/O 功能的文件流,如透明压缩和解压缩。

如需更多信息,请参阅 RPM 中的 Lua

用于在 Lua 中实施方便字符串操作的新宏

现在,您可以使用 RPM 宏执行基本字符串操作,如提取子字符串或获取长度,而无需执行 shell 子进程。如需更多信息,请参阅 字符串操作

内置和用户定义的宏的统一调用惯例

用于调用宏的 %foo arg, %{foo arg} , 和 %{foo:arg} 表示法现在等效。但请注意,可能仍存在细微的例外和不同之处。

多个新内置宏

现在提供了多个新的内置宏,最重要的是:

  • %{rpmversion} 用于获取系统上安装的 RPM 版本。
  • %{exists:…​} 用于测试文件的存在。
  • %{shescape:…​} 用于用单引号('')包括字符串,以便在需要单个参数的 shell 命令中使用。

新的 %preuntrans%postuntrans scriptlets

%preuntrans%postuntrans uninstall-time scriptlets 补充现有的安装时 %pretrans%posttrans scriptlets:

  • %preuntrans scriptlets 将在此事务要删除的软件包的事务之前执行。
  • %postuntrans scriptlets 将在此事务删除的软件包的事务后执行。

支持使用 Sequoia PGP 签名软件包的支持作为技术预览提供

将 RPM 配置为使用 Sequoia PGP 的 macros.rpmsign-sequoia 宏文件,而不是 GnuPG 用于签名软件包,现在作为技术预览提供。要启用其用法,请执行以下步骤:

  1. 安装以下软件包:

    # dnf install rpm-sign sequoia-sq
    Copy to Clipboard Toggle word wrap
  2. macros.rpmsign-sequoia 文件复制到 /etc/rpm/ 目录中:

    $ cp /usr/share/doc/rpm/macros.rpmsign-sequoia /etc/rpm/
    Copy to Clipboard Toggle word wrap

21.3.3. 其他显著变化

用户和组群名称解析现在严格本地

安装软件包时,RPM 现在从本地系统上的 passwd (5)group (5) 文件中分别获取有关用户和组的信息,而不是使用名称服务切换(NSS)。

在构建软件包时,%defattr 指令现在将用户和组属性的短划线(-)占位符解释为 root,而不是从磁盘获取实际所有权的信息。同样,源 RPM 软件包中的文件(如 spec 文件、源存档或补丁文件)现在始终归 root 用户和组所有,无论它们在磁盘上所有权如何。

现在,构建树(%_builddir)会在成功构建后默认删除

在以前的版本中,rpmbuild (8) 仅在- rebuild 模式中清理构建目录,而不在更常用的模式中,如 -bb。因此,要构建多个软件包会导致随时间对文件进行不必要的累积。在这个版本中,如果您总是保留构建树,例如,要调查非严重的构建问题,您可以使用-- noclean 选项。

%patch 指令现在必须明确指定要应用的补丁号

您可以通过以下任一方式指定补丁号:

  • 通过使用 -P 选项,例如 %patch -P1 -P2 以应用补丁号 1 和 2。
  • 通过将补丁号作为位置参数传递,例如 %patch 1 2 以应用补丁号 1 和 2。
重要

%patchN 语法(其中 N 是要应用的补丁号)现已弃用。

注意

如果没有使用 %patch 指令指定显式补丁号,则构建会终止并显示错误。

注意

建议您尽可能使用 %autosetup 宏,而不是使用 %patch 指令手动应用单独的补丁。当您使用 %autosetup 时,补丁会按照其补丁号标识的顺序自动应用。因此,spec 文件更易于读取和维护。如需更多信息,请参阅 自动补丁应用程序

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat