ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

bpftoolをUbuntu 18.04LTSで利用する

この記事は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で動くようになれば、後は参考サイトに従って色々試そう。

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 

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。