使用 yum/dnf 下载 SRPM 并 rpmbuild 重建 RPM(以 compat-openssl10 为例)
1. 目的
在无法直接安装目标 RPM(或需要适配架构/系统)的情况下,通过下载 SRPM(源码包),使用 rpmbuild 在本机重建二进制 RPM,然后本地安装。
本文示例包:compat-openssl10-1.0.2o-3.el8(aarch64)
2. 适用环境
- CentOS/RHEL 8.x / Rocky / Alma 等(带 dnf)
- 需要具备 rpmbuild 编译环境
- 需要能访问对应的源(示例使用 CentOS Vault)
如果你是 CentOS 7(yum),整体思路相同,命令会略有差异(例如 dnf builddep 用 yum-builddep)。
3. 前置准备
3.1 安装 rpmbuild 工具链
# CentOS/RHEL 8+
sudo dnf install -y rpm-build rpmdevtools gcc make redhat-rpm-config
3.2 初始化 rpmbuild 目录
# 会创建 ~/rpmbuild/…
rpmdev-setuptree
4. 操作步骤
4.1 下载 SRPM
# 下载 compat-openssl10 源码(SRPM)
wget http://vault.centos.org/8.5.2111/AppStream/Source/SPackages/compat-openssl10-1.0.2o-3.el8.src.rpm
4.2 生成二进制 RPM
# 重建:会解包 SRPM -> 安装到 rpmbuild 结构 -> 编译 -> 输出 RPM
rpmbuild --rebuild --clean compat-openssl10-1.0.2o-3.el8.src.rpm
# 编译
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Recommends: compat-openssl10-debugsource(aarch-64) = 1:1.0.2o-3.ky10.ky10
处理文件:compat-openssl10-debugsource-1.0.2o-3.ky10.ky10.aarch64
Provides: compat-openssl10-debugsource = 1:1.0.2o-3.ky10.ky10 compat-openssl10-debugsource(aarch-64) = 1:1.0.2o-3.ky10.ky10
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/compat-openssl10-1.0.2o-3.ky10.ky10.aarch64
已写至:/root/rpmbuild/RPMS/aarch64/compat-openssl10-1.0.2o-3.ky10.ky10.aarch64.rpm
已写至:/root/rpmbuild/RPMS/aarch64/compat-openssl10-debuginfo-1.0.2o-3.ky10.ky10.aarch64.rpm
已写至:/root/rpmbuild/RPMS/aarch64/compat-openssl10-debugsource-1.0.2o-3.ky10.ky10.aarch64.rpm
正在执行(%clean):/bin/sh -e /var/tmp/rpm-tmp.68Bwes
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd openssl-1.0.2o
+ /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/compat-openssl10-1.0.2o-3.ky10.ky10.aarch64
+ RPM_EC=0
++ jobs -p
+ exit 0
正在执行(--clean):/bin/sh -e /var/tmp/rpm-tmp.q3tzLR
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf openssl-1.0.2o
+ RPM_EC=0
++ jobs -p
+ exit 0
4.3 常见问题:
构建依赖失败(BuildRequires 缺失), 如果你在 rebuild 时看到类似:
错误:构建依赖失败:xxx is needed by compat-openssl10…
说明 spec 文件声明的编译依赖包没装齐
。
4.3.1 用 builddep 自动安装依赖
# 先安装 dnf builddep 支持(部分系统已自带)
sudo dnf install -y dnf-plugins-core
# 方式1:先安装 SRPM,再对 spec 做 builddep
rpm -ivh compat-openssl10-1.0.2o-3.el8.src.rpm
sudo dnf builddep -y ~/rpmbuild/SPECS/compat-openssl10.spec
然后再重新 rebuild:
rpmbuild --rebuild --clean compat-openssl10-1.0.2o-3.el8.src.rpm
4.3.2 按报错提示逐个安装依赖
# 例:根据报错提示补装依赖
sudo dnf install -y <缺失依赖包1> <缺失依赖包2> ...
注意:有些依赖需要开启额外仓库(如 PowerTools/CRB 等),不同发行版仓库名不一样;如果你依赖包“找不到”,通常就是仓库没开或源不匹配。
4.4 找到生成的 RPM 并本地安装
rebuild 成功后,RPM 通常在:
- ~/rpmbuild/RPMS/
/ - 或 ~/rpmbuild/RPMS/noarch/
你可以这样查:
find ~/rpmbuild/RPMS -type f -name "*.rpm"
然后本地安装:
# 方式1:用 rpm 安装
sudo rpm -ivh ~/rpmbuild/RPMS/aarch64/compat-openssl10-*.rpm
# 方式2:用 yum/dnf localinstall(会自动处理依赖更友好)
sudo dnf localinstall -y ~/rpmbuild/RPMS/aarch64/compat-openssl10-*.rpm
5. 验证是否安装成功
rpm -qa | grep compat-openssl10
rpm -qi compat-openssl10
如果是库文件类包,你也可以验证文件是否在系统中:
rpm -ql compat-openssl10 | head
6. 备注与建议
- rpmbuild –rebuild 会自动处理 SRPM 的解包、spec 执行、产物输出;但依赖必须先满足。
- 生产环境建议用 dnf localinstall 而不是 rpm localinstall(rpm 不会自动解决依赖)。
- 如果是跨发行版(比如用 CentOS Vault 的 SRPM 在其他系统上编),可能出现依赖版本不匹配,需要调整源或替换依赖。