OrangePi 折騰日記:在 Armbian OS 上編譯安裝 Redis 4

最近折騰了一下本身的 Orange Pi PC,意圖使之從新煥發青春活力。linux

很快,我發現了 Armbian 這一爲 ARM 開發板定製的 Debian GNU/Linux 操做系統。官網上有 Orange Pi PC 的主頁,併爲其提供了 Armbian Stretch (Linux Kernel 4.14) 版本的穩定版鏡像(下載)。Armbian 推薦使用全平臺的 SD 刷寫工具 etcher。並提供了完整的使用手冊git

開機,root 用戶登陸,默認密碼 1234,根據提示重設用戶密碼。github

本想從軟件源中直接安裝 redis。不過,先將軟件源從 debian 官方切換到 USTC。redis

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 產生搶鎖的衝突。shell

而後,發現 debian stretch 提供的 redis 是 4.0 版本,但其依賴的 redis-server 仍然是 3.2 版本,這致使 apt install redis 根本裝不上,不知道軟件源的維護者是怎麼想的。macos

思來想去仍是本身編譯吧,畢竟不難,也常常在 x86_64 的雲服務器上這麼作。json

從 Redis 官網下載最新版源碼,而後解壓編譯安裝,大體有如下幾步:vim

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 時出了問題。bash

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/install-redis-on-armbian/

相關文章
相關標籤/搜索