您的位置 首页 golang

eBPF Hello World:如何通过eBPF截获系统调用

云原生领域eBPF已经被广泛应用,很多开源的项目都是基于eBPF,譬如网络插件Cilium。Tcpdump底层的包过滤也是基于eBPF的。其实eBPF的功能远不止如此,如下图所示,eBPF贯穿了整个操作系统,不仅支持各种系统调用、文件系统、网络协议栈和内存管理,甚至可以到驱动层面。

期的BPF程序的编写,一般都是直接使用BPF指令集来编写程序,因此难度是极高的。于是就出现了使用C语言编写的BPF程序。C语言需要通过clang/llvm将程序编译为BPF字节码,然后再注入到内核中。但是对于注入的方式,还是需要通过自己手动的方式才能够注入。近几年比较流行的是通过BCC( BPF Compiler Collection )。BCC 是一个在Github开源的用于编写和运行BPF程序的工具库集合,支持Python和C++编写用户空间程序。

任何一个复杂的东西都有一个简单的hello world开始,今天我们通过BCC+ eBPF截获一个系统调用:sys_clone,这个系统调用是创建进程的时候被调用。

下面是通过一个Python脚本编写的一个helloWorld程序,通过kprobe截获sys_clone调用。本机环境是Centos 8.3 并且已经通过 ” yum install bcc-tools “ 安装了bcc工具包。代码如下:

 #!/usr/bin/python3

from bcc import BPF

prog = """
int kprobe__sys_clone(void *ctx) {
bpf_trace_printk("Hello, World!\\n");
return 0;
}
"""

b = BPF(text=prog)
b.trace_print()  

其中,kprobe__sys_clone, 使用kprobe的方式追踪内核系统调用sys_clone()。 kprobe 是内核动态追踪的一种实现方法。kprobe__xxx 的C函数定义表示使用kprobe方式追踪内核系统调用xxx()函数。

执行这个脚本后,打开另一个shell窗口,随便执行一个命令,譬如: ls ,在这个窗口便会输出如下信息。

 b'            bash-2044  [001] ....   353.648215: 0: Hello, World!'  

可以看到我们的hello world程序已经成功执行,只要系统中sys_clone被执行,就会有输出。

文章来源:智云一二三科技

文章标题:eBPF Hello World:如何通过eBPF截获系统调用

文章地址:https://www.zhihuclub.com/97623.shtml

关于作者: 智云科技

热门文章

网站地图