読者です 読者をやめる 読者になる 読者になる

kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

古いLinux Kernelでfluent-agent-hydraを動かす

誰得な記事ですが、晒しておきます。

背景

ワンバイナリで動作するfluent-agent-hydraが適する状況があったので採用することにしました。

が、いざ動作させようとすると、https://github.com/fujiwara/fluent-agent-hydra/blob/master/hydra/in_tail.go#L41 で、fsnotify.Watcher を作成できずに失敗しました。

hydraで使われているfsnotifyはGitHub - fsnotify/fsnotify at v1.4.2で、

とあります。

確かに動作環境は、CentOS/RHEL 5で、カーネルのバージョンが古いです。

こんな環境使うなというご指摘はごもっともですが、そこは闇の世界ということで、これを動かそうとしたのがこの記事です。

対策

inotify自体は Man page of INOTIFY_INIT によると kernel 2.6.13 からあります。で、CentOS/RHEL 5系は 2.6.18 なので inotify はあるはず。

が、 fsnotify は 2.6.27 で追加された inotify_init1() を呼び出しています( https://github.com/fsnotify/fsnotify/blob/v1.4.2/inotify.go#L39 ) 。

一方で、fsnotify の一つ前のバージョン fsnotify.v0 - gopkg.in/fsnotify.v0 では、https://github.com/fsnotify/fsnotify/blob/v0.9.3/fsnotify_linux.go#L111 のように inotify_init() を使っていいます。

ということで、hydra を gopkg.in/fsnotify.v0 を使うように修正してみました。

ビルド方法

ソースは、

github.com

です。

パッケージ名は修正していないので、go get ではインストールできません。また CentOS/RHEL 5 ではSSLの問題ぽくて(詳細未調査)、gopkg.in から clone できないので、別な環境でクロスコンパイルなりをする感じとなります。

以下、手順です。goのインストール、GOPATHの設定は済んでいるものとします。

gox をインストール。

$ go get github.com/mitchellh/gox

ディレクトリを用意して、移動。

$ mkdir -p $GOPATH/src/github.com/fujiwara
$ cd $GOPATH/src/github.com/fujiwara

ソースを取得

$ git clone git@github.com:kikumoto/fluent-agent-hydra.git
$ cd fluent-agent-hydra
$ git checkout el5

ビルド

$ make get-deps
$ make binary

これで、pkg ディレクトリ以下にバイナリができるので、適切なものを実行環境に持っていけば完了です。

とりあえず、これで動作しているぽいです( make test も通りました )。

まとめ

fluent-agent-hydra を CentOS/RHEL 5 といった古いカーネルで動かすようにしました。

GitHub - kikumoto/fluent-agent-hydra: A Fluentd log agent.

これから hydra、とても重宝しそうです。ありがたい。

なお、さすがにこれはPRするようなものではないので、このままにしておくつもりです。

この記事が必要な人が他にいないことを祈ります。