按理讲, 装个 bcc 有啥可记录的? 官方都有详细的安装说明, 直接一步步来不就好了. 其实我一开始也是这么想的. 然而现实很残酷, 花了我至少30分钟.
环境
supra@suprabox:~$ cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
supra@suprabox:~$ uname -a
Linux suprabox 5.4.0-117-generic #132-Ubuntu SMP Thu Jun 2 00:39:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
官方安装文档
链接: https://github.com/iovisor/bcc/blob/master/INSTALL.md
关于 kernel 的配置, 由于 Ubuntu 20.04.4 的 kernel 已经是5.4.0, 所以默认已经全配置了.
由于官方说使用 package binary 的2种方式的 package 已经 outdated. 所以选用 source 编译安装.
自己编译需要 LLVM, Clang, cmake, gcc 根据不同的 Ubuntu 版本有不同的安装包, 复制命令执行就好
到真正安装和编译 BCC 的部分的时候, 出问题了:
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd
首先, git clone 在这个国家 clone 不下来, 于是设置代理:
git config --global http.proxy http://proxy.mycompany:80
//如果代理需要用户名密码:
git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:8080/
好的, clone 成功, 然后一步一步安装编译, 编译的时候, 有出错了, 错误消息大概是这样:
/tmp/bcc/src/cc/bpf_module.cc:108:46: error: no matching function for call to ‘llvm::object::SectionRef::getName() const’
auto sec_name = section.get()->getName();
这个帖子一样的问题, 还给出了解决方案. 我采用的是使用 v0.24.0 版本. 所以只要切换到这个 tag 就好了:
git checkout v0.24.0
安装完成之后, 直接执行测试命令:
supra@suprabox:/usr/lib/python3/dist-packages/bcc$ sudo ~/bpf/bcc/examples/hello_world.py
Traceback (most recent call last):
File "/home/supra/bpf/bcc/examples/hello_world.py", line 9, in <module>
from bcc import BPF
ImportError: No module named bcc
看到之前编译的时候, 使用的是 Python3, 所以看了一些, 系统默认的 python 是2.7:
supra@suprabox:~$ $(which python) --version
Python 2.7.18
于是改用 python3, 就好了:
sudo python3 ~/bpf/bcc/examples/hello_world.py
[sudo] password for supra:
b' splunkd-5799 [005] .... 47245.389935: 0: Hello, World!'
b' splunkd-5799 [005] .... 47245.393749: 0: Hello, World!'
supra@suprabox:~$ sudo python3 ~/bpf/bcc/examples/tracing/tcpv4connect.py
PID COMM SADDR DADDR DPORT
158736 python3.7 127.0.0.1 127.0.0.1 8089
838 qualys-cloud 10.249.64.103 64.39.104.103 443
159247 curl 127.0.0.1 127.0.0.1 8089
158736 python3.7 127.0.0.1 127.0.0.1 8089
159329 curl 127.0.0.1 127.0.0.1 8089
至此, 安装成功.