ubuntu - bpftrace 单行命令在 wsl ubuntu 中不起作用

标签 ubuntu kernel trace wsl-2 ebpf

我对 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 缺少一些东西,扔进 python3dwarvescpio
  • 我遇到了一些问题,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/

相关文章:

桌面应用程序的配置存储

mysql - 非常持久/opt/lampp/bin/mysql.server : 264: kill: No such process. Xampp/ubuntu 16.04

linux - 在 Bash 中显示调用堆栈

x86-64 - 如何在 eBPF 程序中访问 xmm 寄存器

c# - WCF 跟踪文件不断损坏?

shell - 如果文件编码为 utf-16le,则获取垃圾字符

ubuntu - Gitlab:已经添加了SSH key ,仍然权限被拒绝

linux - 使用 linux 内核模块计算 cpu-time 来执行函数?

c - Linux内核模块编译

linux - 如何理解Linux内核模块的 "Building Separate Files"?