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 を使えるようにすることにした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ grep -i bpf /boot/config-4.14.123-111.109.amzn2.x86_64 CONFIG_CGROUP_BPF=y CONFIG_BPF=y CONFIG_BPF_SYSCALL=y CONFIG_BPF_JIT_ALWAYS_ON=y CONFIG_NETFILTER_XT_MATCH_BPF=m CONFIG_NET_CLS_BPF=m CONFIG_NET_ACT_BPF=m CONFIG_BPF_JIT=y CONFIG_BPF_STREAM_PARSER=y CONFIG_LWTUNNEL_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_BPF_EVENTS=y # CONFIG_TEST_BPF is not set |
amazon linux extras で testing や epel なども探してみたけれど見当たらない。その内パッケージ化されると期待しているけれど確証がないのでとりあえず、ビルドしてみることにした。 ここ にいろんなディストリビューション用の手順について説明があったので、とりあえず 'Amazon Linux 1' 用の説明を参考にしたが、上手くいかなかったところは適宜修正している。
まずビルドに当たって、標準で用意されているパッケージだけではいくつか足りないパッケージがあるので、 epel を有効にする。
1 |
sudo amazon-linux-extras install -y epel |
ビルドツール群のインストール cmake は何も指定しないと バージョン2系がインストールされるので明示的に cmake3 を指定している。
1 |
sudo yum install -y bison cmake3 flex git iperf libstdc++-static python-netaddr gcc gcc-c++ zlib-devel elfutils-libelf-devel |
luajit のインストール。このパッケージは、epel から導入される。
1 |
sudo yum install -y luajit luajit-devel |
netperf のインストール。ライセンスが OSS として認定されていないので、いろんなディストリビューションに取り込まれていないらしい。 bcc の配布元の人が用意してくれているのをとりあえず使った。
1 |
sudo yum install -y http://repo.iovisor.org/yum/extra/mageia/cauldron/x86_64/netperf-2.7.0-1.mga6.x86_64.rpm |
'Amazon Linux 1' 用のインストラクション3 では pyroute2 を pip でインストールするようになっているが、epel にあったのでそっちを使った。特に問題はなさそう。python3 もあったけれど、インスタンスを起動した初期状態では python2 だったのでそっちを使っている。
1 |
sudo yum install -y python2-pyroute2 |
clang や LLVM など。'Amazon Linux 1' 用のインストラクションでは bcc の提供元がビルドしたバイナリ一式を使うようになっているけれど、どこかで ABI が変わってしまったらしく動かない。ちょっと調べてみたら fedora で同様な事象が発生したことがあるらしく4 fedora のインストラクションをみると、パッケージからインストールするように改版されていた。で必要そうなパッケージが 'Amazon Linux 2' でもあったので、それを利用している。
1 |
sudo yum install -y clang clang-devel llvm llvm-devel llvm-static ncurses-devel |
あとは普通にビルドするだけ。
1 2 3 4 5 6 |
git clone https://github.com/iovisor/bcc.git pushd . mkdir bcc/build; cd bcc/build cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr time make sudo make install |
実行に当たっては kernel-devel パッケージが必要
1 |
sudo yum -y install kernel-devel-$(uname -r) |
debugfs もマウントするように指示があるが、EC2 インスタンス上の'Amazon Linux 2' では起動時にマウントされていた。
動作確認してみる。ここでは execve() の実行をトレースしている。実行して少し待つと、dhclient が動作したことがわかる。
1 2 3 4 5 6 |
$ sudo /usr/share/bcc/tools/execsnoop PCOMM PID PPID RET ARGS dhclient-script 19826 2318 0 /usr/sbin/dhclient-script hostname 19828 19827 0 /bin/hostname cat 19830 19829 0 /bin/cat /proc/cmdline cat 19832 19831 0 /bin/cat /proc/cmdline |
これで一応、'Amazon Linux 2' にも bcc が導入できることがわかった。添付しているツール群も興味深いものが多いので 次回 紹介してみたい。