问题标签 [ebpf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1420 浏览

c - 如何从内核空间确定 PID 位于哪些命名空间?

我正在尝试编写一个 eBPF 程序来记录系统上运行的容器对特定系统调用的每次调用。我正在使用密件抄送,可以使用bpf_get_current_pid_tgid().

从用户空间我可以检查 proc 文件系统以确定进程的名称空间是否与根名称空间不同,以猜测它是否是容器进程,但我不知道你如何从内核空间做到这一点?

0 投票
1 回答
296 浏览

linux - 如何在 eBPF 程序中检索任务的 sessionid?

我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:

这会运行,但 sessionid 总是以 -1 结束。我读到这个答案,我可以用task_session它来检索它,但我收到一个关于无效内存访问的错误。我相信我需要使用bpf_probe_read将指向的指针移到堆栈上,但我无法让它工作。有什么我想念的吗?task_structtask

0 投票
1 回答
1573 浏览

c - 如何通过 kprobe 将 BPF 程序附加到内核函数?

Cilium BPF 和 XDP 参考指南描述了如何通过ipandtc命令将 BPF 程序加载到网络设备。如何以相同的方式将 BPF 程序附加到内核函数/用户空间函数?

0 投票
1 回答
629 浏览

c - eBPF:默认的 bpf 程序/地图?

我正面临着bpf最新net-next内核的奇怪行为。在启用所有 BPF 内核选项(包括CONFIG_BPF_JIT_ALWAYS_ON)且未加载任何 bpf程序的情况下,bpftool报告以下内容:

这是程序包含的内容:

有趣的是我没有eBPF明确加载任何程序。我想知道内核中现在是否有一个默认的eBPFblob 显示出来?

这发生在机器启动后。这个系统和另一个系统之间的唯一区别(运行相同的内核和选项,我没有看到多个 cgroup_skb 程序的这个问题)是/sys/fs/cgroup/unifiedcgroup2 FS 的存在。我不知道这是否与我的问题有关,但我不知道如何禁用/sys/fs/cgroup/unified,不允许卸载。

0 投票
2 回答
1559 浏览

c - 通过 bpf 系统调用加载 eBPF 程序时参数列表太长

我正在尝试通过bpfGo 中的系统调用加载 eBPF 程序,但我看到系统调用返回错误。为了限制问题,我使用了以下最小的 eBPF 程序,它什么都不做:

Go程序的重要部分如下:

但是,返回的错误是Unable to load program: argument list too long. 为什么是这样?或者更好的是,如何获得更详细的输出来找出问题的根本原因?

这里只有三个地方E2BIG(参数列表太长)从bpf系统调用返回,但它们似乎都不适合。

如果需要,我可以提供更完整的代码版本,为了简洁起见,我只是试图去掉不相关的部分。

为了帮助重现这个问题,我在下面包含了我的完整 BPF 程序。完整的回购在这里

0 投票
1 回答
1537 浏览

c - 尝试加载 BPF 程序时参数无效 (EINVAL)

我正在尝试使用bpf系统调用加载 BPF 程序,但我invalid argument在返回时收到 (EINVAL)。从手册页中,可能的原因是:

所以我的 BPF 程序似乎有问题。我的 BPF 程序如下:

这肯定不会有什么问题。

我在Makefile 这里编译(我删除了大部分代码test_overhead_kprobe_kern.c以提供一个非常简单的测试程序)。

我的程序可能有什么问题导致它被拒绝?

uname -a: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

我的完整用户空间代码(在 Go 中)如下:

0 投票
1 回答
514 浏览

c - 加载将缓冲区复制到 BPF 堆栈的 BPF 程序时出错

我正在尝试加载一个简单地将tty_writebuf的参数复制到 BPF 堆栈的 BPF 程序。我的程序如下:

请注意,我使用tcptracer - bpf中的 bpf_helpers.h 来定义SEC宏。在我的真实程序中,我实际上会使用buffer某些东西,但我没有在这里展示那部分。当我尝试加载程序(从使用gobpf的 ELF 文件)时,我收到以下错误:

为什么是这样?我的程序是从ttysnoop.py改编的,所以我知道可以做我想做的事情。我的程序的完整反汇编如下:

uname -a: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

编辑:

作为一个实验,我尝试加载一个类似于作为辅助函数引入时描述的示例程序的程序:bpf_probe_read_str

加载没有问题并提供以下组件:

因此,似乎我的程序在触发 kprobe 后将tty_write第三个寄存器直接传递给 from 的调用;bpf_probe_read这可能是我看到的错误的原因,但我不确定。

0 投票
1 回答
785 浏览

c - 在 BPF 程序中从指向大型结构的指针中检索字段时权限被拒绝

我正在尝试编写一个 BPF 程序来检查调用tty_write内核函数的任何进程的会话 ID。为了检索 ID,我需要从指向 current 的指针中跟踪多个字段task_struct,但是从指向当前任务的指针中检索group_leader指针似乎是错误的,因为与当前任务指针的偏移量太大。我的 BPF 程序代码如下:

这失败并出现以下错误。注意我是使用gobpf的elf包来加载编译好的程序:

我该如何解决这个问题,原因是什么?我认为这可能是由于堆栈大小的 512 字节限制,但我不是为什么在这种情况下这很重要。

uname -a: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

0 投票
1 回答
356 浏览

bpf - 在 BPF 程序中总是得到 0 会话 ID

我正在尝试编写一个 BPF 程序来检查调用tty_write内核函数的任何进程的会话 ID。我试图通过从当前task_struct结构中检索一个字段来做到这一点。我的代码如下:

请注意,我正在将我的 BPF 程序编译clang成一个 ELF 文件并使用gobpf 的ELF 包加载它。不幸的是, 的值sessionid始终为 0。这是为什么呢?我认为我没有错误地访问会话 ID,因为我在 4.11 内核上使用bcc之前已经这样做了(由于 bcc 如何重写 BPF 程序,当我想自己编译程序时,我不能简单地使用相同的代码)。用于访问的等效工作密件抄送代码sessionid如下。请注意,这仅适用于 4.11 内核,以下代码不适用于 4.13 内核。然而,上面的代码在这两个内核上都不起作用。

4.11内核:

uname -a:Linux ubuntu16 4.11.0-14-generic #20~16.04.1-Ubuntu SMP Wed Aug 9 09:06:22 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

4.13内核:

uname -a: Linux ubuntu1710 4.13.0-32-generic #35-Ubuntu SMP Thu Jan 25 09:13:46 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

0 投票
1 回答
551 浏览

filesystems - eBPF:检索固定 bpf 程序的“fd”

我知道该eBPF程序可以固定到/sys/fs/bpf(默认位置 small bpffs。例如使用bpftool

我期待这会返回内核open("/sys/fs/bpf/my_bpf")分配给我的文件描述符的值。my_bpf但是open()调用失败了,我认为它会返回-EINVAL

在这种情况下,钉住的目的是什么?fd鉴于当前可能加载了很多 BPF 程序,我通常如何获得BPF 程序。我知道这libbpf允许fd从中检索id,但如果我没有id呢?