【问题标题】:Tried to learn eBPF tail call, fails to attach kprobe尝试学习eBPF尾调用,无法附加kprobe
【发布时间】:2019-06-30 21:57:55
【问题描述】:

您好,我正在尝试学习如何使用 eBPF 地图,因此我尝试运行在 BCC 文档中找到的简单代码。

import os
import socket
import time
import logging
import signal
import sys
import zmq
import json
import yaml
import netifaces as ni
from bcc import BPF
from ctypes import *

b = BPF(src_file="tailcall_test.c")
tail_fn = b.load_func("tail_call", BPF.KPROBE)
prog_array = b.get_table("prog_array")
prog_array[c_int(2)] = c_int(tail_fn.fd)
b.attach_kprobe(event="some_kprobe_event", fn_name = "do_tail_call")

这是我使用的 c 代码,名称为 :tailcall_test.c :

#include <uapi/linux/ptrace.h>
#include <net/sock.h>
#include <bcc/proto.h>
#include <linux/bpf.h>
#include <linux/kernel.h>
#include <uapi/linux/bpf.h>

BPF_PROG_ARRAY(prog_array, 10);

int tail_call(void *ctx) {
        bpf_trace_printk("tail-call\n");
        return 0;
}

int do_tail_call(void *ctx) {
        bpf_trace_printk("Original program\n");
        prog_array.call(ctx, 2);
        return 0;
}

我不太确定需要包含哪些头文件或库,所以我把所有的东西都扔在那里了。对脏代码感到抱歉:(

无论如何,当我尝试运行它时,它给了我这个错误:

cannot attach kprobe, probe entry may not exist
Traceback (most recent call last):
  File "tailcall_test.py", line 18, in <module>
    b.attach_kprobe(event="some_kprobe_event", fn_name = "do_tail_call")
  File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 648, in attach_kprobe
    (fn_name, event))
Exception: Failed to attach BPF program do_tail_call to kprobe some_kprobe_event

任何帮助..? 非常感谢您。

另外,如果你们有任何建议可以检查以了解如何使用 eBPF 尾调用,如果你们愿意与我分享,我将不胜感激。

非常感谢。

【问题讨论】:

  • 我几乎可以断定内核没有编译 bpf,但这可能还为时过早。我将从这里做的是查看是否以及哪些模块被编译到内核中,哪些是模块:grep -i 'bpf' /boot/config-$(uname -r)(请替换您自己的内核版本
  • 该命令的效果是:CONFIG_CGROUP_BPF = Y CONFIG_BPF = Y CONFIG_BPF_SYSCALL = Y CONFIG_BPF_JIT_ALWAYS_ON = Y CONFIG_NETFILTER_XT_MATCH_BPF =米CONFIG_NET_CLS_BPF =米CONFIG_NET_ACT_BPF =米CONFIG_BPF_JIT = Y CONFIG_BPF_STREAM_PARSER = Y CONFIG_LWTUNNEL_BPF = Y CONFIG_HAVE_EBPF_JIT = Y CONFIG_BPF_EVENTS = y CONFIG_TEST_BPF=m 我的内核版本是:4.15.0-52-generic
  • 你看过这个:github.com/iovisor/bcc/issues/2071 吗?
  • 哦,顺便说一句,你必须是 root 才能获得这样的 kprobe 访问权限。
  • 哦,我确实检查了您在评论中添加的 url,但在运行该代码时我没有执行 root!它解决了这个问题!非常感谢你帮助我!我真的很感激:D

标签: linux ebpf bcc-bpf


【解决方案1】:

所以在 Roadowl 在 cmets 中找到问题的原因之前,我没有时间完成输入我的答案 :)。由于问题中有关于尾调用引用的第二部分,而且我已经写了那部分,所以我发布它以防万一它可以提供帮助。

  • 仅供参考,密件抄送文档有a paragraph on tail calls,但通过查看您的代码,您已经找到了:)。

  • 如果您想了解尾调用的工作原理,我建议您查看 Cilium 的文档,尤其是 the section on tail calls。请记住,bcc 提供了一些包装器(例如 .call() 函数),这些包装器不会在 Cilium 的文档中介绍,但它应该可以帮助您了解幕后发生的事情。

  • bcc 本身似乎并没有大量使用尾调用,我只能找到似乎使用它的one networking example(虽然我没有仔细搜索)。

  • 您可以在 iproute2 存储库中找到一些使用尾调用的简单示例程序(simple oneone that loops)。您还可以在内核samplesselftests 中找到一些:grep for tail_call

【讨论】:

  • 非常感谢!我试图寻找可以参考的其他代码来练习尾声,但并没有真正成功,但现在我知道在哪里看:D 再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多