bcc を Amazon Linux 2 に導入してみたときのメモ

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2019年8月1日追記

bcc は amazon linux extras からも導入できる様になってました。詳細はこちらをご覧ください。
Amazon Linux 2 に Amazon Linux Extra から bcc を導入する手順

System Performance の神様だと勝手に思っている Brendan Gregg 先生が eBPF 本の新刊を出される1 と聞いて、 eBPF を使用できる環境を確認してみた。Gregg 先生の一押しは bcc 経由での使用をおすすめされているので bcc について調べてみた。

僕が使いそうな範囲で見ると殆どの環境で bcc のパッケージが用意されている2 ようなのだが、今多分一番個人的に利用する機会が多いと思われる ’Amazon Linux 2’ については、パッケージについての記載もなくまた、ソースからのビルド手順も記載がなかった。 CentOS はまだパッケージが無さそうだけれど、RHEL 7.6 以降、および RHEL 8 で対応しているようなので、いずれ CentOS でもパッケージが提供されると思われる。

実際に Amazon Linux 2 で EC2 インスタンスを起動して、確認してみると以下のように kernel 上で eBPF 自体は有効になっているので、無理矢理使えば使えないことはないのだけれど、ちょっと難しいことをやろうとすると脆弱な僕の心が折れそうなので、素直に bcc を使えるようにすることにした。

amazon linux extras で testing や epel なども探してみたけれど見当たらない。その内パッケージ化されると期待しているけれど確証がないのでとりあえず、ビルドしてみることにした。 ここ にいろんなディストリビューション用の手順について説明があったので、とりあえず ‘Amazon Linux 1’ 用の説明を参考にしたが、上手くいかなかったところは適宜修正している。

まずビルドに当たって、標準で用意されているパッケージだけではいくつか足りないパッケージがあるので、 epel を有効にする。

ビルドツール群のインストール cmake は何も指定しないと バージョン2系がインストールされるので明示的に cmake3 を指定している。

luajit のインストール。このパッケージは、epel から導入される。

netperf のインストール。ライセンスが OSS として認定されていないので、いろんなディストリビューションに取り込まれていないらしい。 bcc の配布元の人が用意してくれているのをとりあえず使った。

‘Amazon Linux 1’ 用のインストラクション3 では pyroute2 を pip でインストールするようになっているが、epel にあったのでそっちを使った。特に問題はなさそう。python3 もあったけれど、インスタンスを起動した初期状態では python2 だったのでそっちを使っている。

clang や LLVM など。’Amazon Linux 1′ 用のインストラクションでは bcc の提供元がビルドしたバイナリ一式を使うようになっているけれど、どこかで ABI が変わってしまったらしく動かない。ちょっと調べてみたら fedora で同様な事象が発生したことがあるらしく4 fedora のインストラクションをみると、パッケージからインストールするように改版されていた。で必要そうなパッケージが ‘Amazon Linux 2′ でもあったので、それを利用している。

あとは普通にビルドするだけ。

実行に当たっては kernel-devel パッケージが必要

debugfs もマウントするように指示があるが、EC2 インスタンス上の’Amazon Linux 2′ では起動時にマウントされていた。

動作確認してみる。ここでは execve() の実行をトレースしている。実行して少し待つと、dhclient が動作したことがわかる。

これで一応、’Amazon Linux 2’ にも bcc が導入できることがわかった。添付しているツール群も興味深いものが多いので 次回 紹介してみたい。


  1. BPF Performance Tools (book)↩︎
  2. Installing BCC↩︎
  3. Installing BCC Amazon Linux – Source↩︎
  4. Clean build on FC24 and LLVM 3.7.1/3.8.1 fails with linker errors #721↩︎