ebpf学习笔记(一)——ebpf简介与环境配置
参考书:《Learning-eBPF》
电子书链接: Learning-eBPF
ebpf简介
BPF是“Berkeley Packet Filter”的简称。它于 1997 年首次引入 Linux(内核版本 2.1.75),在tcpdump中它被用作捕获要跟踪的数据包的有效方法。
最开始BPF确实只用于网络数据包过滤方面,但随着技术的应用,大家开始发觉到BPF在其它领域的重要作用。毕竟,谁能拒绝一个能在内核态高效实现程序员所写的应用程序而不用重新编译内核的工具呢?
引用书中对于BPF工作的简短介绍:
我们今天所说的“eBPF”起源于 BSD 数据包过滤器,该过滤器于 1993 年在劳伦斯伯克利国家实验室的 Steven McCanne 和 Van Jacobson 撰写的一篇论文1 中首次描述。本文讨论一种可以运行 filters 的 pseudomachine
这些程序是用 BPF 指令集编写的,BPF 指令集是一组通用的 32 位指令,与汇编语言非常相似。下面是一个直接摘自该论文的示例:
ldh [12]
jeq #ETHERTYPE IP, L1, L2
L1: ret #TRUE
L2: ret #0
这一小段代码过滤掉不是 Internet 协议(IP)的数据包。此过滤器的输入是以太网数据包,第一条指令 (**ldh**) 加载从此数据包中的字节 12 开始的 2 字节值。在下一条指令 (**jeq**) 中,将该值与表示 IP 数据包的值进行比较。如果匹配,则执行将跳转到标记为 **L1** 的指令,并通过返回非零值(此处标识为 **#TRUE**)来接受数据包。如果不匹配,则数据包不是 IP 数据包,并通过返回 0 来拒绝。
重要的是,过滤器的作者可以编写自己的自定义程序,以便在内核中执行,这就是 eBPF 的核心功能
BPF 从 2014 年的内核版本 3.18 开始演变为我们所说的“extend BPF”或“eBPF”。现在我们说BPF和eBPF都是指一个东西。(Linux内核代码里还是采用BPF的名称)
在这其中BPF发生重大变化:
- BPF 指令集经过彻底修改,在 64 位机器上更加高效,解释器也被完全重写
- 引入了 eBPF maps,这是 BPF 程序和用户空间应用程序可以访问的数据结构,允许它们在它们之间共享信息。
- 添加了 bpf() 系统调用,以便用户空间程序可以与内核中的 eBPF 程序进行交互。
- 添加了多个 BPF 帮助程序函数。
- 添加了 eBPF verifier,以确保 eBPF 程序可以安全运行。
环境配置
安装依赖
sudo apt-get install -y apt-transport-https ca-certificates curl clang llvm jq
sudo apt-get install -y libelf-dev libpcap-dev libbfd-dev binutils-dev build-essential make
sudo apt-get install -y linux-tools-common linux-tools-$(uname -r)
sudo apt-get install -y bpfcc-tools
安装bpftool
克隆bpftool
git clone --recurse-submodules https://github.com/libbpf/bpftool.git
如目录内没有libbpf文件夹,需要在克隆目录内克隆libbpf
git clone https://github.com/libbpf/libbpf.git
在系统内安装libbpf(注意需要使用较新版本的clang,否则编译libbpf出错)
$ cd bpftool/src
# make install

浙公网安备 33010602011771号