[CentOS7] Rpmbuild Redis 8,没有针对 EL7 的官方 RPM

介绍

好久不见。
我是Mikoto,2024届毕业生,眼看着低年级同事们的培训即将结束,我开始有点不耐烦了。
我想聊聊rpmbuild,前几天我从公司里一位同事那里第一次了解到它

当时,我正在研究如何在CentOS 7Redis 8

“我想我之前做过一个.rpm文件。”

听到这样的消息我非常震惊。(请原谅,我还是个新手。)
所以,我用测试环境,用 rpmbuild 创建了一个 RPM 包,并在本地进行了安装,我想和大家分享一下这个过程以及我遇到的问题!

关于环境

环境

我们使用 Vagrant。
我们也附上了链接,如果您之前从未使用过 Vagrant,请务必尝试一下!

(我还在写一篇关于如何使用 Vagrant 设置环境的博客。)

过去,一位优秀的学长学姐曾讲解过 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 命令,心想:“如果我用 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 包并安装它

首先,检查材料。

这是最重要的部分。
上面提到SOURCESSPEC的内容
我稍后会把它记下来,但如果你忽略了检查每个 SOURCE 的内容,最终会遇到麻烦,所以务必仔细检查(警告)。

源代码 ├ 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 文件时,有些
问题会导致构建过程中出错,我创建的rpm 包之后才发现的那些导致错误的问题其实很容易修复,但也有很多次,我尝试使用一个构建过程没有任何问题的软件包,却发现需要进行各种调整。

我在此总结一下,是为了提醒大家下次要更加小心。

%变更日志日期应正确填写

spec 文件中的 %changelog 部分用于填写日期。
请按如下所示输入日期、名称、电子邮件地址和版本。

%changelog * 2025年6月13日星期四 测试 Taro < [email protected] > - 8.0.2-1

这里经常出现的错误如下所示。
仅凭这一点很难判断哪里出了问题。

RPM 构建错误:%changelog 中的日期错误:Thu Jun 13 2025 Test Taro &amp;lt; [email protected] &amp;gt; - 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文件并实际使用它,但这仍然让我很困惑,我还没想好该如何使用它……

我会继续每天努力工作,希望将来有一天能够帮助到别人!

如果您觉得这篇文章有帮助,请点赞!
3
加载中...
3 票,平均:1.00 / 13
300
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

美琴

我是一名基础设施工程师,于 2024 年 4 月从文理学院加入公司。
我想不出一个昵称,所以我选了一个我妈妈经常用的昵称。
鲸头鹳很可爱,不是吗?