[CentOS7] Rpmbuild Redis 8,但它没有适用于 EL7 的官方 RPM 包。

目录
介绍
好久不见。
我是Mikoto,2024届毕业生,眼看着低年级同事们的培训即将结束,我开始有点焦虑了。
我最近才从公司同事那里了解到的 rpmbuild,这是 我想聊聊
当时 CentOS 7 在 Redis 8 ,我正在研究如何
“我想我之前做过一个.rpm文件。”
我听到了一些相当令人震惊的消息。(请原谅,我还是个新手。)
所以,我决定使用测试环境, 用 rpmbuild 创建一个 RPM 包,并进行本地安装。我想分享一下整个过程以及我遇到的问题!
关于环境
环境
我正在使用 Vagrant。
我还附上了一个链接,如果你之前没用过 Vagrant,请务必试一试!
- VirtualBox:Oracle VM VirtualBox
- Vagrant:HashiCorp 出品的 Vagrant
- 操作系统:Oracle Linux 7.9
(我还在写一篇关于如何使用 Vagrant 设置环境的博客。)
一位资深的同事之前已经对 Vagrant 做过讲解,所以去看也
设置 rpmbuild 环境
对搭建 rpmbuild 环境 这 很有帮助
我一开始完全是个新手,连环境结构都不知道……(^ ^ ;)
# 安装所需工具 $ sudo yum install rpmdevtools yum-utils # 构建 rpmbuild 环境 $ rpmdev-setuptree
完成 rpmbuild 的设置后,你会看到类似这样的目录结构。
你可能会想,“哎”,但实际上,构建之前你只需要调整 SOURCES 和 SPECS 这两个目录。
~/rpmbuild ├ BUILD # 工作目录 ├ BUILDROOT # 用于临时安装最终产品的虚拟根目录 ├ RPMS # 已完成的 .rpm 文件存放位置 ├ SOURCES # 构建所需输入文件(例如源代码归档文件)存放位置 ├ SPECS # .spec 文件存放位置 └ SRPMS # .src.rpm 文件存放位置
最终构建完成后 ~/rpmbuild/ 目录的内容
经过一番折腾,我终于在 ~/rpmbuild 目录下得到了以下结构。
之后我就没再动过任何东西,因为我相信它是在构建过程中自动添加的。(大概吧)
源代码 ├ redis-8.0.2.tar.gz ├ redis.conf └ redis.service 规范 └ redis-8.0.2.spec
在此之前,我尝试编译 redis-8.0.2.tar.gz,但似乎还需要手动注册 systemctl 单元,所以这次我确保在安装过程中也应用了 redis.service 文件。
此外,虽然压缩包中存在配置文件,但数据位置不同,因此这次我包含了我自己准备的 redis.conf 文件,以便在安装后引用。
*注意:更新前,请确保 Redis 已设置为持久化数据。
在我的环境中,Redis 数据从一开始就设置为持久化,但根据设置的不同,如果数据没有持久化,并且在系统重启时丢失,可能会造成严重后果,所以一定要检查!
# redis-cli CONFIG GET save 1) "save" 2) "3600 1 300 100 60 10000"
↑看起来关系数据库快照已经保存了!如果这里没有写明何时创建快照的条件,则快照可能不会被保存。
我是如何了解到SPEC的
读取规范文件失败
在检查操作步骤时,我天真地 rpmbuild 命令,以为构建 redis-8.0.2.tar.gz 会创建一个 .rpm 文件! 执行了
但……
rpmbuild -tb --clean redis-8.0.2.tar.gz 错误:无法从 redis-8.0.2.tar.gz 读取 spec 文件
“什么?没有规范文件吗?”
我当时也是这么想的。
经过一番研究,我意识到我必须自己动手做。
什么是 spec 文件?
spec 文件是描述如何构建 RPM 软件包的文件。它包括
实际的构建过程、软件包配置文件的位置、向 systemctl 注册等等。
它似乎有时会包含在 tar.gz 文件中,但这次它不在其中,因此发生了错误。
如果没有,那就自己创造一个。
之后,我上网搜索并咨询了人工智能,发现我可以手动创建它,于是我运用所有技能,设法创建了一个规范文件。
经过一番努力,我终于通过将文件放入开头提到的 ~/rpmbuild/SPECS 目录中,成功构建了该项目。
规格说明 └ redis-8.0.2.spec ★
文档,似乎可以使用命令创建类型,而无需完全手动操作……?
下次我会记住这一点(自言自语)。
这次最终成功更新的 spec 文件如下所示:
名称:redis 版本:8.0.2 发行版:1%{?dist} 摘要:Redis 是一个内存数据库,数据持久化到磁盘。许可证:BSD URL:https://redis.io/ Source0:redis-8.0.2.tar.gz # 如果包含 redis.service Source1:redis.service # 构建所需的软件包 BuildRequires:gcc # 根据需要添加其他软件包 # BuildRequires:make、systemd 等 # (可选)运行时所需的依赖项 # Requires:systemd %description Redis 是一个开源(BSD 许可)的内存数据结构存储系统,可用作数据库、缓存和消息代理。 %prep # 解压 tar.gz %setup -q -n redis-8.0.2 %build # 构建 Redis make %install # 清理 buildroot 目录 rm -rf %{buildroot} # 创建二进制文件目录 mkdir -p %{buildroot}/usr/bin # 安装预编译的可执行文件 install -p -m 0755 src/redis-server %{buildroot}/usr/bin/redis-server install -p -m 0755 src/redis-cli %{buildroot}/usr/bin/redis-cli # 创建 /etc/redis 目录并将 redis.conf 文件放入其中 mkdir -p %{buildroot}/etc/redis install -p -m 0644 %{_sourcedir}/redis.conf %{buildroot}/etc/redis/redis.conf # 放置 systemd 单元 # %{_unitdir} 通常解压到/usr/lib/systemd/system mkdir -p %{buildroot}%{_unitdir} install -p -m 0644 %{SOURCE1} %{buildroot}%{_unitdir}/redis.service %files # 二进制文件 /usr/bin/redis-server /usr/bin/redis-cli # 配置文件(使用 noreplace 选项防止用户编辑被覆盖) %config(noreplace) /etc/redis/redis.conf # systemd 单元文件 %{_unitdir}/redis.service %post # 安装后立即处理 if [ $1 -eq 1 ] ; then # 在新安装时启用 systemd 单元 /bin/systemctl enable redis.service &>/dev/null || : fi # 安装/更新后初始化(重新加载)systemd /bin/systemctl daemon-reload &>/dev/null || : %preun # 软件包移除过程 if [ $1 -eq 0 ] ; then # 仅在卸载期间停止/禁用服务 /bin/systemctl stop redis.service &>/dev/null || : /bin/systemctl disable redis.service &>/dev/null || : fi %postun # 卸载/更新后的处理 /bin/systemctl daemon-reload &>/dev/null || : %changelog * 2025年6月14日星期六 John Doe <[email protected]> - 8.0.2-1 - 使用 systemd 单元构建 Redis 的初始版本
创建 rpm 包并安装它
首先,检查材料。
这是最重要的部分。
前面提到的 SOURCES 和 SPEC 的内容
正如我稍后会在备忘录中提到的,仔细检查每个 SOURCES 的内容至关重要,因为忽略这一点可能会导致严重的问题(特此提醒)。
源代码 ├ redis-8.0.2.tar.gz ├ redis.conf └ redis.service 规范 └ redis-8.0.2.spec
尝试搭建它
实际用于构建的命令如下所示。系统
会根据生成的 spec 文件创建一个 .rpm 文件。
rpmbuild -bb /root/rpmbuild/SPECS/redis-8.0.2.spec
* -bb 选项仅用于创建 .rpm 文件。如有必要,可将其更改为 -ba(创建 .src.rpm 和 .rpm 文件),等等。
如果该过程顺利完成且没有出现任何错误,则构建完成!
更新前先加载数据
更新前,先输入一些随机数据。
如果数据丢失,更新就毫无意义了!
↑一位在测试过程中多次丢失数据的人。
# redis-cli 设置超越“24365” # redis-cli 获取超越“24365”
将生成的 .rpm 软件包安装到本地
已完成的软件包位于 ~/rpmbuild/RPMS/x86_64/redis-8.0.2-1.el7.x86_64.rpm。
让我们确认它是否存在,然后继续安装!
# yum localinstall ~/rpmbuild/RPMS/x86_64/redis-8.0.2-1.el7.x86_64.rpm 正在检查 ~/rpmbuild/RPMS/x86_64/redis-8.0.2-1.el7.x86_64.rpm:redis-8.0.2-1.el7.x86_64 标记为要安装 ~/rpmbuild/RPMS/x86_64/redis-8.0.2-1.el7.x86_64.rpm 正在解析依赖关系 --> 正在运行事务检查 ---> 将安装软件包 redis.x86_64 0:8.0.2-1.el7 --> 依赖关系解析完成 依赖关系已解决============================================================================================= ============================================================================================ 软件包 架构 版本 软件仓库 大小=========================================================================================== ==================================================================================================== 安装:redis x86_64 8.0.2-1.el7 /redis-8.0.2-1.el7.x86_64 4.4 MB 事务摘要========================================================================================= =============================================================================================== 安装 1 个软件包 总大小:4.4 MB 已安装大小:4.4 MB 是否确定 [y/d/N]:y 正在下载软件包: 正在运行事务检查 正在运行事务测试 事务测试成功 正在运行事务 安装:redis-8.0.2-1.el7.x86_64 1/1 正在验证:redis-8.0.2-1.el7.x86_64 1/1 已安装:redis.x86_64 0:8.0.2-1.el7 完成!
“完成! 它显示
但现在的问题是……它真的能启动吗……?
● redis.service - Redis 内存数据存储 已加载:已加载 (/usr/lib/systemd/system/redis.service;已启用;供应商预设:已禁用) 活动:运行中,自 2025 年 6 月 18 日星期三 00:07:56 UTC 起;7 小时前 主进程 ID:1151 (redis-server) CGroup:/system.slice/redis.service mq1151 /usr/local/bin/redis-server 127.0.0.1:6380 6 月 18 日 00:07:57 ansible-bastion redis-server[1151]: 1151:C 2025 年 6 月 18 日 00:07:57.249 * Redis 版本=8.0.2,位数=64,提交=00000000,修改=1,进程 ID=1151,刚刚启动
它已经上线运行了!🎉🎉🎉
版本号 8.0.2 是
# redis-cli 获取超过“24365”
更新后,里面的数据似乎仍然完好无损!
调整备忘录
在创建 spec 文件时,会在构建过程中出现错误,生成的 包后才能发现问题有时
实际上,导致错误的问题比较容易修复,但很多时候,即使软件包构建过程没有出现任何问题,安装后也需要进行各种调整。
我在此总结一下,是为了提醒大家下次要更加小心。
%变更日志日期应正确填写
在规范文件中,%changelog 用于输入日期。
您可以像这样输入日期、名称、电子邮件地址和版本:
%changelog * 2025年6月13日星期四 测试 Taro <[email protected]> - 8.0.2-1
以下是一个常见的错误:[错误信息]。
仅凭这些信息很难判断哪里出了问题,对吧?
RPM 构建错误:%changelog 中的日期错误:Thu Jun 13 2025 Test Taro <[email protected]> - 8.0.2-1
正确答案是:
“2025年6月13日,星期四”
2025年6月13日星期五。
因此,“2025年6月13日,星期五”应该是
即使是这样的小错误也可能导致错误长时间存在,所以一定要小心!(^^;)
检查 redis.conf 文件的位置和内容。
与任何软件包一样,升级时,您需要备份配置文件,并在更新后检查差异,以确保没有重大差异,并且这些差异没有造成任何影响。
在更新我创建的软件包时将被替换的配置文件的 端口号 和 数据存储目录 我应该仔细检查
我犯的错误列在下面。
- 由于指定了不同的端口,因此在端口 6379 和 6380 上启动了不同的 Redis 实例。
- 由于保存目标目录错误,数据保存到了与预期不同的目录中
▼港口
# 接受指定端口上的连接,默认端口为 6379(IANA #815344)。# 如果指定端口 0,Redis 将不会监听 TCP 套接字。端口 6379
▼目录
# 请注意,此处必须指定目录,而不是文件名。dir /var/lib/redis
请勿更改已安装命令的位置
使用 yum 安装 Redis 后,我以为可以使用 `redis-server` 和 `redis-cli` 之类的命令,但结果并非如此。虽然
没有出现任何错误提示,但我是在实际执行这些命令后才意识到这一点的。
原因如下。
# spec 文件内容 %files /usr/local/bin/redis-server /usr/local/bin/redis-cli # 待更新的 Redis 7 系列运行环境 /usr/bin/redis-server /usr/bin/redis-cli
如果在这种状态下构建并尝试使用 redis-server,就会发生这种情况。
[root@test-web redis]# sudo /usr/local/bin/redis-server /etc/redis.conf --daemonize no sudo: /usr/local/bin/redis-server: 命令未找到
我终于把它装好了,以为一切正常,结果却出现了这种情况……我们仔细检查一下设置吧。
结论
那么,你觉得怎么样?
这次,我写了创建 RPM 包的过程以及我遇到的问题。
我原本想安装一个经过各种自定义的rpm文件并实际使用它,但这仍然让我很困惑,我还没想好该如何使用它……
我会继续每天努力工作,希望将来有一天能够帮助到别人!
4
