[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

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

介绍

好久不见了。
我是2024届的毕业生Mikoto,看到后辈们的培训即将结束,我有点迫不及待了
我想聊聊前几天从公司同事那里第一次了解到的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 文件。
此外,虽然存档包含一个 conf 文件,但数据存储在不同的位置,所以这次我包含了这里准备的 redis.conf 文件,以便在安装后参考。

*注意:更新前请确保Redis已设置为持久数据。

在我的环境中,一开始就设置了Redis的数据持久化,但是根据设置的不同,如果数据没有持久化,在系统重启时丢失,那么就可能会发生悲剧,所以一定要检查!

# redis-cli CONFIG GET 保存 1) “保存” 2) “3600 1 300 100 60 10000”

↑看来 RDB 快照已经持久化了!如果这里没有写明何时创建快照的条件,快照可能无法持久化。

我是如何发现 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 文件是描述如何构建 rpm 包的文件
它描述了实际的构建过程、包的 conf 文件的位置、如何在 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 等 # (可选)运行时依赖项 # 需要: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 * Sat Jun 14 2025 John Doe < [email protected] > - 8.0.2-1 - 使用 systemd unit 初始构建 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 将被安装 --> 完成依赖关系解决 依赖关系已解决============================================================================================== =============================================================================================================== 软件包 架构 版本 存储库 大小=== ... ================================================================================================================================================================================================================ 安装 1 个软件包 总大小:4.4 M 已安装大小:4.4 M 是否可以 [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 小时前处于活动状态(正在运行) 主 PID: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,pid=1151,刚刚启动

它已启动并运行🎉🎉🎉
,版本是8.0.2

# redis-cli 超越“24365”

看来更新后里面的数据仍然完好无损!

调整规格备忘录

在创建 spec 文件时,会
导致构建过程中出现错误自己创建的rpm 后才注意到导致错误的问题实际上很容易修复,但很多时候,当我尝试使用构建时没有任何问题的软件包时,却发现需要进行各种调整。

我在这里总结一下,以提醒大家下次要更加小心。

%Changelog 日期应正确书写

spec 文件中的 %changelog 是你放置日期的地方。
输入日期、姓名、电子邮件地址和版本,如下所示。

%changelog * 2025 年 6 月 13 日星期四测试 Taro &amp;lt; [email protected] &amp;gt; - 8.0.2-1

这里经常出现的错误是下面的错误。
仅从这个错误很难判断出了什么问题。

RPM 构建错误:%changelog 中的错误日期:2025 年 6 月 13 日星期四测试 Taro &amp;lt; [email protected] &amp;gt; - 8.0.2-1

正确答案如下:
“2025 年 6 月 13 日,星期四”

2025年6月13日星期五
你应该
在这里“2025年6月13日,星期五” 即使是这样的错误也会导致长期错误,所以一定要小心(^^;)

查看redis.conf的位置和内容

与任何软件包一样,升级时,您需要备份 conf 文件并检查更新后的差异,以确保没有重大差异并且没有产生任何影响。

我应该仔细检查在更新我创建的包时被替换的 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
83
X Facebook 哈特纳书签 口袋
[网络研讨会] 多云入门:哪种云最适合您的业务?获取八大主流云的最新资讯!

[网络研讨会] 多云入门:哪种云最适合您的业务?获取八大主流云的最新资讯!

[网络研讨会]从操作结构到特定步骤!云服务器操作和维护的完整概述

[网络研讨会]从操作结构到特定步骤!云服务器操作和维护的完整概述

写这篇文章的人

关于作者

美琴

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