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 宏的选项和参数。在这个版本中,这些宏分别接收其选项和参数作为opt
和arg
本地表。全局宏上下文.
宏现在可以通过全局 Lua 环境中的
宏
表访问。此表还可用于调用 parametric 宏,包括所有内置宏。RPM 版本对象和 I/O 流的新绑定。
现在,您可以使用新的
rpm.ver ()
函数从 RPM 版本字符串创建对象。您可以使用这些对象执行以下操作:-
分别通过
e
、v
和r
字段获取个别预先解析的 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 用于签名软件包,现在作为技术预览提供。要启用其用法,请执行以下步骤:
安装以下软件包:
dnf install rpm-sign sequoia-sq
# dnf install rpm-sign sequoia-sq
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
macros.rpmsign-sequoia
文件复制到/etc/rpm/
目录中:cp /usr/share/doc/rpm/macros.rpmsign-sequoia /etc/rpm/
$ cp /usr/share/doc/rpm/macros.rpmsign-sequoia /etc/rpm/
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
文件更易于读取和维护。如需更多信息,请参阅 自动补丁应用程序。