最近想研究一下 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
2
3
4
5
6
WSL2 的系统信息如下:
$ uname -r
4.19.128-microsoft-standard
1
2
3
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
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
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 环境的开发,不过还是有很多坑要自己踩。
# 参考资料
- https://www.linuxquestions.org/questions/debian-26/compile-of-kernel-4-16-fails-4175628085/ (opens new window)
- https://github.com/microsoft/WSL2-Linux-Kernel/issues/78 (opens new window)
- https://github.com/iovisor/bcc/blob/master/INSTALL.md (opens new window)
- https://github.com/iovisor/bcc/issues/1878 (opens new window)