临时小驻

求仁得仁,复无怨怼。

在 Armbian OS 上编译安装 Redis 4

2017-10-16 20:41:00 +0800

最近折腾了一下自己的 Orange Pi PC,试图使之重新焕发青春活力。

很快,我发现了 Armbian 这一为 ARM 开发板定制的 Debian GNU/Linux 操作系统。官网上有 Orange Pi PC 的主页,并为其提供了 Armbian Stretch (Linux Kernel 4.14) 版本的稳定版镜像(下载)。Armbian 推荐使用全平台的 SD 刷写工具 etcher。并提供了完整的使用手册

开机,root 用户登录,默认密码 1234,根据提示重设用户密码。

本想从软件源中直接安装 redis。不过,先将软件源从 debian 官方切换到 USTC。

deb https://mirrors.ustc.edu.cn/debian stretch main contrib non-free
deb https://mirrors.ustc.edu.cn/debian stretch-updates main contrib non-free
deb https://mirrors.ustc.edu.cn/debian stretch-backports main contrib non-free
#deb https://mirrors.ustc.edu.cn/debian stretch/updates main contrib non-free

注意 armbian 会自动每天更新软件包,因此可能会与手动执行 apt 产生抢锁的冲突。

然后,发现 debian stretch 提供的 redis 是 4.0 版本,但其依赖的 redis-server 仍然是 3.2 版本,这导致 apt install redis 根本装不上,不知道软件源的维护者是怎么想的。

思来想去还是自己编译吧,毕竟不难,也经常在 x86_64 的云服务器上这么做。

从 Redis 官网下载最新版源码,然后解压编译安装,大致有以下几步:

wget http://download.redis.io/redis-stable.tar.gz
tar xf redis-stable.tar.gz
cd redis-stable
make && make test
make install

想象是很美好的,但是 make 失败了。根据提示,是在编译 hiredis 和 lua 时出了问题。

hiredis 遇到的问题是:

cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb arm net.c
cc: error: arm: No such file or directory

查看 Makefile 文件发现,这里的 arm 说的应该是环境变量 ARCH。根据 gcc(1) 的描述,看起来这里把 arm 改为 -marm 才对。

比较 trick 的做法是把环境变量 ARCH 临时改掉(如下),改掉后果然没问题了。

# in redis-stable/
ARCH="-marm" make && make test

这已在 GitHub 上有了报告 issue #579,我也将上文所述的解决方案贴了上去。

lua 遇到的问题是:

    LINK redis-server
cc: error: ../deps/lua/src/liblua.a: No such file or directory

尝试去 deps/lua 目录下手动 make,发现需要手动指定平台。

where PLATFORM is one of these:
   aix ansi bsd freebsd generic linux macosx mingw posix solaris

第一次,我使用了 make generic 编译通过,但是在 make test 时遇到测试 lua 脚本时全局变量 cjson 不存在,也就是说 cjson 库没有被编译进去。

第二次,我使用 make linux 编译不通过,因为缺少 readline 和 ncurses 的头文件,安装一下就好了。

apt install libreadline-dev libncurses-dev

现在,便能够成功地编译了,然后 make install 安装即可。接下来,创建运行 redis 所需的配置文件、用户、目录及 systemd 服务。

配置文件可以复制 redis 源码包中的 redis.conf。

# in redis-stable/
cp redis.conf /etc/redis.conf

我们需要以名为 redis 的用户身份来运行 redis-server,这样可最大地限制程序的权限,降低出现漏洞带来的风险。

adduser redis --system --no-create-home --group --shell /sbin/nologin

系统级目录本身属于 root:root,而 redis 用户是无权写入的,常见做法是创建属于 redis 用户的子目录。

redis 的目录需要与 redis.conf 中的配置相对应。

# redis.conf
pidfile "/var/run/redis/6379.pid"
logfile "/var/log/redis/6379.log"
dir "/var/lib/redis/"
(cd /var/run && mkdir redis && chown redis:redis redis)
(cd /var/log && mkdir redis && chown redis:redis redis)
(cd /var/lib && mkdir redis && chown redis:redis redis)

接下来配置 systemd 服务,此类服务一般位于 /lib/systemd/system/。依样画葫芦即可。

vim /lib/systemd/system/redis.service
[Unit]
Description=Redis
After=network.target

[Service]
Type=forking
User=redis
Group=redis
PIDFile=/var/run/redis/6379.pid
ExecStart=/usr/local/bin/redis-server /etc/redis.conf --daemonize yes --supervised systemd
ExecStop=/usr/local/bin/redis-cli shutdown
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
# 重新加载配置
systemctl daemon-reload
# 启动
systemctl start redis
# 开机启动
systemctl enable redis

这会在 /etc/systemd/system/multi-user.target.wants 下建立符号链接,效果等同于

ln -s /lib/systemd/system/redis.service /etc/systemd/system/multi-user.target.wants/redis.service

比如在启动服务的过程中如果遇到什么问题,可根据提示查看 journalctl -xe 排错。

未尽事宜,已与谷歌深度合作,请。

原文链接 https://blog.xupu.name//p/2017-10-install-redis-on-armbian/

如无特别指明,本站原创文章均采用 CC BY-NC-ND 4.0 许可,转载或引用请注明出处,更多许可信息请查阅这里