📦 RPM 包管理从入门到实战:一篇真正“能打包”的学习笔记

217 阅读3分钟

很多人会用 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

行为等价于:

  1. 解包 SRPM
  2. 执行 spec 构建
  3. 保留 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

参数解释:

参数含义
-iinstall
-vverbose
-hhash 进度条

⚠️ 注意:

  • 如果已安装同名包 → 会报错
  • 升级请用 -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 的理解 直接上一个维度