当前位置: 首页 > news >正文

OpenEuler系统架构下编译redis的RPM包

OpenEuler系统架构下编译redis的RPM包

      • 1、准备编译环境
        • 1.1 安装依赖包
        • 1.2 创建 RPM 构建目录结构
      • 2、准备源码和 SPEC 文件
        • 2.1 下载 Redis 源码包
        • 2.2 创建 systemd 服务文件
        • 2.3 编写 redis.spec 文件
      • 3、构建 RPM 包
      • 4、可能遇到的问题及解决方案
        • 4.1 问题:构建时提示 `BuildRequires` 依赖缺失
        • 4.2 问题:编译错误 (make 失败)
        • 4.3 问题:SPEC 文件语法错误
      • 5、在新服务器上测试验证 RPM 包
        • 5.1 复制并安装 RPM 包
        • 5.2 验证安装
        • 5.3 启动并测试 Redis 服务

1、准备编译环境

1.1 安装依赖包

执行以下命令安装 rpm-build (用于构建 RPM)、 gcc (C 语言编译器)、 makesystemd 以及其他 Redis 编译和打包所需的依赖项。

sudo dnf install -y rpm-build gcc make tcl wget tar systemd
1.2 创建 RPM 构建目录结构

rpmbuild 工具需要在用户主目录下有一个特定的目录结构来存放源码、SPEC 文件和最终生成的 RPM 包。

mkdir -p /root/rpmbuild/BUILD /root/rpmbuild/RPMS /root/rpmbuild/SOURCES /root/rpmbuild/SPECS /root/rpmbuild/SRPMS

在root目录下创建一个 rpmbuild 目录,其中包含 BUILD , RPMS , SOURCES , SPECS , SRPMS 等子目录。

2、准备源码和 SPEC 文件

2.1 下载 Redis 源码包

下载 Redis 6.2.19 版本的源码包,并将其放置到 rpmbuild/SOURCES 目录下。

wget http://download.redis.io/releases/redis-6.2.19.tar.gz -P /root/rpmbuild/SOURCES/
2.2 创建 systemd 服务文件

了让RPM 包能够通过 systemctl 来管理 Redis 服务,我们需要创建一个 systemd 服务单元文件。这个文件也需要放到 /root/rpmbuild/SOURCES 目录中。

cat << 'EOF' > /root/rpmbuild/SOURCES/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target[Service]
ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStop=/usr/bin/redis-cli shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755[Install]
WantedBy=multi-user.target
EOF
2.3 编写 redis.spec 文件

这是整个打包过程中最核心的文件。它告诉 rpmbuild 如何构建、安装和打包 Redis。在 /root/rpmbuild/SPECS/ 目录下创建一个名为 redis.spec 的文件。

vim /root/rpmbuild/SPECS/redis.spec

将以下内容复制并粘贴到 redis.spec 文件中:

%define _version 6.2.19
%define _release 1Name:           redis
Version:        %{_version}
Release:        %{_release}.oe1
Summary:        A persistent key-value databaseGroup:          Applications/Databases
License:        BSD
URL:            http://redis.io
Source0:        redis-%{_version}.tar.gz
Source1:        redis.serviceBuildRequires:  gcc
BuildRequires:  make
BuildRequires:  systemd
Requires:       logrotate%description
Redis is an advanced key-value store. It is often referred to as a data structure
server since keys can contain strings, hashes, lists, sets and sorted sets.%prep
%setup -q -n redis-%{_version}%build
make %{?_smp_mflags} CFLAGS="%{optflags}" PREFIX=/usr%install
# Install binaries
make install PREFIX=%{buildroot}/usr# Create necessary directories
install -d -m 755 %{buildroot}/etc/redis
install -d -m 755 %{buildroot}/var/lib/redis
install -d -m 755 %{buildroot}%{_unitdir}# Install configuration file
install -m 644 redis.conf %{buildroot}/etc/redis/redis.conf
# Tweak config for production
sed -i 's/^supervised no/supervised systemd/' %{buildroot}/etc/redis/redis.conf
sed -i 's/^daemonize yes/daemonize no/' %{buildroot}/etc/redis/redis.conf
sed -i 's,^dir ./,dir /var/lib/redis/,' %{buildroot}/etc/redis/redis.conf# Install systemd service file
install -m 644 %{SOURCE1} %{buildroot}%{_unitdir}/redis.service# Create user and group for redis
install -d -m 755 %{buildroot}/usr/sbin%pre
getent group redis >/dev/null || groupadd -r redis
getent passwd redis >/dev/null || useradd -r -g redis -d /var/lib/redis -s /sbin/nologin redis%post
%systemd_post redis.service%preun
%systemd_preun redis.service%postun
%systemd_postun_with_restart redis.service%files
%defattr(-,root,root,-)
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli
/usr/bin/redis-sentinel
/usr/bin/redis-server
%config(noreplace) /etc/redis/redis.conf
%{_unitdir}/redis.service
%attr(0755, redis, redis) /var/lib/redis%changelog
* Mon May 20 2024 Your Name <your.email@example.com> - 6.2.19-1
- Initial RPM release for openEuler

