我对 eBPF、内核跟踪等还不熟悉。我真的只是想在学习 Rust/Aya eBPF 工具/Solana 区 block 链时对 eBPF 进行简单的介绍。
我的 Windows 版本:版本 10.0.19043 Build 19043
“wsl -l -v”的输出是:
NAME STATE VERSION
* Ubuntu Stopped 2
Ubuntu.22.04 Stopped 2
docker-desktop Stopped 2
docker-desktop-data Stopped 2
Ubuntu.20.04 Stopped 2
Ubuntu.21.04 Running 2
在 Ubuntu 中:
EliezerC@Ubuntu2104:~
$ bpftrace --version
bpftrace v0.11.3
这有效:
sudo bpftrace -e 'BEGIN { printf("hello world\n"); }'
没有其他单行示例有效。
并且,
EliezerC@Ubuntu2104:~
$ sudo ls -la /sys/kernel/debug/
total 0
dr-xr-xr-x 2 root root 0 Jul 2 16:36 .
drwxr-xr-x 12 root root 0 Jul 2 16:32 ..
是否是因为内核/调试未启用?我需要重新编译内核吗?
最佳答案
以下是如何获取 the bpftrace one liner tutorial上类:
1) 挂载 Debugfs
WSL 默认没有 debugfs,需要挂载它:
sudo mount -t debugfs debugfs/sys/kernel/debug
来源:https://github.com/iovisor/bcc/issues/1878#issuecomment-403284169
您可能根本无法使用普通 WSL2 内核进行此安装,因为我认为未设置内核配置 CONFIG_DEBUG_FS=y
。
2) 重新编译 WSL2 内核
不幸的是,WSL2 不能很好地与 eBPF 工具配合使用。 hhoover 有一个很好的教程,用于重新编译 Cilium 内核:https://harthoover.com/compiling-your-own-wsl2-kernel/ Cilium 是一个 eBPF 工具,因此 bpftrace 可能可以与 hhoover 的 WSL2 内核一起开箱即用。 (P.S.他的文章显然是他对this issue page的评论的复制粘贴)
此外,在您了解重新编译内核的痛苦之前,还有一些提示:
- 在 hover 教程中不要使用
--rm
标志。一旦程序终止,此标志将删除您的 docker 镜像。您可能稍后想要更改内核,而编译需要花费半个小时。您可以通过保留 Docker 镜像来节省一些时间。 - hhoover 的 apt install 缺少一些东西,扔进
python3
、dwarves
和cpio
- 我遇到了一些问题,WSL2 上的 docker 容器无法连接到互联网,如果发生这种情况,请尝试更改 WSL2 中
/etc/resolv.conf
中的名称服务器。我想如果你使用 docker 桌面应该没问题。
这是您将要更改的内核文件:https://github.com/microsoft/WSL2-Linux-Kernel/blob/linux-msft-wsl-5.15.y/Microsoft/config-wsl
顺便说一句,如果你这样做CONFIG_MY_CONF=y
,这意味着一旦你构建了内核,内核模块MY_CONF
就会被链接(静态链接?),它是“内置的-在”。但你也可能会遇到 CONFIG_MY_CONF=m
,=m
是“module”的缩写,这意味着模块将被构建,但不会自动链接,相反,它将是“可加载的”。如果您想通过不始终运行所有内核模块来节省一些内存空间,那么这很有用,但您必须执行一些 modprobe
命令才能加载到模块中。更多信息请点击:https://wiki.archlinux.org/title/Kernel_module
bpftrace
列出了您需要设置的内核标志(如果尚未设置):https://github.com/iovisor/bpftrace/blob/master/INSTALL.md#linux-kernel-requirements
(P.S. 我还发现 BCC 有一个关于为 WSL 编译内核模块的小节:https://github.com/iovisor/bcc/blob/master/INSTALL.md#wslwindows-subsystem-for-linux---binary 不过,我仍然会使用 hhoover 的教程,因为 hhoover 的教程更加充实,而且我知道它有效。)
3) 验证 bpftrace 的安装
当第一课给出 300 行潜在跟踪点时,您就会知道自己做对了。
$ sudo bpftrace -l 'tracepoint:syscalls:sys_enter_*' | wc --lines
336
此时我的 WSL2 有几个其他 mod,因此如果您没有准确获得 336 个跟踪点,我也不会担心。 (但是如果您按照此操作确实得到了 336,请修改此 wiki 答案。)
关于ubuntu - bpftrace 单行命令在 wsl ubuntu 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72842815/