ブログ

Armadillo-IoTでfluent bitを動かしてみる

at_takenoshita
2015年6月11日 0時19分

トレジャーデータさんから、fluent bitというものがリリースされました。

FluentBit | Data Collection for Embedded Linux : http://fluentbit.io/

fluentdのような動きをする、C/C++で書かれたプログラムです。 fluentdのように、プラグイン形式でinput/outputの機能を拡張できます。 OSSとしてgithub上で公開されており、Apache 2.0ライセンスです。

https://github.com/fluent/fluent-bit

2015/06/01に開発者が来日し、「Fluentd Meetup 2015 夏」でお披露目されたのが、最初の情報のようです。

http://eventdots.jp/event/495315

http://www.slideshare.net/eventdotsjp/fluentbit

Armadillo-IoTでも採用したいので動かしてみたのですが、Linuxカーネルが古すぎて上手くありませんでした。(残念) Armadillo-IoTのLinuxカーネルは3.14にバージョンアップ予定ですので、3.14カーネル公開後に、再度情報をアップしたいと思います。

とありあえずは、動かしてみたときのメモを。

1. ソースからクロスビルドする手順

fluent bitはCMakeでビルドするので、開発環境(ATE5)にcmakeをインストールする必要があります。

[ATDE ~]$ sudo apt-get install cmake

git hubからソースコードを持ってきて、ビルドします。 CMakeでクロスコンパイルするには、toolchain fileというものを用意してあげる必要があります。

[ATDE ~]$ git clone https://github.com/fluent/fluent-bit.git
[ATDE ~]$ mkdir cross-build install && cd cross-build
[ATDE ~/cross-build]$ vi arm-linux-gnueabi.cmake (toolchain fileの用意。下記からダウンロードしてください。)
[ATDE ~/cross-build]$ cmake -DCMAKE_TOOLCHAIN_FILE=arm-linux-gnueabi.cmake -DCMAKE_INSTALL_PREFIX=../install ..
[ATDE ~/cross-build]$ make && make install

ダウンロード: toolchain file

上記手順を実行すると、installディレクトリにbin/fluent-bitとlib/libfluent-bit.so ができるので、 Armadilloにコピーすれば動作します。

Armadillo上では下記のように実行できます。(libfluen-bit.soは、ライブラリ検索パスの通ったところに置いてください。)

[armadillo ~]# ./fluent-bit -i mem -o stdout

2. 古いカーネルで動かす場合

fluent bitでは、 kernel 2.6.27(glibc 2.9)でサポートされたepoll_create1()を使っているので、 linux 2.6.26ベースのカーネルを採用しているArmadillo-IoTでは、そのままでは動きません。 (segmentation faultとなります。)

epoll_create1()をepoll_create()に書き換えてあげれば、とりあえず動きました。

diff --git a/lib/mk_core/mk_event_epoll.c b/lib/mk_core/mk_event_epoll.c
index ad4b2bc..6ae6e73 100644
--- a/lib/mk_core/mk_event_epoll.c
+++ b/lib/mk_core/mk_event_epoll.c
@@ -36,7 +36,7 @@ static inline void *_mk_event_loop_create(int size)
     }

     /* Create the epoll instance */
-    ctx->efd = epoll_create1(EPOLL_CLOEXEC);
+    ctx->efd = epoll_create(1);
     if (ctx->efd == -1) {
         mk_libc_error("epoll_create");
         mk_mem_free(ctx);

プラグイン形式で拡張できる点が良いですね。今後の展開に期待しています。