注意 : 可以将 changelog 部分的 Your Name your.email@example.com 替换为您自己的信息。

3、构建 RPM 包

准备工作都已完成,可以开始构建 RPM 包了。

cd /root/rpmbuild/SPECS
rpmbuild -ba redis.spec

构建完成后,生成的 RPM 包会存放在 /root/rpmbuild/RPMS/x86_64/ (或 aarch64,取决于服务器架构) 目录下,可以看到类似 redis-6.2.19-1.oe1.x86_64.rpm 的文件。

4、可能遇到的问题及解决方案

4.1 问题:构建时提示 BuildRequires 依赖缺失
  • 原因 : SPEC 文件中声明的构建依赖项没有被安装。
  • 解决方案 : 使用 sudo dnf install -y <package_name> 安装缺失的包。
4.2 问题:编译错误 (make 失败)
  • 原因 : 可能是 gccmake 未安装,或者源码本身与系统库存在兼容性问题。
  • 解决方案 : 确保 gccmake 已安装。如果问题依旧,需要查看 rpmbuild 输出的详细错误日志,定位到具体的编译错误并解决。对于 Redis 6.2.19,在标准的 openEuler 系统上通常不会遇到编译问题。
4.3 问题:SPEC 文件语法错误
  • 原因 : redis.spec 文件内容有误。
  • 解决方案 : rpmbuild 会提示具体的错误行号和信息。请仔细检查该行及上下文的语法是否正确,特别是宏定义、命令和文件路径。

5、在新服务器上测试验证 RPM 包

将构建好的 RPM 包复制到一台干净的、未安装过 Redis 的 openEuler 服务器上进行验证。该 rpm 包安装的时候,缺少 jemalloc 需要提前安装。需要的 rpm 包已经上传到资源绑定里。

5.1 复制并安装 RPM 包
# 在新服务器上执行
sudo dnf install -y jemalloc-help-5.2.1-1.oe2203sp1.x86_64.rpm
sudo dnf install -y jemalloc-5.2.1-1.oe2203sp1.x86_64.rpm
sudo dnf install -y /path/to/redis-6.2.19-1.oe1.x86_64.rpm
5.2 验证安装
  • 检查文件和目录 : 确认相关文件和目录是否被正确创建。
ls /usr/bin/redis-*
ls /etc/redis.conf
ls /var/lib/redis
ls /usr/lib/systemd/system/redis.service
  • 检查用户和组 : 确认 redis 用户和组是否已创建。
id redis
5.3 启动并测试 Redis 服务
  • 启动服务并设置开机自启 :
 sudo systemctl start redis.servicesudo systemctl enable redis.service
  • 检查服务状态 :

    sudo systemctl status redis.service
    

    您应该能看到服务状态为 active (running) 。

  • 功能测试 :

    redis-cli ping
    

    如果返回 PONG ,说明 Redis 服务工作正常。

    redis-cli set mykey 'Hello from RPM'
    redis-cli get mykey
    

    如果能成功设置和获取键值,则功能正常。

http://www.lryc.cn/news/597591.html

相关文章:

  • 【基于OpenCV的图像处理】图像预处理之图像色彩空间转换以及图像灰度化处理
  • 【web页面接入Apple/google/facebook三方登录】
  • SQL基础⑥ | 聚合函数
  • Java项目中定时任务三方工具和技术的深度应用指南
  • Kubernetes 日志收集
  • biji 1
  • 事务与索引:数据库核心机制详解
  • 解析云蝠智能 VoiceAgent 的技术架构与应用实践
  • Linux第三天Linux基础命令(二)
  • 不同地区的主要搜索引擎工具
  • 原创-基于 PHP 和 MySQL 的证书管理系统 第三版
  • Windows 用 Python3 快速搭建 HTTP 服务器
  • 网络基础DAY18-动态路由协议基础
  • 观影《长安的荔枝》有感:SwiftUI 中像“荔枝转运”的关键技术及启示
  • Linux文件fd
  • 架构师--缓存场景
  • vmware分配了ubuntu空间但是ubuntu没有获取
  • python---列表(List)
  • 龙虎榜——20250723
  • 【Linux系统】基础IO(上)
  • 数字化转型:概念性名词浅谈(第三十四讲)
  • Web前端开发:JavaScript遍历方法详解与对比
  • 文字识别接口-文档识别技术-手写文字识别
  • VRRP的概念及应用场景
  • 字节 AI 编辑器 Trae 2.0 SOLO 出道! 国际版不充分指南及与国内版的对比
  • Python 程序设计讲义(8):Python 的基本数据类型——浮点数
  • day060-zabbix监控各种客户端
  • DPU 的基本运算单元是LUT吗?
  • 【笔记】wow-rag 第5课-流式部署
  • 进程间通信——POSIX 和 System V适用场景