我目前正在研究一个在 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 辅助函数的信息吗?我将非常感谢任何有助于澄清此兼容性问题的见解或文档参考。
预先感谢您的协助!
你是对的,并非所有辅助函数在所有上下文中都可用。
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
。请参阅提交和补丁集