wsl2安装ebpf教程

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的踩坑记录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值