在树莓派4上搭建EK-安装kibana

安装kibana其实并不难, 直接下载解压运行kibana就行了。可惜的是,kibana官方只支持X86的架构,对于树莓派的arm,要想运行kibana,得绕些路子。


后来在论坛讨论这个事,得到这样的一个回复:

以后的kibana版本不再依赖nodegit和ctags了,这两个坑算是没有了…


在N次尝试之后,成功在树莓派上运行起了kibana, EK平台就在树莓派上搭建好了。鉴于全网没有一篇文章写如何在树莓派上运行EK(7.x版本),所以就有了这篇文章,给想要在树莓派上搭建EK的做一些参考。

环境

树莓派4 4GB内存 debian buster aarch64位
kibana 7.4.0 (截止2019-10-22)

下载Kibana

没得说的, 先下载kibana的软件包,下载地址
然后解压至/opt

1
tar zxvf kibana-7.4.0-linux-x86_64.tar.gz -C /opt

配置

Kibana 的配置文件位置为config/kibana.yml, 要运行起来,首先要配置elasticsearch的地址,
我的elasticsearch集群部署在三台树莓派上的,elasticsearch地址配置为任意一台树莓派IP即可,
整个配置项如下:

1
2
3
4
5
server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://192.168.1.101:9200"]
xpack.reporting.encryptionKey: "qwertyuiop"
xpack.security.encryptionKey: "vcEYPvXEzeX4qXR9aYhNvleU0stphVpU"

其他的配置项可根据注释和需求自行设置
如果不配置xpack.reporting.encryptionKey和xpack.security.encryptionKey,启动时会有警告,
xpack.reporting.encryptionKey设置为任意字符串,xpack.security.encryptionKey设置为任意32位字符串即可.

运行&解决问题

由于是使用的pi这个普通用户运行,运行时需要对/opt/kibana-7.4.0-linux-x86_64这个目录有读写权限,所以先更改这个目录的所有者:

1
sudo chown -R pi:pi /opt/kibana-7.4.0-linux-x86_64

运行:

1
2
cd /opt/kibana-7.4.0-linux-x86_64
./bin/kibana

如果一切顺利的话毫无疑问会报错:
node报错
原因是kibana自带的node二进制无法在树莓派上的arm平台运行,所以手动下载arm版的node替换掉就行了。
需要下载v10.15.2版本的node.js:

1
wget https://nodejs.org/dist/v10.15.2/node-v10.15.2-linux-x64.tar.xz

下载之后解压:

1
tar vxJf https://nodejs.org/dist/v10.15.2/node-v10.15.2-linux-arm64.tar.xz

将解压后的node-v10.15.2-linux-arm64 文件拷贝到kibana目录中相应的位置:

1
2
3
4
先删除自带的node:
rm -rf /opt/kibana-7.4.0-linux-x86_64/node
再拷贝arm64的node:
cp node-v10.15.2-linux-arm64 /opt/kibana-7.4.0-linux-x86_64/node

再次运行, 毫无疑问,又会报错:
nodegit.node error

nodegit.node 这个模块报错了,原因同上。解决办法是在树莓派上编译一遍nodegit,得到树莓派能运行的版本。
本着能不手动编译就不手动编译的原则,这里使用npm安装nodegit,
先安装npm:

1
sudo apt install npm

然后创建一个临时目录, 在该目录下安装node模块,这里从淘宝的源安装,速度快很多:

1
2
3
mkdir kibana_node_mudules
cd kibana_node modules
npm --registry https://registry.npm.taobao.org install nodegit

安装过程会提示缺少一些依赖,缺什么就安装什么,
依次解决:

1
sudo apt-get -y install gcc libkrb5-dev

其中会提示没有libwebp.so.4和libminizip.so.2.5这两个动态库,
首先安装:

1
2
sudo apt install libwebp-dev
sudo apt install libminizip-dev

然后将这两个软件包中的libwebp.so和libminizip.so分别拷贝一份到系统的/lib目录即可
通过dpkg -L 软件包名来查看安装的软件包的文件路径。

