定制编译redis打包rpm

借鉴:【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案_redis linux 7.4.2下载免编译-CSDN博客

源码:Release 7.4.2 · redis/redis · GitHub

版本选择: 云数据库 Redis® 升级实例版本-操作指南-文档中心-腾讯云

实操步骤:

1. 准备宿主环境

寻找一个干净的编译环境,这里选择Centos7.9

其他版本也可,最好根据你需要的系统选择。

2. 准备打包环境
sudo yum update -y
sudo yum groupinstall "Development Tools" -y 
sudo yum install wget gcc make tcl rpm-build  rpmlint redhat-rpm-config -y
3. 获取最新稳定版的源代码
wget https://github.com/redis/redis/archive/refs/tags/7.4.2.tar.gz
mv 7.4.2.tar.gz redis-7.4.2.tar.gz
tar -xzf redis-7.4.2.tar.gz
cd redis-7.4.2
4. 编译
make
(可选/推荐) 测试
make test
  • make 是用来编译和构建项目的命令,主要关注生成目标文件、可执行文件、库等。
  • make test 是用来执行测试的命令,它会运行项目的测试套件,以验证代码的正确性。
5. 创建RPM约束文件
RPM 构建需要特定的目录结构:
mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
1
2
3
4
5
6
7
8
~/rpmbuild/BUILD:存放源代码编译过程中生成的中间文件或构建目录。
~/rpmbuild/RPMS:存放构建完成的二进制 RPM 包。
~/rpmbuild/SOURCES:存放用于构建 RPM 包的源代码文件、补丁等源文件。
~/rpmbuild/SPECS:存放 RPM 包的规格文件(.spec 文件),用于描述如何构建 RPM 包。
~/rpmbuild/SRPMS:存放源代码 RPM 包,这是从源代码构建的 RPM 包,通常用于分发源代码。
 
echo这行命令创建或修改了 ~/.rpmmacros 配置文件,并设置了一个宏 _%topdir,指向用户的 rpmbuild 目录。<br>rpmmacros 文件用于配置 RPM 构建工具的行为,其中 _%topdir 是 RPM 工具使用的一个宏,它指定了构建文件和其他资源的根目录。
~/.rpmmacros 配置文件:通过设置 %_topdir 宏,让 RPM 构建工具知道你希望使用的构建目录(在这里是 ~/rpmbuild)。<br>这个配置可以帮助 RPM 工具在正确的位置查找源文件和生成的包。
6. 修改配置文件
复制代码
修改redis-7.4.2/redis.conf
增加redis-7.4.2/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
 
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
 
[Install]
WantedBy=multi-user.target
复制代码

redis.conf参考文件

复制代码
#基本配置
bind 172.25.209.26
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 60
requirepass "abc123,"
databases 16

#守护进程和日志
daemonize yes
loglevel notice
logfile "/var/log/redis.log"
pidfile "/var/run/redis_6379.pid"
#数据持久化
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
dir "/opt/redis/data"
#AOF模式配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
#复制和从节点配置,主从模式使用
masterauth "abc123,"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
replicaof 172.25.209.28 6379
复制代码

 

7.  准备规范文件 (SPEC)
创建一个规范文件(例如 redis.spec)
vim ~/rpmbuild/SPECS/redis.spec
复制代码
Name:           redis
Version:        7.4.2
Release:        1%{?dist}
Summary:        An advanced key-value store

License:        BSD
URL:            https://redis.io/
Source0:        redis-%{version}.tar.gz

BuildRequires:  gcc make tcl
Requires:       tcl

%description
Redis is an open-source, in-memory data structure store, used as a database, cache, and message broker.

%prep
%setup -q

%build
make

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/usr/local/bin
mkdir -p %{buildroot}/etc
mkdir -p %{buildroot}/var/lib/redis
mkdir -p %{buildroot}/lib/systemd/system

# 安装二进制文件
install -m 755 src/redis-server %{buildroot}/usr/local/bin/
install -m 755 src/redis-cli %{buildroot}/usr/local/bin/
install -m 755 src/redis-benchmark %{buildroot}/usr/local/bin/
install -m 755 src/redis-check-aof %{buildroot}/usr/local/bin/
install -m 755 src/redis-check-rdb %{buildroot}/usr/local/bin/

