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 语言编译器)、 make
、systemd
以及其他 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 失败)
- 原因 : 可能是
gcc
或make
未安装,或者源码本身与系统库存在兼容性问题。 - 解决方案 : 确保
gcc
和make
已安装。如果问题依旧,需要查看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
如果能成功设置和获取键值,则功能正常。