1
2
sudo cp /usr/lib/aarch64-linux-gnu/libwebp.so libwebp.so.4
sudo cp /usr/lib/aarch64-linux-gnu/libminizip.so /lib/libminizip.so.2.5

不出意外,nodegit很快就会装好,在当前目录下的node_modules下,将安装好的适用于本机的nodegit.node替换掉kibana中的nodegit.node

1
2
3
4
先删除kibana自带的nodegit:
rm -rf /opt/kibana-7.4.0-linux-x86_64/node_modules/@elastic/nodegit

cp ./node_modules/nodegit /opt/kibana-7.4.0-linux-x86_64/node_modules/@elastic/

再次启动kibana,nodegit不会报错了,然而…
ctags error

有了解决nodegit报错的经验,这个很简单了, 依旧在kibana_node_mudules目录下:

1
npm --registry https://registry.npm.taobao.org install ctags

安装完成后:

1
2
3
先删除kibana自带的ctags.node:
rm -rf /opt/kibana-7.4.0-linux-x86_64/node_modules/@elastic/node-ctags/ctags
cp -r node_modules/ctags/ /opt/kibana-7.4.0-linux-x86_64/node_modules/@elastic/node-ctags/

再再次启动kibana,能够启动服务,访问IP:5061能看到Kibana的界面,貌似成功了

但是看一下控制台的信息,发现事情没有那么简单…

headless_shell 报错:


看样子也要找一个适用于arm平台的headless_shell 二进制文件替换掉才行…

通过搜索,找到了以下两篇有用的文章:
三分钟学会如何在函数计算中使用 puppeteer
linux – CentOS 7中的chrome-headless安装路径

看起来要安装puppeteer:

1
npm --registry https://registry.npm.taobao.org install puppeteer

关键是这个headless_shell, debian我找遍了也没有找到有关headless_shell的软件包,难道只有编译chromium 的源码了吗?
好不容易将chromium源码下载到树莓派上,准备艰难的编译时,发现在centos下倒是可以安装chrome-headless这个软件包获取到headless_shell文件,
想到centos也有arm64的系统,于是通过关键词 chrome-headless rpm 搜索到了chromium arm64的rpm包,只需解包即可获取到适用于arm64的headless_shell二进制文件
chromium-headless rpm下载,下载aarch64的chromium-headless即可.

使用rpm2cpio解压缩rpm包:

1
2
sudo apt install rpm2cpio
rpm2cpio chromium-headless-77.0.3865.120-2.epel8.playground.aarch64.rpm | cpio -div

在当前目录下的./usr/lib64/chromium-browser/headless_shell即为我们需要的文件。
老规矩,把文件复制过去,再次启动,咦,不太对劲呀,怎么还是报这样的错?难道启动时被修改了?将这个目录设为只读试试,
启动时直接报错崩溃,没有写入权限直接启动报错,沿着报错信息找,原来在启动时会将x-pack/legacy/plugins/reporting/.chromium/chromium-312d84c-linux.zip这个文件解压至kibana路径的data目录,所以只替换解压后的文件解决不了问题,

只有从源头解决,直接替换掉chromium-312d84c-linux.zip整个文件。打开chromium-312d84c-linux.zip可以看到里面是一个headless_shell-linux目录, 该目录下的文件如下:

1
2
3
4
5
.
├── headless_shell
└── swiftshader
├── libEGL.so
└── libGLESv2.so

其中swiftshader目录下的libEGL.so和libGLESv2.so是安装的puppeteer模块中得到的.
将需要的文件打包、重命名、替换,再次启动, 完全OJBK:

后记

在树莓派上运行kibana遇到的主要问题是Kibana自带的一些node模块和已经编译好的headless_shell二进制并不适用于arm架构,所以直接运行会报错退出,
解决办法其实很简单,就是找到对应的适合树莓派的arm平台的二进制文件,替换即可。