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

发布于:2025-07-24 ⋅ 阅读:(20) ⋅ 点赞:(0)

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 1

Name:           redis
Version:        %{_version}
Release:        %{_release}.oe1
Summary:        A persistent key-value database

Group:          Applications/Databases
License:        BSD
URL:            http://redis.io
Source0:        redis-%{_version}.tar.gz
Source1:        redis.service

BuildRequires:  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.service
 sudo 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
    

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


网站公告

今日签到

点亮在社区的每一天
去签到