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 を使えるようにすることにした。

$ 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 を有効にする。

sudo amazon-linux-extras install -y epel

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

sudo yum install -y bison cmake3 flex git iperf libstdc++-static python-netaddr gcc gcc-c++ zlib-devel elfutils-libelf-devel

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

sudo yum install -y luajit luajit-devel

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

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 だったのでそっちを使っている。

sudo yum install -y python2-pyroute2

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

sudo yum install -y clang clang-devel llvm llvm-devel llvm-static ncurses-devel

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

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 パッケージが必要

sudo yum -y install kernel-devel-$(uname -r)

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

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

$ 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 が導入できることがわかった。添付しているツール群も興味深いものが多いので 次回 紹介してみたい。


  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↩︎