我是eBPF、内核跟踪等的新手。我真的只是想在学习Rust / Aya eBPF工具/ Solana区块链时简单介绍一下eBPF。
我的Windows版本:版本10.0.19043内部版本号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 ..
是因为内核/调试没有启用吗?我必须重新编译内核吗?
1条答案
按热度按时间r6vfmomb1#
以下是如何使用the bpftrace one liner tutorial:
1)挂载调试文件系统
默认情况下,WSL没有debugfs,您需要挂载它:
CONFIG_DEBUG_FS=y
来源:https://github.com/iovisor/bcc/issues/1878#issuecomment-403284169
您可能根本无法使用vanilla 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.他的文章显然是他在这个问题页面上的评论的复制粘贴)
此外,在您了解重新编译内核的痛苦之前,还有一些提示:
--rm
标志。一旦程序终止,这个标志将删除你的docker映像。你可能想在以后修改你的内核,编译需要花费半个小时。你可以通过保留docker映像来保存你自己的时间。python3
、dwarves
和cpio
/etc/resolv.conf
中更改你的名称服务器上。这是您要更改的内核文件: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
是“模块”的缩写,这意味着模块将被构建,但它不会自动链接,如果你不想让所有内核模块都一直运行来保存一些内存空间,这是很有用的,但是你必须执行一些modprobe
命令来加载模块。更多信息在这里:https://wiki.archlinux.org/title/Kernel_modulebpftrace
列出了您需要设置的内核标志(如果尚未设置):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行潜在的跟踪点时,你就知道你做对了。
在这一点上,我有几个其他的mods到我的WSL2,所以我不会担心,如果你没有得到336跟踪点准确.(但如果你遵循这一点,你确实得到336准确,请修改这个wiki答案.)