旧版 RHEL 能得到 RPM,但新版本系统不再提供了怎么办呢?

除非你使用的软件是专有软件,没有提供 SRPM,否则最好使用 SRPM 在新系统下重新打包。这样可以保证编译时使用新版本的编译器和动态链接库,以便避免一些各种依赖版本带来的问题。

甚至你可以在原包基础上升级软件版本。

TL:DR

我已经做好 YUM Repo 了,不需要你们自己打包了。

1curl -OL https://s3.ddupan.top/repo/yum/panxiao81.repo
2sudo mv panxiao81.repo /etc/yum.repos.d/
3sudo dnf install apt-cacher-ng

前言

我在实验环境中经常反复装 Linux 系统,每次装完都要更新,安装各类软件包,显然我可以考虑搭建一个缓存服务。

Nexus 只做缓存使用有些过于臃肿,APT-Cacher-NG 是一个接近开箱即用的方案,当然也可以用 Nginx 做反向代理缓存,甚至使用 Squid 这种本来就是用来做缓存的方案。

APT-Cacher-NG 提供了 deb 包,Debian 源中也有源码包提供,EPEL 在 EL7 时代曾经维护过 APT-Cacher-NG 的 RPM,但或许是用的人比较少等原因,EPEL 8 以后不再维护这个包了,因此我打算把 EL7 的 SRPM 下载回来,在 EL8 上使用更新版本的上游源码重新编译。

下载和安装 SRPM

如果你有一个安装了 EPEL 7 源的 EL7 系系统,你大可以直接使用 yum 在系统上下载 SRPM,否则你需要去源里翻 SRPM 并下载回来。

我们可以从 EPEL 7 中得到 apt-cacher-ng-3.1-4.el7.src.rpm,实际是这就是一个普通的 RPM 包。

这个 RPM 包可以被安装,他将会被安装在用户家目录中。

1rpm -i apt-cacher-ng-3.1-4.el7.src.rpm

现在你应当能在家目录中发现一个 rpmbuild 目录。

重新构建 RPM

进入到 rpmbuild 目录后,你可以发现这就是一个标准的 RPM 工作目录。

但为了不弄脏我自己的系统,我决定在容器中构建。

由于我的宿主系统是 RHEL,所以我也打算使用 Red Hat 的 UBI 镜像,也可以使用 Alma Linux 等 EL 系的发行版,步骤是一致的。

1podman run -it --rm -v `pwd`:/root registry.access.redhat.com/ubi8/ubi:8.6

RPM 工作目录内部结构是这个样子

1[panxiao81@nexus rpmbuild]$ ls
2BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

其中,SOURCES 保存了所有用到的源码;SPECS 保存了构建 RPM 的描述 SPEC 文件;BUILD 目录保存源码的中间过程,因为存在对上游源码打 Patch 的可能;BUILDROOT 目录顾名思义,在构建过程完成后 BUILDROOT 保存了整个 RPM 的目录结构;RPMS 和 SRPMS 保存构建成品。

因此,进入 SPECS 目录,可以看到 apt-cacher-ng.spec 文件,这就是构建 RPM 所需的文件。

在构建 RPM 之前,首先安装 RPM 工具包

1sudo dnf install rpm-build

如果不打算升级软件包直接开始构建的话,此时就可以直接构建了。

首先安装构建依赖,dnf 存在一个子命令可以直接从 SPEC 中安装所需依赖包。

1dnf builddep apt-cacher-ng.spec

如果使用 YUM(如果使用 EL7 及更早的版本)则使用 yum-builddep

这样一来就可以构建 RPM 了。

1cd SPECS/
2rpmbuild -ba apt-cacher-ng.spec

构建完成如果没有错误的话,则会在 RPM 的工作目录中的 RPMS 子目录下生成 RPM 包,在 SRPMS 子目录中生成 SRPM 包。

但如果你想同时升级软件的话,你就需要修改 SPEC 文件,下载新的源码,甚至可能需要新增依赖包。

打开 SPEC 文件,你可以看到源码的上游地址,即 http://ftp.debian.org/debian/pool/main/a/apt-cacher-ng/%{name}_%{version}.orig.tar.xz,顺着这里,可以看到两个更新的版本,一个是随 Debian 10 分发的 3.2.1,另一个是随 Debian 11 分发的 3.6.4

3.6.4 更新的内容较多,引入了许多新的库,我选择编译 3.2.1 版本。

把新的源码包下载回来,放进 SOURCES 目录中,修改 SPEC 中的版本字段,构建 RPM 即可。

给 RPM 签名与 YUM 源

如果打算使用 YUM 源,则在建立源之前最好先给 RPM 签名,保证包在构建后不被第三者篡改。

首先保证 GPG 已安装,并且存在一个签名密钥,若还没有密钥,可先生成一个。

1$ gpg --list-keys
2gpg --list-keys
3/home/panxiao81/.gnupg/pubring.kbx
4-----------------------------------
5pub   rsa4096 2022-06-18 [SC]
6      E187C04BCB99AB1459DF82584191215A82DA49B3
7uid             [ 绝对 ] Xiao Pan (panxiao81) <[email protected]>
8sub   rsa4096 2022-06-18 [E]

接下来设置 RPM 全局宏,让 RPM 使用该 Key 对 RPM 签名

1echo "%_signature gpg" >> ~/.rpmmacros
2echo "%_gpg_name E187C04BCB99AB1459DF82584191215A82DA49B3" > /root/.rpmmacros

接下来对所有 RPM 附加签名信息。

安装 rpm-sign 工具

1sudo dnf install rpm-sign

对所有 RPM 签名

1rpm --addsign *.rpm

接下来可以建立 YUM 源了。

安装工具

1sudo dnf install createrepo

