问题标签 [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.
c - 如何从内核空间确定 PID 位于哪些命名空间?
我正在尝试编写一个 eBPF 程序来记录系统上运行的容器对特定系统调用的每次调用。我正在使用密件抄送,可以使用bpf_get_current_pid_tgid()
.
从用户空间我可以检查 proc 文件系统以确定进程的名称空间是否与根名称空间不同,以猜测它是否是容器进程,但我不知道你如何从内核空间做到这一点?
linux - 如何在 eBPF 程序中检索任务的 sessionid?
我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:
这会运行,但 sessionid 总是以 -1 结束。我读到这个答案,我可以用task_session
它来检索它,但我收到一个关于无效内存访问的错误。我相信我需要使用bpf_probe_read
将指向的指针移到堆栈上,但我无法让它工作。有什么我想念的吗?task_struct
task
c - 如何通过 kprobe 将 BPF 程序附加到内核函数?
Cilium BPF 和 XDP 参考指南描述了如何通过ip
andtc
命令将 BPF 程序加载到网络设备。如何以相同的方式将 BPF 程序附加到内核函数/用户空间函数?
c - eBPF:默认的 bpf 程序/地图?
我正面临着bpf
最新net-next
内核的奇怪行为。在启用所有 BPF 内核选项(包括CONFIG_BPF_JIT_ALWAYS_ON
)且未加载任何 bpf
程序的情况下,bpftool
报告以下内容:
这是程序包含的内容:
有趣的是我没有eBPF
明确加载任何程序。我想知道内核中现在是否有一个默认的eBPF
blob 显示出来?
这发生在机器启动后。这个系统和另一个系统之间的唯一区别(运行相同的内核和选项,我没有看到多个 cgroup_skb 程序的这个问题)是/sys/fs/cgroup/unified
cgroup2 FS 的存在。我不知道这是否与我的问题有关,但我不知道如何禁用/sys/fs/cgroup/unified
,不允许卸载。
c - 通过 bpf 系统调用加载 eBPF 程序时参数列表太长
我正在尝试通过bpf
Go 中的系统调用加载 eBPF 程序,但我看到系统调用返回错误。为了限制问题,我使用了以下最小的 eBPF 程序,它什么都不做:
Go程序的重要部分如下:
但是,返回的错误是Unable to load program: argument list too long
. 为什么是这样?或者更好的是,如何获得更详细的输出来找出问题的根本原因?
从这里只有三个地方E2BIG
(参数列表太长)从bpf
系统调用返回,但它们似乎都不适合。
如果需要,我可以提供更完整的代码版本,为了简洁起见,我只是试图去掉不相关的部分。
为了帮助重现这个问题,我在下面包含了我的完整 BPF 程序。完整的回购在这里:
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 中)如下:
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
这可能是我看到的错误的原因,但我不确定。
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
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
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
呢?