不同 eBPF 程序类型之间 bpf_get_ns_current_pid_tgid 辅助函数的兼容性

问题描述 投票:0回答:1

我目前正在研究一个在 Docker 容器内运行 eBPF 程序的用例。我想根据进程 ID (PID) 过滤请求,但我遇到了从我的钩子获取的 pid 的问题(refer)。具体来说,我在 cgroup/connect4 上挂了一个钩子,但是当我尝试加载该程序时,我收到错误消息

unknown func bpf_get_ns_current_pid_tgid#120

但是,当我在 kprobe 方法中使用 bpf_get_ns_current_pid_tgid 函数时,它工作正常。我怀疑每个 eBPF 程序类型都可能不支持 bpf_get_ns_current_pid_tgid

任何人都可以提供有关哪些 eBPF 程序类型支持 bpf_get_ns_current_pid_tgid 辅助函数的信息吗?我将非常感谢任何有助于澄清此兼容性问题的见解或文档参考。

预先感谢您的协助!

docker pid ebpf cgroups
1个回答
1
投票

你是对的,并非所有辅助函数在所有上下文中都可用。

bpf_get_ns_current_pid_tgid
功能仅在以下程序类型中可用:

  • BPF_PROG_TYPE_KPROBE
  • BPF_PROG_TYPE_LSM
  • BPF_PROG_TYPE_PERF_EVENT
  • BPF_PROG_TYPE_RAW_TRACEPOINT
  • BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
  • BPF_PROG_TYPE_SYSCALL
  • BPF_PROG_TYPE_TRACEPOINT
  • BPF_PROG_TYPE_TRACING

但是,如果它是调用进程的 PID,您可以使用

bpf_get_current_pid_tgid
帮助器,该帮助器在以下程序类型中可用:

  • BPF_PROG_TYPE_CGROUP_SOCK
  • BPF_PROG_TYPE_CGROUP_SOCK_ADDR
  • BPF_PROG_TYPE_KPROBE
  • BPF_PROG_TYPE_LSM
  • BPF_PROG_TYPE_PERF_EVENT
  • BPF_PROG_TYPE_RAW_TRACEPOINT
  • BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
  • BPF_PROG_TYPE_SK_MSG
  • BPF_PROG_TYPE_SYSCALL
  • BPF_PROG_TYPE_TRACEPOINT
  • BPF_PROG_TYPE_TRACING

对于其他帮助程序函数,您可以运行

bpftool feature
命令来从本地系统上的任何帮助程序函数中找出这一点。

或者,您可以找到您感兴趣的程序类型的

struct bpf_verifier_ops
。然后查看
.get_func_proto
字段指示的 *_func_proto 函数。在本例中是 sock_addr_func_proto,它揭示了允许哪些帮助程序调用。访问源代码的优点是它们还显示了其他要求,例如 bpftool 输出中未详细说明的 kconfig 设置、附件类型和运行时模式限制


编辑(2024 年 11 月 22 日):

从内核 v6.10 开始,所有程序类型都可以使用

bpf_get_current_pid_tgid
bpf_get_ns_current_pid_tgid
。请参阅提交补丁集

© www.soinside.com 2019 - 2024. All rights reserved.