建立目录结构:

 1tree repo
 2repo
 3├── 8
 4│   ├── source
 5│   │   ├── package
 6│   │   │   ├── apt-cacher-ng-3.1-4.el8.src.rpm
 7│   │   │   └── apt-cacher-ng-3.2.1-4.el8.src.rpm
 8│   │   └── repodata
 9│   │       ├── 274d597b12ab09dbacbf9399112ac0e7e979db30ad0ca6267c4b79b401b9d9d4-filelists.sqlite.bz2
10│   │       ├── 4dfffd3378cd3bef128f9585cd6c2cbd516a13d04de9ce3a331712cb09b3510e-primary.xml.gz
11│   │       ├── 5c82e87053b2bc80935e1b431e339b62091a237e351e24d7bae4304b682f850f-other.xml.gz
12│   │       ├── 622fe6bdbafc84e6797aa0e6fe2d5919570287be7ebe00a09dcc9737755365c1-filelists.xml.gz
13│   │       ├── 7e3a9659559cf0d479be53981f11a2c479ec18c7f497603101992a6867b7f00e-other.sqlite.bz2
14│   │       ├── a7ccaf83e1745a09f9a99b3cb833a648537bec9b8bdebd13338fb7e4f57a999c-primary.sqlite.bz2
15│   │       ├── repomd.xml
16│   │       └── repomd.xml.asc
17│   └── x86_64
18│       ├── debug
19│       │   ├── package
20│       │   │   ├── apt-cacher-ng-debuginfo-3.1-4.el8.x86_64.rpm
21│       │   │   ├── apt-cacher-ng-debuginfo-3.2.1-4.el8.x86_64.rpm
22│       │   │   ├── apt-cacher-ng-debugsource-3.1-4.el8.x86_64.rpm
23│       │   │   └── apt-cacher-ng-debugsource-3.2.1-4.el8.x86_64.rpm
24│       │   └── repodata
25│       │       ├── 09554566f83fd9349f5eea17b24caf195973f81a7e23e4db45765ab14125d250-filelists.sqlite.bz2
26│       │       ├── 3c40475c856494cc17df8efce82dc117e7e71c0c7e1e42c8ae0e2c95864aaa1a-other.sqlite.bz2
27│       │       ├── 57790698cbe2c008f5db27dd14f15f2d7a7ea2d906a77301be869990b136e093-filelists.xml.gz
28│       │       ├── 8f2aefd4b3f823b2f157592737f7b9bb193c1dc3420e3d2eb0a25d8b5149ca53-other.xml.gz
29│       │       ├── e329820d70a8c6984029f54c21ef65b622ee7e0c0436eb0a1891e827fbf9d54f-primary.sqlite.bz2
30│       │       ├── eed10c75e12bbff9233b0effad7be8f4ff4651d99c5dcdc972b0cca1349b004d-primary.xml.gz
31│       │       ├── repomd.xml
32│       │       └── repomd.xml.asc
33│       └── package
34│           ├── apt-cacher-ng-3.1-4.el8.x86_64.rpm
35│           ├── apt-cacher-ng-3.2.1-4.el8.x86_64.rpm
36│           └── repodata
37│               ├── 62fb19e348a50b864a4f4b6c7c4d4acc1516550dee71b8ca6137a0c3f35d34a6-filelists.xml.gz
38│               ├── 914e6e4ee80ea374a17142378599047795a3d15fb9ab8bf6449eb172cf713d3c-primary.sqlite.bz2
39│               ├── a073711eea3811831060a02033fc321b8923114304138e59d95417a7feffe83f-filelists.sqlite.bz2
40│               ├── c16dc70163bb851cd2fde4b8154b8d81d38fb0f871ae5010e0a6ed8130fbe9fa-other.sqlite.bz2
41│               ├── e9e4db2f26890d356b0a86aa4183fe63fccf7eb0da0f453b0fadbe707687cacf-primary.xml.gz
42│               ├── ee8e730e72d142b48106aa1f3c8b63b11ad5bcfe0f0b650b3a2029aef91002f4-other.xml.gz
43│               ├── repomd.xml
44│               └── repomd.xml.asc
45├── panxiao81.repo
46└── RPM-GPG-KEY-PANXIAO81

以上供参考。

导出 GPG Public Key 供源使用者使用

1gpg --export E187C04BCB99AB1459DF82584191215A82DA49B3 > RPM-GPG-KEY-PANXIAO81

最好将 Debuginfo 包,SRPM 包和二进制 RPM 包分到不同的源存放。

对所有的源进行 createrepo 操作

1createrepo .

对 repodata 的 metadata 进行签名

1gpg --detach-sign --armor repodata/repomd.xml

我选择将这个目录结构整体上传 S3 存储,也可以使用其他方法发布,为方便使用,可以提供一个预先写好的 repo 文件。

 1[panxiao81]
 2name=Xiao Pan Rebuild Package
 3baseurl=https://s3.ddupan.top/repo/yum/8/$basearch/package
 4enabled=1
 5gpgcheck=1
 6gpgkey=https://s3.ddupan.top/repo/RPM-GPG-KEY-PANXIAO81
 7
 8[panxiao81-debug]
 9name=Xiao Pan Rebuild Package - Debug
10baseurl=https://s3.ddupan.top/repo/yum/8/$basearch/debug
11enabled=0
12gpgcheck=1
13gpgkey=https://s3.ddupan.top/repo/RPM-GPG-KEY-PANXIAO81
14
15[panxiao81-source]
16name=Xiao Pan Rebuild Package - Source
17baseurl=https://s3.ddupan.top/repo/yum/8/source
18enabled=0
19gpgckeck=1
20gpgkey=https://s3.ddupan.top/repo/RPM-GPG-KEY-PANXIAO81

以上完成后,可以换一台机器做测试。