程序类型
少于1分钟
简要概述
eBPF 程序类型大体上被分为两类:
- 性能追踪类型;
- 网络相关类型。
程序类型决定了它可以附加到哪些事件上,这反过来又定义了它能接收的上下文信息的类型,以及可调用的 helper 函数和 kfuncs 集合。
helper 函数
helper 函数是在内核中定义的 UAPI 稳定接口,如 uapi/linux/bpf.h,这些接口定义发布后就不会更改了,尽管内部函数或数据结构在将来的版本会发生变更。可使用 bpftool feature
查看当前内核支持的 helper 函数。
kfuncs 集合
与 helper 函数不同,kfuncs 不提供兼容性保证,因此开发者必须考虑到内核版本之间可能发生的变化。它允许内核函数在 BPF 子系统中注册,以便验证器允许它们被 eBPF 程序调用。
性能追踪类型
Tracepoints
它们绝不仅限于eBPF,并且长期以来一直被用来生成内核追踪输出,以及像SystemTap这样的工具。
当前内核支持的事件:
cat /sys/kernel/tracing/available_events
网络相关类型
所需运行权限
需要有 CAP_NET_ADMIN
与 CAP_BPF
能力,或者 CAP_SYS_ADMIN
能力。
下图是 BPF 程序类型在网络堆栈的各个点上钩子:
特性:Socket
TODO;
BPF_PROG_TYPE_SOCKET_FILTER
BPF_PROG_TYPE_SOCK_OPS
BPF_PROG_TYPE_SK_SKB
特性:Traffic Control
TODO;
TC 子系统用于控制网络流量的调度,同时也拥有操控、丢弃或重定向数据包的能力,附加在 TC 中的 eBPF 程序也可以作为复杂网络行为的构建基础。
在 TC 子系统中附加的 ebpf 程序会使用存储在内核网络堆栈中的 [sk_buff] 数据结构的指针作为上下文参数。
网络数据栈中的一部分数据流动有两个方向:入口(从网络接口传入)或出口(向网络接口传出)。eBPF程序可以在任何一个方向上进行附加,并且只会影响那个方向的流量。不同于XDP,可以附加多个序列处理的eBPF程序。
特性:XDP
通过 XDP(eXpress Data Path)可以把特定的程序附加到指定的网卡上。如通过 bpftool
挂载 “hello.bpf.o” 程序:
bpftool prog load hello.bpf.o /sys/fs/bpf/hello
bpftool net attach xdp id 540 dev eth0
或者通过 ip
进行挂载:
ip link set dev eth0 xdp obj hello.bpf.o sec xdp
卸载:
ip link set dev eth0 xdp off
特性:Flow Dissector
TODO;
特性:Lightweight Tunnels
TODO;
特性:Cgroups
TODO;
特性:Infrared Controllers
TODO;