定制编译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 测试是否成功
实现效果应为启动成功且开机自启
注意:文件最大打开数等服务器初始化要提前做
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)