BPFによるトレーシングが簡単にできる「bpftrace」の使い方:Berkeley Packet Filter(BPF)入門(9)
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載。今回は、「bpftrace」によるトレーシングについて。
Linuxにおける利用が急速に増えている「Berkeley Packet Filter(BPF)」について、基礎から応用まで幅広く紹介する連載「Berkeley Packet Filter(BPF)入門」。前回はBPFによるトレーシングについて、おおまかな仕組みや概要を説明しました。今回は、BPFによる代表的なトレーシングツール「bpftrace」について、具体的にどのようなことができるのかを紹介します。また、bpftraceの注意点や分かりにくい点についてもまとめます。
bpftraceとは
bpftraceはBPFを利用したトレーシングツールの一つです。代表的なBPFのライブラリである「BCC(BPF Compiler Collection)」と同じく、現在は「iovisor」が管理しています。BCCと比較すると、bpftraceはトレース処理に特化し、より簡単に利用できるようになっているといえるでしょう。
bpftraceには下記のような特徴があります。
- トレーシング処理を専用の言語で記述
- BPFプログラム特有の細かい制約や注意事項を気にせずにトレースプログラムが書ける
- 主要トレーシング機能のサポート
- カーネルトレーシング
- tracepoints
- k(ret)probe
- k(ret)func
- perf event
- ユーザープログラムトレーシング
- u(ret)probe
- USDT(Userland Statically Defined Tracing)
- カーネルトレーシング
- カーネルの最新機能の対応
- BTF(BPF Type Format)によるカーネルデータ構造の取得
- BPF Trampolineによるトレーシング
BPFを用いて何かトレーシングしたい場合、一番お薦めのツールです。
bpftraceの入手
bpftraceをインストールする主要な方法を紹介します。前提として、一般にLinux 4.9以上のBPFが有効化されたカーネルが必要です。Ubuntu 18.04+、Fedora 31+、REHL(Red Hat Enterprise Linux) 8、REHL 7(BPF機能がバックポートされている)などで利用できます。もしbpftraceを試すために新規のOS環境を構築する場合は、BTFのサポートがあるFedora 32がお薦めです。
パッケージマネジャーからの入手
多くのパッケージマネジャーでbpftraceを取り扱っています。
sudo snap install bpftrace --devmode sudo snap connect bpftrace:system-trace
Ubuntu 20.04ではaptからもインストールできますが、snap版の方がパッケージの更新頻度が高いです。
sudo dnf install -y bpftrace
パッケージマネジャーに存在するbpftraceは、場合によってはバージョンが古いことがあります。もしバグと思われる挙動に遭遇した場合は、以下の方法で最新版を試してみてください。bpftraceは現在活発に開発されているので、バグが修正されている可能性があります。
GitHubのembeded buildを取得
GitHub Actionsのembedded buildから、最新のビルドを入手することが可能です。
Dockerイメージの利用
quay.ioにbpftraceのDockerイメージがあります。このDockerイメージには最新版のbpftraceが含まれています。このDockerイメージは、以下のようにカーネルソースやdebugfsを適切にコンテナにマウントした上でprivilegeなコンテナとして利用します。
$ docker run -ti -v /usr/src:/usr/src:ro \ -v /lib/modules/:/lib/modules:ro \ -v /sys/kernel/debug/:/sys/kernel/debug:rw \ --net=host --pid=host --privileged \ quay.io/iovisor/bpftrace:latest
コンテナ内の/usr/bin/bpftraceにbpftraceがあります。また/usr/local/bin/以下にbpftraceのスクリプトがインストールされています。
自分でビルドする
bpftraceの最新機能、特にBTFに関する機能を利用する場合は、自分でBCC、libbpfとbpftraceをビルドする必要があります。詳細については「INSTALL.md」を参照してください。
bpftrace入門
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 2017年版Linuxカーネル開発レポート公開――支援している企業トップ10とは?
The Linux Foundationは2017年版Linuxカーネル開発レポートを公開した。Linuxカーネル4.8から4.13までの開発に焦点を当て、カーネル開発に携わった開発者や変更数などについて言及した。 - Linuxカーネルのソースコードを読んで、システムコールを探る
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。前回まで、printf()内の中身をさまざまな方法で探り、write()やint $0x80の呼び出しまでたどり着いた。今回は、さらにその先にあるLinuxカーネル側のシステムコールを見ていく。 - SystemTapで真犯人を捕まえろ!