ZeroTermux中ArchLinux Redis安装指南

ZeroTermux中ArchLinux Redis安装指南

环境背景

入标题所述,需要在Termux中安装的ArchLinux中安装redis,但是redis有以下限制:

  1. 平台: Termux中安装的ArchLinux
  2. 安装方式: 使用proot方式安装的ArchLinux
  3. 限制: 通过proot安装的Linux无法使用systemctl启动程序
  4. 问题: ArchLinux已经不再支持直接安装Redis

解决方案概述

原始方案(不适用)

  • 从AUR安装Redis: yay -S redis
  • 原因:AUR中的redis包不支持aarch64架构

可行方案

  1. 从源码编译安装(推荐)
  2. 手动启动服务(由于proot环境限制,不能使用systemctl)

可能会遇到的问题:由于手机是ARM64的架构,所以会相对x86_64的架构编译较慢,并且在ArchLinux是运行在proot这个虚拟环境下,关于系统的调用都会有转换成本,所以编译过程会较为缓慢。

安装步骤

  1. 从源码编译Redis,官方支持ARM64架构:
# 下载和编译Redis
wget https://download.redis.io/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
make

启动和使用

可能会遇到的问题

  1. 在ARM64架构下启动Redis时可能遇到内核bug警告:
WARNING Your kernel has a bug that could lead to data corruption during background save.
Redis will now exit to prevent data corruption.

解决方案

# 方法1:命令行忽略警告
./src/redis-server --ignore-warnings ARM64-COW-BUG

# 方法2:在配置文件中添加
# ignore-warnings ARM64-COW-BUG

# 方法3:创建启动脚本
echo '#!/bin/bash' > start_redis.sh
echo './src/redis-server --ignore-warnings ARM64-COW-BUG' >> start_redis.sh
chmod +x start_redis.sh
./start_redis.sh

启动方式

由于proot环境限制,需要手动启动Redis,这里会根据当前系统情况来启动redis,比如由于ARM64架构,所以需要添加--ignore-warnings ARM64-COW-BUG来忽略警告。这里只是解释基本的启动方式,后续会根据基本的启动方式来创建一个控制脚本,方便后续使用。可以看文章里【终极Redis控制脚本】中的脚本内容,根据情况修改脚本,来启动redis。

  1. 启动
# 1. 进入redis-stable安装目录
cd /root/redis-stable

# 方式1:这里没有指定redis配置文件启动,就会使用redis默认的配置文件启动(这个默认的配置文件不是安装目录下的配置文件), 直接启动(含ARM64修复),由于ARM64架构,所以需要添加`--ignore-warnings ARM64-COW-BUG`来忽略警告。
./src/redis-server --ignore-warnings ARM64-COW-BUG

# 方式2:使用配置文件启动并且后台启动
nohup ./src/redis-server --ignore-warnings ARM64-COW-BUG > redis.log 2>&1 &
  1. 测试连接
# 1. 进入redis-stable安装目录
cd /root/redis-stable

# 2. 启动客户端
./src/redis-cli

# 测试连接,结果返回PONG,则表示连接成功
./src/redis-cli ping

配置redis

  1. 配置可以远程访问redis:进入redis.conf,找到protected-mode修改为将yes修改为no,这样就可以通过工具远程访问redis了。
  2. 配置密码:进入redis.conf,找到requirepass,添加密码
requirepass 123456
  1. 重启redis,使配置生效
# 1. 进入redis-stable安装目录
cd /root/redis-stable

# 2. 重启redis
./src/redis-server redis.conf

终极Redis控制脚本(推荐)

为了方便在任意位置管理Redis,已创建专用控制脚本 redis-control.sh

脚本

脚本功能特点

  • 后台启动:自动在后台运行Redis
  • ARM64修复:自动包含--ignore-warnings ARM64-COW-BUG
  • 状态管理:完整的启动、停止、重启功能
  • 状态检查:检查运行状态和连接测试
  • 日志管理:集中的日志文件管理
  • 进程管理:PID文件管理,防止重复启动
  • 全局使用:使用绝对路径,可在任意位置运行

使用方法

# 启动Redis(后台运行)
./redis-control.sh start

# 停止Redis
./redis-control.sh stop

# 重启Redis
./redis-control.sh restart

# 查看状态
./redis-control.sh status

# 查看日志
./redis-control.sh logs

# 显示帮助
./redis-control.sh help

脚本内容

#!/bin/bash

# Redis控制脚本
# 适用于Termux+ArchLinux+proot环境
# 使用绝对路径,可在任意目录下运行

### 文件位置

#- **Redis安装目录**: `/root/redis-stable`
#- **日志文件**: `/tmp/redis.log`
#- **PID文件**: `/tmp/redis.pid`

REDIS_DIR="/root/redis-stable"
REDIS_SERVER="$REDIS_DIR/src/redis-server"
REDIS_CLI="$REDIS_DIR/src/redis-cli"
REDIS_CONF="$REDIS_DIR/redis.conf"
PID_FILE="/tmp/redis.pid"
LOG_FILE="/tmp/redis.log"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 检查Redis是否已安装
check_redis() {
    if [ ! -f "$REDIS_SERVER" ]; then
        echo -e "${RED}错误: Redis服务器未找到在 $REDIS_SERVER${NC}"
        echo "请确保Redis已正确编译安装"
        exit 1
    fi
}

