誰得な記事ですが、晒しておきます。
背景
ワンバイナリで動作する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で、
- Linux 2.6.27 or later
とあります。
確かに動作環境は、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 を使うように修正してみました。
ビルド方法
ソースは、
です。
パッケージ名は修正していないので、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するようなものではないので、このままにしておくつもりです。
この記事が必要な人が他にいないことを祈ります。