目录
- [RPM 简介](#RPM 简介)(含 [为什么要 RPM?](#为什么要 RPM?))
- [RPM 架构与工作原理](#RPM 架构与工作原理)
- [RPM 基础命令](#RPM 基础命令)
- [RPM SPEC 文件详解](#RPM SPEC 文件详解)
- [构建 RPM 包](#构建 RPM 包)
- [RPM 高级特性](#RPM 高级特性)
- [RPM 软件源与仓库元数据](#RPM 软件源与仓库元数据)
- 文件触发器
- [RPM 版本演进](#RPM 版本演进)
RPM 简介
什么是 RPM?
RPM (RPM Package Manager) 是一个强大的包管理系统,最初由 Red Hat 开发,现已成为 Linux 发行版(如 Red Hat Enterprise Linux、Fedora、CentOS、openSUSE 等)的标准包管理格式。
RPM 具有以下核心能力:
- 构建:将源代码打包成易于分发的软件包
- 安装/更新/卸载:管理已打包软件的生命周期
- 查询:获取软件包的详细信息
- 验证:检查软件包和安装的完整性
为什么要 RPM?
相比「直接下载源码编译」或「拷贝压缩包解压」,使用 RPM 能带来可依赖、可追溯、可复现的软件交付与运维体验。
1. 相比源码/压缩包的不足
| 方式 | 常见问题 |
|---|---|
| 源码编译 | 依赖要自己装、版本易冲突;装在哪、装了什么没有统一记录;卸载靠手动删;多台机器重复编译、环境不一致 |
| tar.gz 解压 | 没有依赖声明,缺库运行时才报错;升级/回滚困难;无法用系统工具统一查询「装了哪些软件、哪些文件属于谁」 |
RPM 通过元数据(依赖、文件列表、版本、脚本)和包数据库,把「装了什么、依赖谁、文件在哪」固化在系统里,便于自动化与排查。
2. 使用 RPM 能带来什么
- 依赖管理:包声明 Requires/Provides,DNF/Yum 自动解决依赖并一次装齐,避免「缺库再补」的反复试错。
- 可查询、可验证 :
rpm -qa、rpm -ql、rpm -qf可查已装包、包内文件、文件归属;rpm -V可检查文件是否被篡改或缺失。 - 可重复的安装与升级 :同一份
.rpm在多台机器上安装结果一致;升级、降级、回滚有明确版本边界(NVR),便于标准化运维。 - 可审计与合规:谁装的、装了什么版本、是否签名,有记录可查;企业策略可基于仓库与签名做统一管控。
- 自动化与规模化:配合仓库(repodata)和 DNF/Yum,可批量安装、批量更新、按组管理,适合服务器集群与 CI/CD 交付。
3. 典型使用场景
| 场景 | 为什么用 RPM |
|---|---|
| 企业内网/离线环境 | 自建仓库统一分发,版本与依赖可控,不依赖外网随机下载 |
| 多台服务器一致环境 | 同一批 RPM 保证二进制与路径一致,减少「在我机器上能跑」类问题 |
| 合规与安全 | 只允许安装经过审批、签名的包;漏洞修复通过新版本 RPM 下发,可追溯 |
| 应用/中间件交付 | 将自研或第三方软件打成 RPM,与系统包一样用 dnf install 部署,便于与系统升级一起管理 |
| 操作系统与发行版 | RHEL、Fedora、openSUSE 等以 RPM 为底座,掌握 RPM 即掌握这些系统的软件生命周期 |
总结:RPM 把「软件是什么、依赖谁、装到哪、怎么装/卸」标准化成包+元数据+数据库,让安装、升级、回滚和审计都可在同一套机制下完成,这是选用 RPM 而不是「随便一个压缩包」的核心原因。
RPM 的历史发展
1997 RPM 2.0 发布 Red Hat 采用为默认包管理器 1999 RPM 3.0 发布 引入更强的依赖管理 2002 RPM 4.0 发布 引入新的包格式和特性 2011 RPM 4.10 发布 增强安全性和性能 2020 RPM 4.20 发布 声明式构建系统支持 2025 RPM 6.0 发布 支持 v6 包格式、OpenPGP v6 签名 RPM 发展历史
RPM vs 其他包管理器
| 特性 | RPM | DEB | APK |
|---|---|---|---|
| 使用发行版 | RHEL, Fedora, openSUSE | Debian, Ubuntu | Alpine |
| 包格式 | .rpm | .deb | .apk |
| 依赖解析 | 需额外工具 (yum/dnf) | 内置 (apt) | 内置 |
| 构建工具 | rpmbuild | debuild | abuild |
RPM 官方能力总结(来源:rpm.org)
根据 rpm.org 官方说明,RPM 作为包管理系统的核心能力包括:
- 验证(Verify):验证打包软件及安装结果的完整性
- 查询(Query):获取已安装或未安装包的详细信息
- 安装 / 更新 / 卸载(Install, Update, Uninstall):管理打包软件的生命周期
- 构建(Build):从源码构建易于分发的软件包
RPM 支持将软件发布到仓库、验证软件完整性、使用 rpmbuild 等工具创建包,并与 DNF/Yum/PackageKit 等标准工具配合使用。
核心概念术语表
| 术语 | 英文 | 说明 |
|---|---|---|
| NVR | Name-Version-Release | 包的核心标识:名称、上游版本号、打包发布号,如 nginx-1.24.0-1.el8 |
| Epoch | Epoch | 版本比较时的「纪元」整数,数值越大版本越新;未写时默认为 0,用于解决版本号格式变更导致的排序问题 |
| Payload | Payload | RPM 包中的实际内容,通常为 cpio 归档,包含要安装的文件 |
| Header | Header | 包的元数据区,包含依赖、安装路径、文件列表、脚本等,供查询与安装决策使用 |
| SRPM | Source RPM | 源码包(.src.rpm),包含源码、SPEC 文件、补丁及构建说明,用于生成二进制 RPM |
| Provides | Provides | 包提供的「能力」或虚拟名,可被其他包的 Requires 匹配,如 Provides: /bin/sh、Provides: lda |
| Requires | Requires | 强依赖:声明需要某包或某能力已安装,不满足则无法安装 |
| Obsoletes | Obsoletes | 废弃关系:安装带有 Obsoletes 的包时,RPM 会视其为更新并移除被废弃的包(与 updater 协同) |
| Conflicts | Conflicts | 冲突:与某包不能同时安装;双向检查 |
| 弱依赖 | Weak dependencies | 由依赖求解器使用、不强制安装的依赖,包括 Recommends、Suggests、Supplements、Enhances |
| repodata | Repository metadata | 仓库元数据,由 createrepo 等工具生成,供 DNF/Yum 解析依赖与检索包 |
| Scriptlet | Scriptlet | 在安装/卸载/事务的特定阶段执行的脚本片段,如 %pre、%post、%filetriggerin |
RPM 架构与工作原理
RPM 包结构
RPM 包本质上是一个 cpio 归档文件,包含元数据头部和实际文件内容:
RPM 包文件
RPM 头部
元数据
签名区
PGP/GPG
负载
cpio 归档
包名称/版本/发布号
依赖关系
文件列表
脚本指令
实际文件
配置文件
文档文件
RPM 包类型
RPM 包类型
源码 RPM
SRPM
二进制 RPM
.src.rpm 文件
包含: 源代码
包含: SPEC 文件
包含: 补丁文件
架构相关
.x86_64.rpm
架构无关
.noarch.rpm
编译后的二进制文件
RPM 工作空间目录结构
构建 RPM 包需要特定的目录结构:
| 目录 | 用途 |
|---|---|
BUILD/ |
编译软件时使用的工作目录 |
RPMS/ |
生成的二进制 RPM 包存放位置 |
SOURCES/ |
存放原始源代码压缩包和补丁 |
SPECS/ |
存放 SPEC 控制文件 |
SRPMS/ |
生成的源码 RPM 包存放位置 |
RPM 基础命令
安装和升级操作
安装新包
升级包
降级包
RPM 安装/升级
操作类型
rpm -ivh
rpm -Uvh
rpm -Uvh --oldpackage
显示进度条
显示详细信息
| 命令 | 描述 | 示例 |
|---|---|---|
rpm -ivh package.rpm |
安装包 | rpm -ivh nginx-1.0.rpm |
rpm -Uvh package.rpm |
升级包 | rpm -Uvh nginx-1.1.rpm |
rpm -e package |
删除/擦除包 | rpm -e nginx |
rpm -ivh --test package.rpm |
测试安装,不实际执行 | rpm -ivh --test nginx.rpm |
查询操作
已安装包
包详情
包文件列表
文件所属包
包依赖
rpm -q 查询命令
查询目标
rpm -qa
rpm -qi
rpm -ql
rpm -qf
rpm -qR
列出所有已安装包
显示包的详细信息
列出包包含的所有文件
查找文件属于哪个包
显示包的依赖关系
| 命令 | 描述 | 示例 |
|---|---|---|
rpm -qa |
列出所有已安装的包 | `rpm -qa |
rpm -qi package |
显示包的详细信息 | rpm -qi nginx |
rpm -ql package |
列出包包含的所有文件 | rpm -ql nginx |
rpm -qf /path/to/file |
查找文件属于哪个包 | rpm -qf /usr/bin/nginx |
rpm -qc package |
列出包的配置文件 | rpm -qc nginx |
rpm -qd package |
列出包的文档文件 | rpm -qd nginx |
rpm -qR package |
显示包的依赖关系 | rpm -qR nginx |
rpm -qa --last |
按安装时间列出包 | `rpm -qa --last |
验证操作
| 命令 | 描述 | 示例 |
|---|---|---|
rpm -V package |
验证已安装的包 | rpm -V nginx |
rpm -Va |
验证所有已安装的包 | rpm -Va |
rpm -Vp package.rpm |
验证未安装的包 | rpm -Vp nginx.rpm |
验证输出字符含义:
.= 测试通过5= MD5 校验不同S= 文件大小不同L= 符号链接改变T= 文件时间戳不同D= 设备文件改变U= 用户所有者改变G= 组所有者改变M= 权限改变?= 不可读文件
签名和导入操作
| 命令 | 描述 | 示例 |
|---|---|---|
rpm --import KEYFILE |
导入 GPG 密钥 | rpm --import RPM-GPG-KEY-redhat |
rpm -K package.rpm |
检查包签名 | rpm -K nginx.rpm |
rpm -Kv package.rpm |
详细检查包签名 | rpm -Kv nginx.rpm |
RPM SPEC 文件详解
SPEC 文件概述
SPEC 文件是 RPM 包的"配方",描述了如何从源代码构建二进制包。
SPEC 文件结构
Preamble
序言部分
Body
主体部分
Name, Version, Release
Summary, License, URL
Source0, Patch0
BuildRequires, Requires
%description
%prep
%build
%install
%files
%changelog
Preamble(序言)部分
序言包含包的基本元数据:
| 标签 | 描述 | 示例 |
|---|---|---|
Name |
包的基础名称 | Name: nginx |
Version |
上游版本号 | Version: 1.24.0 |
Release |
打包发布号 | Release: 1%{?dist} |
Summary |
简短描述 | Summary: High performance web server |
License |
许可证 | License: GPLv2+ |
URL |
项目主页 | URL: https://nginx.org |
Source0 |
源码地址 | Source0: https://nginx.org/download/nginx-%{version}.tar.gz |
Patch0 |
补丁文件 | Patch0: nginx-fix.patch |
BuildRequires |
构建依赖 | BuildRequires: gcc, make |
Requires |
运行依赖 | Requires: openssl-libs |
BuildArch |
构建架构 | BuildArch: noarch |
NVR(Name-Version-Release):RPM 包的核心标识符
nginx-1.24.0-1.el8.x86_64.rpm
nginx
Name
1.24.0
Version
1.el8
Release
x86_64
Architecture
Epoch(纪元)与版本比较
完整依赖版本语法为 [epoch:]version[-release]:
- Epoch :可选整数,默认为 0;在版本比较中权重最高,用于在版本号格式发生断裂时仍能正确排序(例如从
2.1.7a改为日期格式时)。 - Version :必填,不能包含
-,一般由上游维护。 - Release :可选,不能包含
-;每次重新打包(如改 SPEC、编译器、依赖)都应递增,用于区分同一版本的不同构建。
示例:Requires: perl >= 9:5.00502-3 表示需要 epoch=9、version=5.00502、release=3 及以上的 perl。RPM 使用 rpmvercmp() 进行分段比较(按数字/字母段),不要依赖其内部细节,建议使用简单的主.次.补丁数字格式。
Body(主体)部分
%description - 详细描述
spec
%description
Nginx is a web server and a reverse proxy server for HTTP, HTTPS,
SMTP, POP3 and IMAP protocols, with a strong focus on high concurrency,
performance and low memory usage.
%prep - 准备阶段
%prep 阶段
清理旧构建
解压源码
应用补丁
rm -rf $RPM_BUILD_DIR/*
%setup -q
%patch0 -p1
spec
%prep
%autosetup -p1 # 自动解压并应用补丁
# 或者手动方式
# %setup -q
# %patch0 -p1
%build - 构建阶段
spec
%build
%configure
make %{?_smp_mflags}
%install - 安装阶段
%install 阶段
创建目录
安装文件到 buildroot
设置权限
mkdir -p
make install
或 install 命令
chmod
spec
%install
rm -rf %{buildroot}
%make_install
# 或手动安装
mkdir -p %{buildroot}%{_bindir}
install -m 0755 myapp %{buildroot}%{_bindir}/myapp
%files - 文件列表
%files 部分
特殊指令
文件路径
%doc
文档
%license
许可证
%config
配置文件
%attr
属性设置
绝对路径或宏
spec
%files
%license LICENSE
%doc README.md CHANGELOG.md
%config(noreplace) %{_sysconfdir}/nginx/nginx.conf
%{_bindir}/nginx
%{_mandir}/man8/nginx.8*
%changelog - 变更日志
spec
%changelog
* Wed Jan 15 2025 John Doe <john@example.com> - 1.24.0-1
- Update to upstream version 1.24.0
- Add new feature
* Mon Dec 01 2024 John Doe <john@example.com> - 1.22.0-2
- Fix security issue CVE-2024-12345
RPM 常用宏
| 宏 | 展开值 | 用途 |
|---|---|---|
%{name} |
包名称 | 引用包名 |
%{version} |
版本号 | 引用版本 |
%{release} |
发布号 | 引用发布号 |
%{_bindir} |
/usr/bin |
二进制文件目录 |
%{_sbindir} |
/usr/sbin |
系统二进制目录 |
%{_libdir} |
/usr/lib64 |
库文件目录 |
%{_sysconfdir} |
/etc |
配置文件目录 |
%{_datadir} |
/usr/share |
数据文件目录 |
%{_mandir} |
/usr/share/man |
手册目录 |
%{buildroot} |
构建根目录 | 安装目标 |
%{?dist} |
发行版标签 | .el8, .fc40 等 |
宏定义与条件展开(来源:rpm.org Macros)
- 定义 :
%define NAME BODY:局部宏,仅在当前 SPEC 上下文中展开;BODY 在每次展开时重新求值。%global NAME BODY:全局宏,BODY 在定义时求值一次,之后展开结果一致。
- 展开形式 :
%NAME或%{NAME}:展开宏 NAME。%{?NAME}:若 NAME 已定义则展开,否则为空(常用于可选 dist、可选参数)。%{!?NAME: BODY}:若 NAME 未定义则展开 BODY。
- 参数宏 :
%NAME [OPTIONS] [ARGUMENTS]形式可带参数,如%setup -q、%patch0 -p1。
%prep 中常用:%setup(解压源码)、%autosetup(解压并应用补丁)、%patch(应用补丁)。
构建 RPM 包
构建流程概览
构建 SRPM
构建二进制 RPM
同时构建
开始
准备构建环境
设置 rpmbuild 目录
放置源码和补丁
创建 SPEC 文件
构建类型
rpmbuild -bs
rpmbuild -bb
rpmbuild -ba
SRPM 输出
二进制 RPM 输出
SRPM + 二进制 RPM 输出
质量检查 rpmlint
完成
设置构建环境
bash
# 安装必要的工具
sudo dnf install rpmdevtools rpmbuild
# 创建构建目录结构
rpmdev-setuptree
# 查看目录结构
tree ~/rpmbuild/
构建 Source RPM
bash
# 从 SPEC 文件构建 SRPM
rpmbuild -bs package.spec
# 输出到 ~/rpmbuild/SRPMS/
构建二进制 RPM
bash
# 从 SRPM 重建
rpmbuild --rebuild package.src.rpm
# 从 SPEC 文件构建
rpmbuild -bb package.spec
# 同时构建 SRPM 和二进制 RPM
rpmbuild -ba package.spec
# 只执行到指定阶段
rpmbuild -bp package.spec # 只到 %prep
rpmbuild -bc package.spec # 只到 %build (执行 %prep, %build)
质量检查 - rpmlint
rpmlint 检查
检查对象
SPEC 文件
SRPM
二进制 RPM
语法检查
规范合规
签名验证
完整性检查
文件清单
依赖解析
文件系统层次标准
报告: 错误/警告
bash
# 检查 SPEC 文件
rpmlint package.spec
# 检查 SRPM
rpmlint package.src.rpm
# 检查二进制 RPM
rpmlint package-1.0-1.x86_64.rpm
# 详细输出
rpmlint -i package.rpm
RPM 高级特性
Scriptlets(脚本片段)
Scriptlets 是在包安装/卸载过程中执行的脚本:
Scriptlet RPM 用户/系统 Scriptlet RPM 用户/系统 安装过程 卸载过程 rpm -ivh package.rpm %pre (安装前脚本) 返回 解压文件 %post (安装后脚本) 返回 安装完成 rpm -e package %preun (卸载前脚本) 返回 删除文件 %postun (卸载后脚本) 返回 卸载完成
| Scriptlet | 执行时机 |
|---|---|
%pre |
安装前 |
%post |
安装后 |
%preun |
卸载前 |
%postun |
卸载后 |
%pretrans |
事务开始前 |
%posttrans |
事务结束后 |
spec
%post
/bin/systemctl daemon-reload
/bin/systemctl enable nginx.service >/dev/null 2>&1 || :
%preun
if [ $1 -eq 0 ]; then
/bin/systemctl --no-reload disable nginx.service >/dev/null 2>&1 || :
/bin/systemctl stop nginx.service >/dev/null 2>&1 || :
fi
%postun
/bin/systemctl daemon-reload >/dev/null 2>&1 || :
if [ $1 -ge 1 ]; then
/bin/systemctl try-restart nginx.service >/dev/null 2>&1 || :
fi
Triggers(触发器)
触发器允许在特定事件发生时执行脚本:
spec
# 当安装 perl 包时触发
%triggerin -- perl
# 执行某些操作
# 当卸载 perl 包时触发
%triggerun -- perl
# 执行某些操作
# 当升级 perl 包时触发
%triggerpostun -- perl
# 执行某些操作
文件属性特殊指令
文件属性指令
%config
%doc
%license
%attr
%verify
%ghost
配置文件
升级时保留修改
文档文件
许可证文件
设置权限/所有者
验证时跳过
幽灵文件
由运行时创建
spec
%files
%config(noreplace) %{_sysconfdir}/myapp.conf
%config %{_sysconfdir}/myapp.conf.dist
%doc README.md
%license LICENSE
%attr(0755, root, root) %{_bindir}/myapp
%ghost %{_localstatedir}/lib/myapp/database
%verify(not size mtime md5) /var/log/myapp/*
依赖处理
依赖类型
Requires
Provides
Obsoletes
Conflicts
声明依赖
声明提供的功能
声明废弃的包
声明冲突的包
spec
# 基本依赖
Requires: bash >= 4.2
# 条件依赖
Requires: python3 >= 3.6
Requires: python3-libs = %{python3_version}
# 构建依赖
BuildRequires: gcc, make
# 提供的功能
Provides: myapp = %{version}-%{release}
# 废弃其他包
Obsoletes: oldapp < 2.0
# 冲突声明
Conflicts: otherapp < 1.0
弱依赖(Weak Dependencies)
RPM 本身不强制 满足弱依赖,它们由 DNF/Yum 等依赖求解器使用:求解器会尽量满足,若导致无法求解则忽略且不报错。适用于「推荐」「建议」类依赖。
| 类型 | 方向 | 含义 |
|---|---|---|
| Recommends | 正向 | 弱依赖:建议同时安装某包/某能力,不满足不报错 |
| Suggests | 正向 | 极弱依赖:仅作提示,求解器默认可忽略 |
| Supplements | 反向 | 当「被补充」的包被选中时,本包可被一并选中 |
| Enhances | 反向 | 与 Supplements 类似,极弱 |
正向即「本包建议/提示需要某包」;反向即「当某包被安装时,可顺带选上本包」。例如:A 声明 Recommends: B 与 B 声明 Supplements: A 在「安装 A 时顺带选 B」上效果等价(由求解器处理)。
spec
Recommends: python3-pip
Suggests: myapp-docs
Supplements: (foo and (lang-support-cz or lang-support-all))
布尔依赖(RPM 4.13+)
所有依赖类型(Requires、Recommends、Suggests、Supplements、Enhances、Conflicts)均可使用布尔表达式,用括号包裹:
| 运算符 | 含义 | 示例 |
|---|---|---|
or |
满足其一即可 | Requires: (pkgA or pkgB) |
and |
全部满足 | Conflicts: (pkgA and pkgB) |
if |
若第二项满足则需第一项 | Requires: (pkgA if pkgB) |
if else |
若第二项满足需第一项,否则需第三项 | Requires: (mariaDB if db else sqlite) |
unless |
若第二项未满足则第一项需满足 | Conflicts: (driverA unless driverB) |
with |
同一包同时满足多项 | Requires: (pkgA-foo with pkgA-bar) |
without |
满足第一项但不满足第二项 | Requires: (pkgA-foo without pkgA-bar) |
注意:Provides 不能使用布尔表达式 ;if 不能与 or 混用,unless 不能与 and 混用。
spec
Requires: (pkgA or (pkgB and pkgC))
Requires: (myPkg-backend-mariaDB if mariaDB else sqlite)
脚本依赖(Scriptlet Dependencies)
仅在安装/卸载的某一阶段需要的依赖,可写成 Requires(阶段):,例如:
spec
Requires(pre): /usr/sbin/useradd
表示在 %pre 执行前必须已安装提供 /usr/sbin/useradd 的包。这样既保证顺序(在存在依赖环时有用),也允许在安装完成后移除该包(若没有其他依赖)。注意:PreReq 与 Requires(pre) 语义不同,不能简单替换。
自动依赖
- 共享库 :构建时 RPM 会对包内可执行文件运行
ldd,自动为所需共享库添加 Requires;对包内库文件根据 soname 自动添加 Provides。 - 解释器/模块 :Perl、Python 等有各自的依赖生成器,会为脚本和模块生成如
perl(MIME-Base64)、python3.11dist(requests)等 Requires/Provides。
可通过 Dependency Generators 自定义或禁用自动依赖。
构建时依赖
仅在打包时需要、不进入二进制包依赖的标签:
| 标签 | 说明 |
|---|---|
BuildRequires |
构建依赖,会写入 SRPM 的 Requires,不写入二进制 RPM |
BuildConflicts |
构建时不能安装的包 |
BuildPreReq |
构建时需优先满足的依赖(顺序敏感) |
RPM 软件源与仓库元数据
概念
RPM 仓库 是放有若干 .rpm 文件及元数据的目录或 HTTP/FTP 服务。客户端(DNF/Yum)通过元数据解析依赖、检索包,而不必下载所有包再解析。
repodata 与 createrepo
| 概念 | 说明 |
|---|---|
| repodata | 仓库元数据目录,通常包含 repomd.xml、primary.xml.gz、filelists.xml.gz、other.xml.gz 等 |
| repomd.xml | 元数据索引:列出各 XML 文件及其校验和、时间戳,便于增量更新与签名 |
| primary.xml.gz | 主元数据:包名、版本、依赖、Provides、文件列表、描述等 |
| createrepo | 根据目录中的 RPM 包生成 repodata(repomd 格式)的工具,供 Yum/DNF 使用 |
bash
# 安装 createrepo(或 createrepo_c)
sudo dnf install createrepo_c
# 对包含 .rpm 的目录生成元数据
createrepo /path/to/rpms
# 仅更新有变化的包,加快后续生成
createrepo --update /path/to/rpms
常用选项:-s/--checksum 指定校验和类型(默认 sha256)、-g/--groupfile 指定 comps 组、--cachedir 缓存以加速重复运行。
文件触发器(File Triggers)
文件触发器是按路径前缀匹配的脚本:当安装/卸载的文件与声明的路径前缀匹配时,在事务的特定阶段执行。用于在「某类文件被安装或删除」时做统一处理(如更新索引、注册服务)。
类型(来源:rpm.org 手册)
| 类型 | 执行时机 | 作用范围 |
|---|---|---|
%filetriggerin |
安装后,若本包有文件匹配前缀 | 每包一次 |
%filetriggerun |
卸载前,若本包有文件匹配前缀 | 每包一次 |
%filetriggerpostun |
卸载后,若本包有文件匹配前缀 | 每包一次 |
%transfiletriggerin |
事务中所有匹配的包安装完成后 | 每事务一次 |
%transfiletriggerun |
事务中将要卸载的匹配包处理前 | 每事务一次 |
%transfiletriggerpostun |
事务中匹配包卸载完成后 | 每事务一次 |
语法示例:
spec
%filetriggerin -P 1000000 -- /etc/ld.so.conf.d
/bin/ldconfig
%filetriggerpostun -P 1000000 -- /etc/ld.so.conf.d
/bin/ldconfig
-P 为优先级(数值越大越先执行);匹配到的文件路径会传入脚本的标准输入。注意:存在已知问题,某些场景下 %transfiletriggerpostun 可能不执行,可参考 rpm.org File triggers。
RPM 版本演进
RPM 6.0.0 新特性 (2025)

版本历史
| 版本 | 发布日期 | 主要特性 |
|---|---|---|
| RPM 6.0.1 | 2025-12 | 修复 6.0.0 回归问题 |
| RPM 6.0.0 | 2025-09 | v6 包格式、OpenPGP v6、强制签名检查 |
| RPM 4.20.1 | 2025-02 | Bug 修复版本 |
| RPM 4.20.0 | 2024-10 | 声明式构建系统、动态 spec 改进 |
| RPM 4.19.0 | 2023-06 | Rich 依赖、增强的插件 API |
| RPM 4.18.0 | 2022-05 | Python 3 支持、增强的文件触发器 |
| RPM 4.17.0 | 2021-06 | 新的包布局、增强的安全性 |
| RPM 4.16.0 | 2020-06 | Lua 5.3、增强的宏语言 |
RPM 4.20 声明式构建与动态 SPEC(简述)
- 声明式构建(Declarative build system) :在 SPEC 中通过声明式方式描述构建步骤,减少手写 %build/%install 脚本,便于复用与维护。详见 rpm.org Build system。
- 动态 SPEC(Dynamic spec) :支持在构建时根据条件生成或修改 SPEC 内容,适合多子包、多架构等场景。详见 rpm.org Dynamic specs。
参考资料
官方与规范
- RPM 官方网站 --- 发布说明、下载、时间线
- RPM 官方手册(rpm-software-management.github.io) --- Spec、宏、依赖、触发器、构建系统等
- RPM Packaging Guide --- 打包实践
- Maximum RPM Documentation --- 经典参考
- Red Hat 打包与分发文档 --- RHEL 8
- createrepo / repodata --- 仓库元数据