# 启动Redis
start_redis() {
    check_redis
    
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            echo -e "${YELLOW}Redis已经在运行中 (PID: $PID)${NC}"
            return 1
        else
            echo "清理无效的PID文件..."
            rm -f "$PID_FILE"
        fi
    fi
    
    echo -e "${GREEN}启动Redis服务器...${NC}"
    
    # 后台启动Redis,包含ARM64修复
    nohup "$REDIS_SERVER" \
        --ignore-warnings ARM64-COW-BUG \
        --daemonize no \
        --pidfile "$PID_FILE" \
        > "$LOG_FILE" 2>&1 &
    
    # 获取进程ID
    REDIS_PID=$!
    echo "$REDIS_PID" > "$PID_FILE"
    
    # 等待启动
    sleep 2
    
    if ps -p "$REDIS_PID" > /dev/null 2>&1; then
        echo -e "${GREEN}✓ Redis启动成功! PID: $REDIS_PID${NC}"
        echo "日志文件: $LOG_FILE"
        echo "PID文件: $PID_FILE"
    else
        echo -e "${RED}✗ Redis启动失败${NC}"
        echo "查看日志: tail -f $LOG_FILE"
        return 1
    fi
}

# 停止Redis
stop_redis() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            echo -e "${YELLOW}停止Redis服务器 (PID: $PID)...${NC}"
            
            # 尝试优雅关闭
            if [ -f "$REDIS_CLI" ]; then
                "$REDIS_CLI" shutdown 2>/dev/null
                sleep 2
            fi
            
            # 如果还在运行,强制终止
            if ps -p "$PID" > /dev/null 2>&1; then
                kill "$PID"
                sleep 2
                
                # 最后的强制终止
                if ps -p "$PID" > /dev/null 2>&1; then
                    kill -9 "$PID"
                fi
            fi
            
            rm -f "$PID_FILE"
            echo -e "${GREEN}✓ Redis已停止${NC}"
        else
            echo -e "${YELLOW}Redis未运行,清理PID文件${NC}"
            rm -f "$PID_FILE"
        fi
    else
        echo -e "${YELLOW}Redis未运行 (未找到PID文件)${NC}"
    fi
}

# 检查Redis状态
status_redis() {
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        if ps -p "$PID" > /dev/null 2>&1; then
            echo -e "${GREEN}✓ Redis正在运行 (PID: $PID)${NC}"
            
            # 尝试ping测试
            if [ -f "$REDIS_CLI" ]; then
                PING_RESULT=$("$REDIS_CLI" ping 2>/dev/null)
                if [ "$PING_RESULT" = "PONG" ]; then
                    echo -e "${GREEN}✓ Redis连接正常${NC}"
                else
                    echo -e "${YELLOW}⚠ Redis进程存在但无法连接${NC}"
                fi
            fi
            
            return 0
        else
            echo -e "${RED}✗ Redis未运行 (PID文件存在但进程不存在)${NC}"
            rm -f "$PID_FILE"
            return 1
        fi
    else
        echo -e "${RED}✗ Redis未运行${NC}"
        return 1
    fi
}

# 重启Redis
restart_redis() {
    echo -e "${YELLOW}重启Redis...${NC}"
    stop_redis
    sleep 1
    start_redis
}

# 查看日志
logs_redis() {
    if [ -f "$LOG_FILE" ]; then
        echo -e "${GREEN}Redis日志内容:${NC}"
        tail -f "$LOG_FILE"
    else
        echo -e "${YELLOW}日志文件不存在: $LOG_FILE${NC}"
    fi
}

# 显示帮助信息
show_help() {
    echo "Redis控制脚本 - Termux+ArchLinux版本"
    echo ""
    echo "用法: $0 {start|stop|restart|status|logs|help}"
    echo ""
    echo "命令说明:"
    echo "  start   - 启动Redis服务器"
    echo "  stop    - 停止Redis服务器" 
    echo "  restart - 重启Redis服务器"
    echo "  status  - 检查Redis运行状态"
    echo "  logs    - 查看Redis日志"
    echo "  help    - 显示此帮助信息"
    echo ""
    echo "文件位置:"
    echo "  Redis目录: $REDIS_DIR"
    echo "  日志文件: $LOG_FILE"
    echo "  PID文件: $PID_FILE"
}

# 主程序逻辑
case "$1" in
    start)
        start_redis
        ;;
    stop)
        stop_redis
        ;;
    restart)
        restart_redis
        ;;
    status)
        status_redis
        ;;
    logs)
        logs_redis
        ;;
    help|--help|-h)
        show_help
        ;;
    *)
        echo -e "${RED}无效的命令: $1${NC}"
        echo ""
        show_help
        exit 1
        ;;
esac 

创建系统链接, 方便在系统任意位置使用脚本

脚本设置

# 1. 赋予执行权限
chmod +x redis-control.sh

# 2. 创建系统链接(可选)
sudo ln -s 脚本所在目录/redis-control.sh /usr/local/bin/redis

# 3. 或添加到PATH
export PATH="$PATH:/path/to/script/directory"
posted @ 2025-07-03 23:39  Wings~  阅读(55)  评论(0)    收藏  举报