最近折騰了一下本身的 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
排錯。
未盡事宜,已與谷歌深度合做,請。