在 WSL2 环境下安装 BPF 工具链

最近想研究一下 BPF 技术,家里的台式机是 Windows 10 系统,借机想使用一下 WSL,所以就尝试在 WSL 环境下安装 BPF 工具链。但是在安装中遇到了很多困难,网上相关 WSL2 安装 BPF 的资料也难以找到,所以就自己简单研究了一下。

# 环境

  • WSL 版本:2
  • 发行版:Ubuntu 20.04.1 LTS
  • Windows 版本:20H2

# 安装

常规环境下,直接按照官方文档安装即可:https://github.com/iovisor/bcc/blob/master/INSTALL.md (opens new window)

但是如果在 WSL2 环境下安装 linux-headers 依赖会找不到包,linux-headers 是 Linux 内核头文件,WSL2 的内核是经过二次开发的,所以在 apt 中找不到也是意料之中的事情,这个也是主要要解决的问题。

$ sudo apt-get install bcc-tools libbcc-examples linux-headers-$(uname -r)

Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package linux-headers-4.19.128-microsoft-standard
1
2
3
4
5
6

WSL2 的系统信息如下:

$ uname -r

4.19.128-microsoft-standard
1
2
3

# 从 WSL2 Linux 源码安装 linux-header

# 下载 WSL2 源码

git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
1

或者也可以直接下载对应的源码包,快一点。

接下来切换到对应的分支或者 tag,这里就以上面的 4.19.128-microsoft-standard 版本为例:

git checkout linux-msft-4.19.128
1

# 编译安装

# 复制配置文件
cp Microsoft/config-wsl .config
make oldconfig && make prepare
make scripts
make modules && make modules_install
# 需要改名,把加号去掉
mv /lib/modules/4.19.128-microsoft-standard+ /lib/modules/4.19.128-microsoft-standard 
1
2
3
4
5
6
7

如果上述过程报错,多数情况下是缺少依赖,先尝试安装如下依赖:

  • bison
  • flex
  • libssl-dev

未解决 Google 对应的错误信息,一般情况下是缺少依赖导致。

# 测试

以上都做完之后,全部工作就完成了,可以试一试效果:

$ sudo apt-get install bcc-tools

# 执行一个 bcc 的测试命令
$ execsnoop-bpfcc
PCOMM            PID    PPID   RET ARGS
1
2
3
4
5

# 其他

如果 bcc 相关命令报 open(/sys/kernel/debug/tracing/kprobe_events): No such file or directory,可以执行如下命令解决

sudo mount -t debugfs debugfs /sys/kernel/debug
1

# 最后

目前 Windows 上的 WSL 可玩性还是非常高,基本上也很完善了,配合 Windows Terminal 体验很好,可以满足日常 Linux 环境的开发,不过还是有很多坑要自己踩。

# 参考资料