ARM Linux 安装 Redis 全攻略:四种方案与避坑指南
发布时间:2026/10/7 4:51:56 锦皓数字建站

先说结论在 ARM 架构的 Linux 设备上装 Redis和你在 x86 服务器上敲几条命令不太一样。CPU 指令集、系统库版本、有没有 systemd、甚至内存大小都会影响你怎么装、装完怎么跑。我自己在 ARM 开发板和 ARM 服务器上都折腾过几轮踩过不少坑这篇就把从环境识别到安装、再到配置落地的完整链路捋一遍尤其会把交叉编译、源码编译、Docker 这三条路线讲透。无论你是拿 ARM 板子做边缘计算、在树莓派上跑服务还是给国产 ARM 服务器部署缓存这篇应该都能给你一套能直接照做的方案。这篇文章不是那种“apt install redis-server”就完事的速食教程因为 ARM 设备差异太大一条命令往往解决不了所有问题。我会先从平台识别讲起因为很多坑其实在第一步就埋下了——你连自己手上是 armv7 还是 aarch64 都没搞清后面大概率会白折腾。然后依次覆盖四种安装方式软件源直装、源码编译、交叉编译、Docker 部署。每种都会说清适用场景和坑点。最后补上 Redis 的基础配置、开机自启、常见报错排查。适合刚接触 ARM Linux 的开发者、嵌入式工程师也适合正在把服务往 ARM 平台上迁移的运维同学。1. 先想清楚ARM 上的 Redis和 x86 差别在哪很多人上来就查“Linux 安装 Redis 教程”照着 x86 的步骤走一遍然后在 ARM 设备上报错报得莫名其妙。归根结底是因为你没有意识到 ARM 平台有几个隐藏变量。1.1 架构差异不只是“ARM”三个字母ARM 不是一种单一的架构。粗略分32 位的叫 armv7l常见于老款树莓派、各种 ARM 开发板64 位的叫 aarch64也叫 ARM64今天的树莓派 4B/5、瑞芯微 RK3588 开发板、鲲鹏和飞腾服务器全是这个。这两个架构的软件包不通用32 位系统装不了 64 位软件包反之亦然。还有一个变量是浮点运算单元FPU。同样是 armv7l有的系统是硬浮点hardfp有的系统是软浮点softfp这直接影响二进制程序的兼容性。Redis 对浮点性能没那么敏感不至于跑不起来但如果你用某些第三方编译好的二进制就有可能出现“Illegal instruction非法指令”直接崩掉大概率就是浮点 ABI 不匹配。判断方法很简单在终端里执行uname -m输出aarch6464 位 ARM 架构最省心。输出armv7l或armv6l32 位 ARM注意看后续适配。再看一下系统信息cat /etc/os-release这个能告诉你系统和包管理器版本决定你是用apt、yum还是dnf以及系统的 glibc 版本到底新不新。glibc 版本太老的话直接决定了你能不能跑最新版 Redis。1.2 设备环境和 x86 服务器差在哪ARM 设备分两类一类是开发板树莓派、香橙派、各种派一类是 ARM 服务器华为鲲鹏、飞腾、Ampere 等。开发板的典型特点是内存可能只有 1~8GB存储是 TF 卡或 emmcCPU 性能比同价位 x86 弱一些但功耗极低ARM 服务器则相对正经一些内存和 CPU 都够用基本可以当成 x86 服务器来看只是架构不同。内存紧张这件事对 Redis 影响很大。Redis 是内存数据库数据全放内存里如果板子只有 1GB 内存默认配置的maxmemory没有限制再加上 Redis 的默认快照机制RDB一个不小心就可能把内存吃满然后整个系统进入卡死状态甚至连 SSH 都连不上。同时很多 ARM 开发板的 Linux 系统是裁剪过的没有 systemd只能靠init.d脚本管理服务。这会影响你“要不要写 systemd unit 文件”的决策后面会详细讲。2. 安装前必须要做的三件准备不要急着敲安装命令。先花三分钟把以下三件事做了后面会少踩很多坑。2.1 确认 CPU 架构和系统版本刚才提到的uname -m是第一步但还不够。我建议再确认内核和编译器信息uname -a gcc --version 2/dev/null || echo 没有安装 gcc ldd --version | head -n1uname -a能同时看到内核版本和架构信息。gcc是后面源码编译要用的如果没有要么装上要么直接走软件源安装路线。ldd --version能显示 glibc 版本比如2.31-0ubuntu9.9这个版本号决定了你能否运行新版 Redis——如果 glibc 是 2.17 这种老版本新版 Redis比如 7.x可能直接编译不过或者就算编译过去了运行也会报version GLIBC_2.18 not found。2.2 检查网络源和包管理器可用性安装 Redis 前你需要确认设备能访问软件源。ARM 架构的软件源和 x86 是分开的比如 Ubuntu 的 ARM 源用的是ports.ubuntu.com而不是archive.ubuntu.com。如果你在一台 ARM 设备上用错了源apt update会一直报错或者拿到一堆不兼容的包。建议先跑一次sudo apt update如果这个命令通畅那说明源配置没问题。如果报错先检查/etc/apt/sources.list或/etc/apt/sources.list.d/下的文件把架构相关的源地址确认好。2.3 规划 Redis 的可执行文件路径和配置路径这一点很多人会忽略。不同的安装方式Redis 会被放到不同的路径下后续运维就跟着变软件源安装可执行文件在/usr/bin/配置文件在/etc/redis/redis.conf数据目录/var/lib/redis/。源码编译安装默认在/usr/local/bin/配置文件在/usr/local/etc/redis.conf不过用 make install 的话一般在/usr/local/bin/配置默认路径是/etc/redis/redis.conf需要手动拷贝。交叉编译安装路径由你编译时指定的PREFIX决定可能是/opt/redis等。Docker 部署可执行文件在容器内宿主机只需要管数据卷。这个路径规划其实直接影响你后续写 systemd 服务、做开机自启、配置数据持久化。我建议在安装前就定下来免得后面乱。3. 方案一软件源直装最快但别盲目如果你用的是树莓派 OS、Ubuntu ARM、Debian ARM 这类主流系统软件源直装是最快的方式。这个方案适合“不想折腾、能用就行”的场景。3.1 主流发行版的安装命令不同发行版命令不一样# Debian / Ubuntu / Raspberry Pi OS sudo apt update sudo apt install -y redis-server # CentOS / Rocky Linux / FedoraARM 版 sudo dnf install -y redis # 或者老版本 CentOS 7 用 yum sudo yum install -y redis安装完之后验证一下redis-server --version redis-cli ping如果返回PONG说明服务已经起来了。在 Debian/Ubuntu 系上软件源会自带 systemd 服务直接就能开机自启sudo systemctl status redis-server3.2 源直装的坑点版本旧、配置要手工调软件源直装最大的问题有两个。第一是版本可能偏旧。Ubuntu 20.04 的软件源里 Redis 是 5.0.7Ubuntu 22.04 是 6.0.16Debian 11 是 6.0.x。如果你需要用到 Redis 7 的 Listpack 优化、WAITAOF命令或者 ACL 的更强功能就得考虑源码编译或换源。当然如果你的业务只是拿 Redis 做缓存和队列5.0/6.0 完全够用没必要追新。第二是软件源装完之后默认配置未必贴合你的设备。比如 Debian/Ubuntu 包装完以后Redis 默认只绑定127.0.0.1这个对单机使用没问题但如果你想让局域网内的其他设备访问需要改配置文件里的bind行和protected-mode。改完配置重启服务sudo systemctl restart redis-server3.3 没有 systemd 的开发板怎么管理服务不是所有 ARM 设备都有 systemd。我手上一块老旧的 ARM 板子跑的是精简版系统只有init.d。这时候你会郁闷地发现systemctl命令不存在。没关系安装完 Redis 之后直接用 Redis 自带的服务管理方式先确认 redis-server 进程在跑ps aux | grep redis如果没有在跑用redis-server /etc/redis/redis.conf --daemonize yes启动或者用/etc/init.d/redis-server start如果 init 脚本存在如果要做到开机自启可以在/etc/rc.local里加一行/usr/bin/redis-server /etc/redis/redis.conf --daemonize yes注意rc.local需要可执行权限如果系统里没有这个文件可以自己创建并写入上面的内容。4. 方案二源码编译最稳也最可控如果你的系统比较老、软件源里的 Redis 版本太低或者你想用最新特性那就走源码编译。源码编译在 ARM 架构上其实没那么恐怖——Redis 是一个出了名依赖少的软件它的核心依赖只有一个 libc比编译 Nginx 还要省心。4.1 从官网下载源码并解压注意下载源码前最好确认设备的 CPU 架构是否匹配官网提供的源码包——其实源码是不区分架构的任何架构都可以编译同一份源码这里说的“匹配”是指操作系统和编译工具链匹配。源码包是.tar.gz格式没有架构区别。wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar xzf redis-7.2.4.tar.gz cd redis-7.2.4如果 wget 没安装可以用curl -O或者直接在电脑上下载好再用 U 盘拷到设备上。国内网络访问官网可能比较慢可以找国内的镜像源下载注意核对 SHA256 校验值即可。4.2 编译的三种情况和内存陷阱编译命令本身很简单make但“简单”只适用于内存充足、编译工具齐全的设备。这里有个很现实的坑ARM 开发板往往内存小编译时容易内存不足被 OOM Kill 掉。Redis 编译时默认是单进程编译但 gcc 吃内存的量也不小1GB 内存的板子编译 Redis 7.x 时可能会出现gcc: internal compiler error: Killed之类的报错。解决办法有两个一是加 swap。给板子加一个 2GB 的 swapfilesudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile二是用较低的并发数编译减少内存压力make -j1如果编译出现MALLOCjemalloc相关报错可以试试make MALLOClibc这里解释一下原因Redis 默认使用 jemalloc 作为内存分配器它对碎片优化更好但在某些 ARM 设备上glibc 的版本和 jemalloc 配合会出问题或者缺少编译器依赖文件导致编译中断。改成 libc 后稳定性优先适合开发板这种内存不大的场景。4.3 源码编译后要不要 make installmake结束后在src/目录下会生成redis-server和redis-cli。你可以直接这样启动./src/redis-server但更规范的做法是sudo make install这个命令会把 Redis 可执行文件安装到/usr/local/bin/然后手动拷贝配置文件sudo mkdir -p /etc/redis sudo cp redis.conf /etc/redis/ sudo cp sentinel.conf /etc/redis/之后再修改/etc/redis/redis.conf里的daemonize yes以守护进程方式运行启动就变成了redis-server /etc/redis/redis.conf源码编译这个方式的优势是灵活、版本新、路径可控。缺点是升级没那么方便以后 Redis 出新版本得重新下载编译一遍。5. 方案三交叉编译救活老旧开发板交叉编译是 ARM 开发中绕不开的话题。很多时候你手里的 ARM 板子其性能连源码编译都吃力——比如我看到的热词里就有“arm 交叉编译”“arm a57 ipc”这类搜索。这种场景下你会在 x86 的电脑上编译出 ARM 架构的二进制然后再丢到 ARM 设备上跑。5.1 准备交叉编译工具链要在 x86 主机上编译出 ARM 程序你得装交叉编译器。常见的组合有对于 32 位 ARMarm-linux-gnueabihf-gcc对于 64 位 ARMaarch64-linux-gnu-gcc在 Ubuntu x86 主机上安装sudo apt install -y gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu安装完后检查交叉编译器是否存在arm-linux-gnueabihf-gcc --version aarch64-linux-gnu-gcc --version5.2 Redis 的交叉编译流程Redis 的 Makefile 对交叉编译支持得还算可以但也有需要注意的坑。流程如下# 先下载解压源码 wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar xzf redis-7.2.4.tar.gz cd redis-7.2.4 # 清理之前的编译产物 make distclean # 指定交叉编译工具链进行编译 make CCaarch64-linux-gnu-gcc MALLOClibc如果是 32 位 ARMmake CCarm-linux-gnueabihf-gcc MALLOClibc这里特别说一下MALLOClibc。交叉编译时Redis 默认会去交叉编译工具链里找 jemalloc 源码并尝试编译但这一步经常因为工具链不完整而失败。直接指定MALLOClibc用 glibc 自带的内存分配器交叉编译的成功率会大幅提升。编译完成后在src/目录下会生成redis-server和redis-cli。file src/redis-server这个file命令很关键它能确认生成的二进制确实是 ARM 架构# 64位 ARM 的期望输出 src/redis-server: ELF 64-bit LSB executable, ARM aarch64, ... # 32位 ARM 的期望输出 src/redis-server: ELF 32-bit LSB executable, ARM, EABI5 (hard-float), ...5.3 交叉编译后的关键动作生成的二进制不能直接在 x86 主机上运行你需要拷贝到 ARM 设备上scp src/redis-server src/redis-cli root你的ARM设备IP:/usr/local/bin/到了设备上后如果直接运行报Permission denied记得加执行权限chmod x /usr/local/bin/redis-server /usr/local/bin/redis-cli还有一个极容易忽略的点glibc 版本兼容性。你在 x86 主机上交叉编译时链接的 glibc 版本会写进二进制的动态段里。如果 ARM 设备上的 glibc 版本比编译环境的低运行时会报./redis-server: /lib/aarch64-linux-gnu/libc.so.6: version GLIBC_2.34 not found这时候有两种解法一是换一个更老的交叉编译工具链比如用aarch64-linux-gnu-gcc-9而不是-12二是直接在设备上看ldd --version然后选择与之匹配的工具链版本。这点特别考验经验我刚开始交叉编译时就因为这个 glibc 版本不匹配在目标设备上折腾了大半天。6. 方案四Docker 一把梭但镜像选错就翻车ARM 设备上跑 Docker 已经非常普及了尤其是一些厂商推出的 ARM 开发板自带 Docker 环境。Docker 部署 Redis 的优势是环境隔离、升级方便但前提是你知道 Docker 镜像和 ARM 架构的关系。6.1 multi-arch 镜像和架构匹配从 Docker Hub 拉取官方 Redis 镜像时Docker 会根据宿主机的架构自动拉取对应架构的镜像。比如在 aarch64 设备上执行docker pull redis:7会拉取redis:7的 ARM64 版本不需要你做额外动作。前提是你的 Docker 版本不要太老Docker 20.10 对 multi-arch 支持较好你的 Docker 开启了 containerd 镜像存储新版默认开启如果拉下来的镜像跑不起来可以先检查一下镜像架构是不是和宿主机匹配docker image inspect redis:7 | grep Architecture正常情况下输出是arm64或amd64如果你在一台 ARM 设备上看到amd64说明镜像拉错了多半是因为 registry 的 manifest 没匹配上。这种问题通常出现在手动指定 digest 或者使用第三方镜像源时。6.2 ARM 设备上 Dockcer 跑 Redis 的常用命令启动一个最简 Redis 容器docker run -d \ --name redis \ -p 6379:6379 \ -v redis-data:/data \ redis:7 \ redis-server --appendonly yes把redis-data数据卷挂载到容器内的/data开启 AOF 持久化。这个命令在 ARM 和 x86 上是通用的。这里有个 ARM 相关的特殊坑如果设备是 32 位 ARMarmv7l有些新的 Redis 镜像可能不再提供 32 位 ARM 架构的版本。比如 Redis 7.x 官方镜像的 armv7 支持有时会滞后或者干脆不给特定小版本。这时候你只能选择较旧版本镜像或者直接走源码编译路线。我建议 ARM 32 位设备上就别折腾 Docker 了直接编译或交叉编译更省心。6.3 容器内 Redis 的内存限制Docker 容器如果不用--memory限制内存容器可以吃满整个宿主机的内存。在内存有限的 ARM 板子上这是一个危险信号。我建议至少做两层限制docker run -d \ --name redis \ -m 512m \ --memory-swap 512m \ -p 6379:6379 \ -v redis-data:/data \ redis:7 \ redis-server --appendonly yes --maxmemory 400mb第一层是 Docker 的-m 512m限制容器总内存第二层是 Redis 自己的--maxmemory 400mb限制 Redis 数据最大占用。为什么要两层同时限因为 Redis 的 overcommit内存过度分配机制可能导致容器内存消耗超过 Redis 本身的数据量比如 RDB 保存、AOF 重写时内存会翻倍Docker 限制只在系统层兜底Redis 的限制则是从业务层控制两个不冲突。7. 装完之后Redis 落地的关键配置好Redis 不管用哪种方式装好了接下来这一节是真正决定“能不能用”的环节。很多人输入redis-server看到启动成功就以为完事了等业务跑挂了才发现一堆坑。7.1 内存规划与 maxmemory 设置Redis 是内存型数据库如果放任不管数据量一旦超过物理内存系统就会开始用 swap性能瞬间崩盘。在 ARM 设备上尤其需要提前设置。打开配置文件sudo nano /etc/redis/redis.conf找到maxmemory配置项按设备物理内存的比例设置maxmemory 256mb maxmemory-policy allkeys-lrumaxmemory-policy是内存达到上限后 Redis 的行为。allkeys-lru表示对所有 key 执行 LRU 淘汰策略适合做缓存时用noeviction则是达到上限后不再写入新数据并返回错误适合做消息队列或需要严格保留数据的场景。开发板这种资源受限场景我一般推荐allkeys-lru。7.2 持久化策略选择Redis 持久化有 RDB快照和 AOF追加日志两种。在 ARM 开发板这种存储性能一般的设备上需要特别斟酌。默认配置是 RDB按时间间隔把内存数据 dump 到磁盘。好处是文件小、恢复快坏处是两次快照之间的数据可能丢失。AOF 则记录每次写操作数据安全性更高但文件体积大、写入压力也大。在 TF 卡上跑 AOF写入频繁会让 TF 卡寿命加速衰减。我个人在 ARM 板子上的建议是如果只是做缓存开 RDB 就够甚至可以把 RDB 的保存频率降低如果做真实数据存储开 AOF但调大appendfsync的间隔从 everysec 调整到 always或者用默认的 everysec减少对 TF 卡的写入频率。appendonly yes appendfsync everysec7.3 远程访问与安全配置Redis 默认只绑定127.0.0.1这意味着局域网内的其他机器访问不了。如果你确实需要远程访问修改 bind 项bind 0.0.0.0 protected-mode yes requirepass yourpassword这里特别强调一下protected-mode yes千万别改成 no除非你确定网络环境完全可信。Redis 在没有密码且 protected-mode 关闭的情况下暴露到公网就等于把数据裸奔——网上有太多扫描 Redis 端口做挖矿的扫描器我见过不少开发板因为开着 Redis 没密码被人植入挖矿程序的案例。requirepass设置强密码是底线。改完配置重启 Redissudo systemctl restart redis-server # 或者如果没有 systemd redis-cli shutdown redis-server /etc/redis/redis.conf7.4 开机自启配置如果系统有 systemd软件源安装的 Redis 已经自带了服务文件不需要额外操作。但如果是源码编译安装你可能需要手写一个 service 文件。创建一个/etc/systemd/system/redis.service[Unit] DescriptionRedis Server Afternetwork.target [Service] Typeforking ExecStart/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop/usr/local/bin/redis-cli shutdown Restartalways Userredis Groupredis RuntimeDirectoryredis RuntimeDirectoryMode0755 [Install] WantedBymulti-user.target然后sudo systemctl daemon-reload sudo systemctl enable redis sudo systemctl start redis这里有个细节Typeforking要求配置文件里daemonize yes因为 Redis 以守护进程方式启动时父进程退出、子进程驻留Systemd 需要知道这个行为模式。如果用 Redis 7.x 默认的daemonize no就改成Typesimple。用户和权限这里也容易踩坑如果以 root 运行 RedisRedis 会有安全警告。建议创建一个专有用户。sudo useradd --system --user-group redis sudo chown -R redis:redis /var/lib/redis /etc/redis然后用redis用户运行服务。8. 装完之后验证和常见问题速查最后一部分我整理几个安装和运行过程中最常遇到的报错以及我的排查思路。这些全是实际踩坑记录不是网上抄来的。8.1 验证 Redis 是否正常工作安装完成后建议完整做一遍以下验证流程# 1. 查看 Redis 进程是否运行 ps aux | grep redis # 2. 查看端口监听 netstat -tlnp | grep 6379 # 3. ping 测试 redis-cli ping # 4. 写入和读取测试 redis-cli set test_key hello arm redis-cli get test_key # 5. 查看 Redis 关键信息 redis-cli info serverinfo server的输出会包含arch_bits64、process_id、uptime_in_seconds等信息通过这些可以判断 Redis 的运行状态和编译架构。8.2 常见问题与排查技巧问题现象可能原因排查与解决Illegal instruction (core dumped)CPU 架构不匹配或 FPU ABI 不一致用file redis-server确认架构用uname -m对比确认是否硬浮点版本GLIBC_X.XX not found编译环境的 glibc 比目标设备新在目标设备执行ldd --version更换更老的交叉编译工具链gcc: internal compiler error: Killed编译时内存不足被 OOM Killed加 swap用make -j1降并发或改用交叉编译jemalloc编译报错工具链不完整或 ARM 兼容问题改用make MALLOClibc连接被拒Connection refused端口未监听或 Redis 未启动检查进程、端口、配置文件 bind 项ERR Client sent AUTH, but no password is set客户端发送了 AUTH 但服务端没有设置密码在配置里requirepass设置密码或客户端去掉密码参数MISCONF Redis is configured to save RDB snapshots磁盘剩余空间不足或权限问题检查磁盘df -h确保数据目录有写权限Cant open the log fileRedis 日志目录无权限创建日志目录并设置归属sudo mkdir -p /var/log/redis sudo chown redis:redis /var/log/redisDocker 拉取的镜像无法运行镜像架构与宿主机不匹配docker image inspect redis:7 | grep Architecture确认改为源码编译8.3 几个实用小技巧我最后分享几个自己日常用得很顺手的操作。用redis-cli --stat实时监控 Redis 状态这个命令会每秒钟刷新一次关键指标查看内存变化、客户端连接数、命中率非常直观redis-cli --stat用redis-benchmark测一下 ARM 设备的性能看看到底能撑多少并发redis-benchmark -q -n 100000 -c 50这个输出里能看到每秒处理请求数对于判断“这块开发板适合跑多大业务量”很有参考价值。我测过一块 RK3399 开发板6 个核心跑 Redis 2.6 万个请求/每秒做中小型个人项目的缓存完全够了。修改完配置一定要先redis-cli config rewrite再重启其实更好的做法是先用redis-cli config set在线调整确认没问题后再用config rewrite写回配置文件。这样就不用重启 Redis不会中断业务。比如redis-cli config set maxmemory 256mb redis-cli config rewrite8.4 关于 ARM Linux 上安装 Redis 的最后一点经验在 ARM 设备上装 Redis真的不是跑完一条命令就结束的事。回头看我自己的经历比例大概是这样架构识别遇到问题占两成编译内存不够占两成glibc 版本不匹配占一成真正配置出问题占了剩下的五成。这也说明了一个道理——装 Redis 本身只是开始把服务调好、跑稳才是在 ARM 设备上真正需要花功夫的地方。如果你手上是开发板我建议优先试软件源直装装完立即设置maxmemory和密码如果你是给老设备做移植或者板子性能太弱交叉编译是正路但要格外注意 glibc 版本如果用的是 Docker容器内存限制和持久化方案提前想好。按这条路径走下来不说一次成功至少能少踩一半的坑。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。