很多人会用 RPM,
但很少人真正 “理解 RPM 是怎么来的” 。这篇文章不是教你装包,而是教你:
👉 一个 RPM 是如何被构建、重建、签名、验证的。
🧠 一、RPM 是什么?它解决了什么问题?
RPM(Red Hat Package Manager)是 基于二进制包的软件分发体系,核心解决三件事:
1️⃣ 软件如何 安装 / 卸载 / 升级
2️⃣ 软件如何 可重建(Reproducible)
3️⃣ 软件如何 被信任(签名与校验)
在 RPM 世界里,软件不是“随便编译的结果”,而是:
源码 + spec 描述文件 + 可验证构建流程
🧱 二、RPM 的两种形态:SRPM vs Binary RPM
1️⃣ Binary RPM(二进制包)
文件名示例:
cello-1.0-1.el10.x86_64.rpm
特点:
- 可直接安装
- 不包含完整构建上下文
- 更偏向「使用者」
2️⃣ SRPM(Source RPM)
文件名示例:
cello-1.0-1.el10.src.rpm
SRPM 包含:
- 源码(Source)
- spec 文件(构建说明书)
- patch(如有)
👉 SRPM = 可重建软件的根源
📂 三、RPM 构建目录结构(非常重要)
默认在:
~/rpmbuild/
目录结构:
BUILD/ # 编译过程临时目录
BUILDROOT/ # 模拟安装根目录
RPMS/ # 生成的二进制 RPM
SOURCES/ # 源码、patch
SPECS/ # spec 文件
SRPMS/ # 生成的 SRPM
💡 所有 rpmbuild 操作,本质都是在操控这六个目录。
🧪 四、常用 RPM / RPBUILD 命令全解析(核心)
✅ 1️⃣ rpm -Uvh xxx.src.rpm
展开 SRPM
rpm -Uvh cello-1.0-1.el10.src.rpm
效果:
- spec →
SPECS/ - 源码 →
SOURCES/
📌 不会编译,只是“解包”
✅ 2️⃣ rpmbuild -ba
终极常用命令
rpmbuild -ba cello.spec
等价于:
用 spec + sources
👉 同时生成:
- Binary RPM
- SRPM
适合:
- 软件维护者
- 发行版打包流程
✅ 3️⃣ rpmbuild -bb
只生成二进制 RPM
rpmbuild -bb cello.spec
特点:
- 不生成 SRPM
- 构建速度更快
- 适合内部构建
✅ 4️⃣ rpmbuild --recompile xxx.src.rpm
展开 + 构建 + 保留源码
rpmbuild --recompile cello-1.0-1.el10.src.rpm
行为等价于:
- 解包 SRPM
- 执行 spec 构建
- 保留 BUILD / SOURCES / SPECS
📌 非常适合:
👉 学习 spec / 调试构建过程
✅ 5️⃣ rpmbuild --rebuild xxx.src.rpm
重建 RPM(干净模式)
rpmbuild --rebuild cello-1.0-1.el10.src.rpm
特点:
- 不保留源码
- 构建完成即清理
- 更接近 CI / 官方构建行为
✅ 6️⃣ rpm -ivh 安装 RPM
sudo rpm -ivh cello-1.0-1.el10.x86_64.rpm
参数解释:
| 参数 | 含义 |
|---|---|
| -i | install |
| -v | verbose |
| -h | hash 进度条 |
⚠️ 注意:
- 如果已安装同名包 → 会报错
- 升级请用
-U
📦 五、提取 RPM 内容(不安装)
有时候你只想看内容 👀
rpm2archive bash-4.4.19-6.el8.x86_64.rpm
生成:
bash-4.4.19-6.el8.x86_64.rpm.tgz
然后:
tar -xf bash-4.4.19-6.el8.x86_64.rpm.tgz
📌 非常适合:
- 学习文件布局
- 对比不同发行版差异
🔐 六、RPM 软件包签名(专业必备)
🎯 为什么要签名?
- 防止被篡改
- 建立软件信任链
- 发行版安全基础
1️⃣ 使用 GnuPG 签名 RPM
① 生成密钥
gpg --gen-key
gpg --list-keys
② 导出公钥
gpg --export -a '<key-name>' > RPM-GPG-KEY-pmanager
③ 配置 rpmbuild
%_gpg_name <key-ID>
④ 签名 RPM
rpmsign --addsign package.rpm
⑤ 导入并验证
rpmkeys --import RPM-GPG-KEY-pmanager
rpm -Kv package.rpm
2️⃣ 使用 Sequoia PGP(新一代)
sq key generate --own-key --userid <key_name>
📌 越来越多新项目开始用 Sequoia 替代传统 GnuPG。
🧠 七、RPM 的设计哲学(重点理解)
RPM 并不是:
“我编完给你一个包”
而是:
我给你一个「可验证、可重建、可审计」的软件工厂说明书
这也是为什么:
- spec 文件极其重要
- SRPM 比 binary RPM 更“高级”
- 发行版信任的是 构建过程,不是结果
🎯 八、学习 RPM 后,你会真正理解什么?
✔ 软件是如何被“标准化交付”的
✔ 发行版是如何保证安全的
✔ CI / 构建系统在做什么
✔ spec ≈ Linux 世界的“软件说明书”
✨ 写在最后
LFS 教你 Linux 是怎么“造出来的”
RPM 教你软件是怎么“被交付的”
两者结合,你会对 Linux 的理解 直接上一个维度。