この記事はQiitaからの移行記事です。内容が古い場合があります。
次の参考サイトをFedora 29ではなく、Ubuntu 18.04LTSで行う方法についてまとめる。
Ubuntu 18.04のカーネルを更新
Ubuntu 18.04のデフォルトカーネルは4.15です。そのため、まずLinux Kernelを更新しましょう。
% sudo apt install linux-image-generic-hwe-18.04 && sudo reboot
その他必要なパッケージの導入
BCCのインストールは以下のページを参考に。
次の手順でパッケージを追加しておく。
% sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD % echo "deb https://repo.iovisor.org/apt/$(lsb_release -cs) $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/iovisor.list % sudo apt update % sudo apt install bcc-tools libbcc-examples linux-headers-$(uname -r) linux-tools-$(uname -r) python3-bcc
/usr/share/bcc/tools
にbcc-toolsのスクリプトがインストールされる。
bpftoolのビルド
Ubuntu向けにbpftoolはまだ提供されていないらしい(bug1774815)のでビルドする。
Ubuntuカーネルのソースを使う場合は次の通り。
% sudo apt install build-essential linux-source-4.18.0 binutils-dev libelf-dev % cp /usr/src/linux-source-4.18.0/linux-source-4.18.0.tar.bz2 ~ % tar vxf linux-source-4.18.0.tar.bz2 % make -C ~/linux-source-4.18.0/tools/bpf/bpftool
bpftoolを使ってみる
% cp tools/bpf/bpftool/bpftool /usr/local/bin/ % bpftool --version % bpftool v4.18.0
# bpftool prog 2: cgroup_skb tag 7be49e3934a125ba gpl loaded_at 2019-01-16T04:44:13+0000 uid 0 xlated 296B jited 229B memlock 4096B map_ids 2,3 ... 17: kprobe name trace_sys_clone tag c514db71faba4034 gpl loaded_at 2019-01-16T06:39:28+0000 uid 0 xlated 120B jited 115B memlock 4096B
# ./hello_world.py b' bash-6910 [000] .... 6922.811995: 0: Hello, World!'
bpftoolがUbuntuで動くようになれば、後は参考サイトに従って色々試そう。
- https://qiita.com/sg-matsumoto/items/8194320db32d4d8f7a16
- https://fr.slideshare.net/brendangregg/linux-bpf-superpowers
- https://www.tecmint.com/bcc-best-linux-performance-monitoring-tools/
Tips
Failed to load program: Operation not permitted
とか言われた時。
「Need super-user privileges to run」と言われているように、super-userで実行する。
~$ ./hello_world.py bpf: Failed to load program: Operation not permitted Traceback (most recent call last): File "./hello_world.py", line 13, in <module> b.attach_kprobe(event="__x64_sys_clone", fn_name="trace_sys_clone") File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 626, in attach_kprobe fn = self.load_func(fn_name, BPF.KPROBE) File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 375, in load_func raise Exception("Need super-user privileges to run") Exception: Need super-user privileges to run ~$ sudo -s ~# ./hello_world.py