# 安装配置文件
install -m 644 redis.conf %{buildroot}/etc/redis.conf

# 安装 systemd 服务文件
install -m 644 redis.service %{buildroot}/lib/systemd/system/redis.service

%pre
# 检查并备份旧版本的配置文件和数据目录
if [ -f /etc/redis.conf ]; then
    # 备份配置文件
    cp /etc/redis.conf /etc/redis.conf.backup.%{version}
    echo "Old redis.conf backed up to /etc/redis.conf.backup.%{version}"
fi

if [ -d /var/lib/redis ]; then
    # 备份数据目录
    tar -czf /var/lib/redis_backup_%{version}.tar.gz -C /var/lib redis
    echo "Old Redis data directory backed up to /var/lib/redis_backup_%{version}.tar.gz"
fi

# 删除旧版本的服务文件(如果存在)
if [ -f /lib/systemd/system/redis.service ]; then
    rm -f /lib/systemd/system/redis.service
    systemctl daemon-reload
    echo "Old redis.service removed"
fi

%post
# 创建 Redis 用户和组(如果不存在)
groupadd -f -r redis || :  # 创建组,如果已存在则忽略错误
useradd -r -g redis -s /bin/false -M redis || :  # 创建用户,指定组,禁用登录

# 确保数据目录存在并设置权限
mkdir -p /var/lib/redis
chown -R redis:redis /var/lib/redis
chmod 700 /var/lib/redis

# 增加一些补充动作
chown redis:redis /etc/redis.conf
 
chown -R redis:redis  /var/lib/redis/
  
mkdir -p /var/log/redis/
  
touch /var/log/redis/redis.log
  
chown -R redis:redis /var/log/redis/


touch /var/run/redis_6379.pid

chown redis:redis  /var/run/redis_6379.pid

# 重新加载 systemd 配置并启用 Redis 服务
systemctl daemon-reload
systemctl enable redis || :  # 启用服务,忽略可能的错误
systemctl start redis || :  # 尝试启动服务

%preun
if [ $1 -eq 0 ]; then
    # 卸载时停止并禁用 Redis 服务
    systemctl stop redis || :  # 停止服务,忽略可能的错误
    systemctl disable redis || :  # 禁用服务,忽略可能的错误

    # 删除 Redis 服务文件
    rm -f /lib/systemd/system/redis.service
    systemctl daemon-reload || :  # 重新加载 systemd 配置

    # 删除 Redis 用户和组(可选)
    userdel -r redis || :  # 删除用户及其主目录,忽略可能的错误
    groupdel redis || :  # 删除组,忽略可能的错误
fi

%files
/usr/local/bin/redis-server
/usr/local/bin/redis-cli
/usr/local/bin/redis-benchmark
/usr/local/bin/redis-check-aof
/usr/local/bin/redis-check-rdb
/etc/redis.conf
/lib/systemd/system/redis.service
/var/lib/redis/

%changelog
* Tue Feb 11 2025 你的名字 <你的邮箱> - 7.4.2-1
- Initial package for Redis 7.4.2 with configuration file, Tcl dependency, and systemd integration.
- Added backup functionality in %pre script.
复制代码
8. 打包源码成压缩包
将 Redis 源码打包为 .tar.gz 文件,并将其移动到 SOURCES 目录:

tar -czf ~/rpmbuild/SOURCES/redis-7.4.2.tar.gz redis-7.4.2/
9. 构建RPM包
#检查语法
rpmlint ~/rpmbuild/SPECS/redis.spec

#使用 rpmbuild 命令构建 RPM 包:
rpmbuild -ba ~/rpmbuild/SPECS/redis.spec

10.编译完成,验证

rpm包生成在/root/rpmbuild/RPMS/x86_64路径下
yum install 测试是否成功
实现效果应为启动成功且开机自启
注意:文件最大打开数等服务器初始化要提前做

 

posted @   阿锋888  阅读(5)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示