WSL安装BCC
包含ebpf的内核安装
WSL2的内核是修改过的,无法使用 ubuntu上游的内核头文件和modules文件,因此,我们需要手动编译并安装一个内核版本。
uname -r
5.15.150.1-2-microsoft-standard-WSL2
我们可以重洗下载一个内核
git clone --depth 1 https://github.com/microsoft/WSL2-Linux-Kernel.git -b linux-msft-wsl-$(uname -r | cut -d '-' -f 1)
cd WSL2-Linux-Kernel
安装必要的工具
sudo apt install flex bison build-essential libelf-dev libncurses-dev libssl-dev bc binutils dwarves
复制配置文件
cp Microsoft/config-wsl .config
在 .config
中修改以下选项:
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_IKHEADERS=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_DUMMY=m
CONFIG_VXLAN=m
设置内核版本:
export KERNELRELEASE=$(uname -r)
编译
make KERNELRELEASE=$KERNELRELEASE -j 4
make KERNELRELEASE=$KERNELRELEASE modules -j 4
sudo make KERNELRELEASE=$KERNELRELEASE modules_install
编译后配置:在windows系统中的:C:\Users[你的用户名]
目录下创建.wslconfig文件。将下面内容写入文件中。注意确保windows系统中存在D盘
[wsl2]
kernel=D:\\kernel
将心编译的内核挂载到D盘上
cp arch/x86/boot/bzImage /mnt/d/kernel
重启WSL
wsl.exe --shutdown
至此WSL对应新的内核已经包含ebpf了。
BCC源码安装
清理对应的工具链。否则将会出现AttributeError: /lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b问题
sudo rm /usr/lib/python3/dist-packages/bcc*
安装BCC必要安装的工具,针对不同的版本选择对应的形式:
# For Focal (20.04.1 LTS)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm12 llvm-12-dev libclang-12-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev arping netperf iperf
# For Hirsute (21.04) or Impish (21.10)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm12 llvm-12-dev libclang-12-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev arping netperf iperf
# For Jammy (22.04)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev libdebuginfod-dev arping netperf iperf
# For Lunar Lobster (23.04)
sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
libllvm15 llvm-15-dev libclang-15-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
liblzma-dev libdebuginfod-dev arping netperf iperf libpolly-15-dev
# For other versions
sudo apt-get -y install zip bison build-essential cmake flex git libedit-dev \
libllvm3.7 llvm-3.7-dev libclang-3.7-dev python zlib1g-dev libelf-dev python3-setuptools \
liblzma-dev arping netperf iperf
# For Lua support
sudo apt-get -y install luajit luajit-5.1-dev
sudo apt install -y python-is-python3
sudo apt install -y bison build-essential cmake flex git libedit-dev libllvm11 llvm-11-dev libclang-11-dev zlib1g-dev libelf-dev libfl-dev python3-distutils
下载并安装BCC。注意:只能使用git方式来拉取代码,不能通过wget形式。因为make的时候还需要拉取其它仓库。而wget拉取的代码在make的时候不会拉取其它仓库,从而导致了错误fatal error: libbpf/src/bpf.h: No such file or directory
产生。
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 ..
pushd src/python/
make
sudo make install
popd
确认安装成功。如下命令不会执行出错。
cd example
python3 hello_world.py
不要使用apt-get install bpfcc-toolls
来安装bcc工具。因为安装的版本较老。直接使用bcc仓库代码下面的tools里面的python代码即可。因为随着linux内核的版本升级,打桩函数发生了改变。https://github.com/iovisor/bcc/issues/4937
就有一个问题产生
例如下面
./offcputime-bpfcc
cannot attach kprobe, probe entry may not exist
Traceback (most recent call last):
File "/sbin/offcputime-bpfcc", line 234, in <module>
b.attach_kprobe(event="finish_task_switch", fn_name="oncpu")
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 683, in attach_kprobe
raise Exception("Failed to attach BPF program %s to kprobe %s" %
Exception: Failed to attach BPF program b'oncpu' to kprobe b'finish_task_switch'
有可能的原因是:finish_task_switch
函数产生了内联。具体可以通过/proc/kallsyms
来看打桩函数。
sudo cat /proc/kallsyms | grep finish_task_switch
ffffffffa7134a80 t finish_task_switch.isra.0
发现就只包含了finish_task_switch.isra.0
。而在bcc仓库的tools里offcputime.py
此问题就解决了。
火焰图工具
为了较好的观看内容,我们使用火焰图工具。
下载火焰图工具。直接解压使用flamegraph.pl
即可
https://github.com/brendangregg/FlameGraph
参考文献
如何在WSL中的ubuntu编译Linux内核并且安装使用ebpf?
WSL2安装BCC
WSL 运行make提示/lib/modules/xxx/build: No such file or directory. Stop.错误解决办法
WSL安装BCC
Ubuntu 18.04 LTS上编译安装BCC
安装FlameGraph工具
安装bpftrace和bcc的踩坑记录