[转帖]一文入门前景广阔的 eBPF
https://zhuanlan.zhihu.com/p/567375673
【摘要】eBPF带来的最大的好处即是可以对内核进行编程性处理,实现对内核中不灵活的部分,实现自定义的处理。这种灵活性使得对于不可见的kernel具有了可观测性的基础,在进行内核监控、网络故障分析、文件系统分析等方面具有广泛的使用前景。本文将带你了解eBPF发展历程、原理、用途及特点。
【作者】陈成,中国联通软件研究院容器云研发工程师,公共平台与架构研发事业部云计算研发组长,长期从事大规模基础平台建设相关工作,先后从事Mesos、KVM、K8S等研究,专注于容器云计算框架、集群调度、虚拟化等。
eBPF对应用开发者而言,可能些许陌生,但是对于从事云、网络、操作系统等相关的开发者而言,近年来或多或少听说过或使用过。那么eBPF到底是什么?它有何作用?如何使用?今天这篇文章就来一一解答。
1、eBPF发展历程及原理
eBPF(extended Berkeley Packet Filter),意为“可扩展数据包过滤器”,是一种网络数据包的过滤技术。在eBPF出现前,BPF (也称为cBPF , classic BPF ) 得到了广泛的应用,BPF 最初的名字 BSD Packet Filter ,源于BSD操作系统上的一种包过滤机制,后经发展,被作者的工作单位名所替代,变成了 Berkeley Packet Filter。BPF支持数据包筛选,允许用户态程序提供要接收的数据包条件。最常用的tcpdump就是基于BPF 实现 的过滤出tcp包或udp包等功能。由于BPF实现了在内核直接过滤处理的能力,因此避免了不符合条件的数据包被“多余地”复制到用户态,从而大大提高了性能。
eBPF,作为扩展版本的BPF,支持JIT机制,动态地将用户态自定义指令解释为机器代码,并在内核中执行,从而大大提高了灵活性。在eBPF之前,内核模块是注入内核的最主要机制。由于缺乏对内核模块的安全控制,内核的基本功能很容易被一个有缺陷的内核模块破坏。而eBPF则借助即时编译器(JIT),并在kernel预先控制好开放的植入范围及校验程序,保证只有被验证安全的eBPF指令才会被内核执行。
eBPF伴随着kernel的发展,逐步完善和成熟,其发展历程大致如下:
1992年,BPF诞生,初衷是提供一种内核中自定义报文过滤的手段
2011年,kernel 3.2版本对BPF重大改版,引入BPF JIT,性能得到提高
2014年,kernel 3.15版本,eBPF出现,引入了verify、高级编程语言编程支持等
2016年,kernel 4.8版本,eBPF支持XDP
2018年,kernel 4.18版本,引入BTF
2020年,kernel 4.20版本,引入CO-RE
2020年,kernel 5.2版本,引入debug_btf
2、eBPF用途及特点
为什么使用eBPF?
内核可编程性
eBPF带来的最大的好处即是可以对内核进行编程性处理,实现对内核中不灵活的部分,实现自定义的处理,这大大提高了灵活性。
广泛应用场景
正是由于这种灵活性,使得对于不可见的kernel具有了可观测性的基础,在进行内核监控、网络故障分析、文件系统分析等方面具有广泛的使用前景。
正是由于这些突出的特性,eBPF程序可以附加到各种内核子系统,包括网络,跟踪和Linux安全模块(LSM)。比如,Facebook开源的高性能网络负载均衡器Katran、Isovalent开源的容器网络方案 Cilium ,以及著名的内核跟踪排错工具 BCC 和 bpftrace 等,都是基于eBPF技术实现的。更有意思的是,盘古实验室发现了NSA也使用BPF技术在Linux布置后门。
下图为内核跟踪排错工具BCC所支持的追踪点示意图,可见当前内核中除了驱动部分外的几乎所有子系统、高级语言、应用均已支持细粒度的跟踪分析:

▲BCC工具集 ( 来源:BPF之巅:洞悉Linux系统和应用性能)
那么,eBPF程序又是如何工作的呢?
3、eBPF工作流程
在了解eBPF之前,需要先了解钩子(hook)机制,钩子机制顾名思义即可以挂载一种未确定的逻辑处理过程以实现对特定位置的处理,这种未确定性即灵活性,可以实现定制化或配置化管理,实现不同的需求。在linux内核中有一套hook函数机制(khook),可以在不同的hook点监控或处理如:文件打开、关闭等操作;网络包过滤、转换。最常见的netfilter就是借助于一整套的hook函数机制,实现了数据包在三层以上的过滤、NAT转换、基于协议的跟踪等等,具体参考:linux netfilter hook
eBPF程序是事件驱动的,当内核或应用程序通过某个钩子点(hook point)时触发执行。预定义的钩子包括:系统调用、函数进入/退出、内核跟踪点、网络事件等。

▲hook architecture
如果不存在用于特定需求的预定义钩子,则可以创建内核探测器(kprobe)或用户探测器(uprobe)以将eBPF程序附加到内核或用户应用程序中的几乎任何位置。

▲eBPF hook overview
虽然现在我们依然不清楚如何写一个钩子处理函数,即eBPF程序的具体逻辑,不用担心,我们假设已经有了这样一个程序,那它会如何被处理,并执行起来呢?

▲eBPF全流程调用 ( 以Go语言为例)
上图展示了一个程序是如何被加载、验证并执行的,具体来看,经历了如下步骤:
第一步:编写的c eBPF程序,经过编译器,编译为eBPF伪代码,即eBPF字节码(具体会在第二讲中进行介绍)
第二步:编译好的代码,会被eBPF所对应的高级语言库程序加载,并由高级语言进行系统调用处理(目前eBPF支持golang、python、c/c++、rust等)
第三步:通过系统调用陷入内核后,首先由内核eBPF程序进行验证(verify),这一步确保(1)程序本身无误(不会崩溃、不会出现死循环);(2)没有权限异常;然后进行将编译为eBPF伪代码的程序再转换为具体的机器指令集,以优化程序执行,并最终挂载到对应的hook点或追踪点。
第四步:内核在处理某个追踪点时,刚好有eBPF,就会触发事件,并由加载的eBPF程序处理
4、eBPF的不足
但是我们要知道的是eBPF不是万能的,受限于本身内核版本支持能力、eBPF指令的种类、eBPF虚拟机结构等,eBPF程序并不能发挥其无限的能力,仅仅是“山顶跳舞”。
不过,基于这广泛的应用,无论是linux kernel社区,还是工具社区,都在试图突破这些限制,例如将高版本kernel才具备的能力以低成本的方式移植到低版本上,或者是实现一次编译,到处运行(CO-RE)等。
eBPF开发工具
BCC
bpftrace
eBPF Go Library
libbpf C/C++ Library
参考文献
eBPF核心技术与实战:https://time.geekbang.org/column/article/479384
linux内核协议栈netfilter之hook机制:https://blog.csdn.net/wangquan1992/article/details/109352908
10T 技术资源大放送!包括但不限于:Linux、虚拟化、容器、云计算、网络、Python、Go 等。在开源Linux公众号内回复「10T」,即可免费获取!
shell编程100例(附PDF下载) IPv6技术白皮书(附PDF下载) Linux主流发行版本配置IP总结(Ubuntu、CentOS、Redhat、Suse) 批量安装Windows系统 无人值守批量安装服务器 运维必备的《网络端口大全》,看这一份就够了。 收藏:服务器和存储知识入门 什么叫SSH?原理详解,看这一篇就够了! Nginx面试40问(收藏吃灰) 20 个 Linux 服务器性能调优技巧 超详细!一文带你了解LVS四层负载均衡企业级实践! 收藏 | Linux系统日志位置及包含的日志内容介绍 100 道 Linux 常见面试题,建议收藏,慢慢读~ 服务器12种基本故障+排查方法 IT运维管理常用工具大全,让你成为真正的高手 什么是QoS?Linux学习指南有收获,点个在看
[转帖]一文入门前景广阔的 eBPF的更多相关文章
- RealSense 3D实感体验:前景广阔目前应用少
腾讯数码讯(周硕)在去年的IDF大会上,英特尔着重展示了其全新的RealSense 3D实感技术,而厚度仅6mm堪称史上最薄平板的戴尔Venue 8 7000也成为首个搭载RealSense技术的产品 ...
- 一文入门HTML5
1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...
- 一文入门Redis
一文入门Redis 目录 一文入门Redis 一.Redis简介 二.常用数据类型 1.String(字符串) 2.Hash(哈希) 3.List(列表) 4.Set(集合) 5.Zset(有序集合) ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- 一文入门NodeJS
NodeJS¶ 1.环境配置¶ 之前讲ES6的时候有提过一部分Node的知识,简单回顾下:一文读懂ES6 1.1.NPM国内镜像¶ npm国内镜像:https://npm.taobao.org 配 ...
- [转帖]SAP一句话入门:Plant Maintenance
SAP一句话入门:Plant Maintenance http://blog.vsharing.com/MilesForce/A618273.html PM就是Plant Maintenance(本文 ...
- [转帖]SAP一句话入门:Production Planning
SAP一句话入门:Production Planning http://blog.vsharing.com/MilesForce/A617692.html SAP是庞大的,模块是多多的,功能是强大的, ...
- [转帖] YAML 快速入门
https://www.jianshu.com/p/97222440cd08 原始文档更加易读. YAML快速入门 叩丁狼教育 关注 2018.02.18 19:19* 字数 1776 阅读 876评 ...
- 【转帖】Systemd 入门教程:命令篇
Systemd 入门教程:命令篇 Copy From http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 感觉 ...
- 教程 | 一文入门Python数据分析库Pandas
首先要给那些不熟悉 Pandas 的人简单介绍一下,Pandas 是 Python 生态系统中最流行的数据分析库.它能够完成许多任务,包括: 读/写不同格式的数据 选择数据的子集 跨行/列计算 寻找并 ...
随机推荐
- 克魔助手:方便查看iPhone应用实时日志和奔溃日志工具
克魔助手:方便查看iPhone应用实时日志和奔溃日志工具 查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具,该工具可以方便地查看iPhone设备上应用和系统运行 ...
- Mac 向日葵设置
- Bert不完全手册4. 绕开BERT的MASK策略?XLNET & ELECTRA
基于随机token MASK是Bert能实现双向上下文信息编码的核心.但是MASK策略本身存在一些问题 MASK的不一致性:MASK只在预训练任务中存在,在微调中不存在,Bert只是通过替换部分的随机 ...
- mit6.s081 lab2: system calls
1.system call tracing(moderate) 要求:创建一个系统调用来实现跟踪特性,它采用一个参数来指定跟踪哪一个系统调用,例如:跟踪fork系统调用,程序调用trace(1< ...
- Blazor实现菜单动画
想到动画,你可能会去安装Blazor的动画组件BlazorAnimate,然后使用它.本人初学,暂时我也不知道原理,先不用组件,自己实现吧.虽然项目中我用了AntDesignBlazor,但是我忘了使 ...
- Spring 学习笔记(5)AOP
本文介绍 Spring 中 AOP 的原理及使用方式. Spring AOP 简介 如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切 ...
- A*(A star)搜索总结
定义 先复制一则定义 A*算法在人工智能中是一种典型的启发式搜索算法 启发中的估价是用估价函数表示的: h(n)=f(n)+g(n) 其中f(n)是节点n的估价函数 g(n)表示实际状态空间中从初始节 ...
- 针对Python基本数据类型的操作
在学习Python语法前,请大家务必注意,Python是通过缩进来定义代码层次的,即同一层次的代码都是左对齐,而下个层次的代码块与当前代码块相比,会有4个空格的缩进. 这里缩进的空格数是约定俗成的,当 ...
- HOMER docker版本配置优化
概述 HOMER是一款100%开源的针对SIP/VOIP/RTC的抓包工具和监控工具. HOMER是一款强大的.运营商级.可扩展的数据包和事件捕获系统,是基于HEP/EEP协议的VoIP/RTC监控应 ...
- C#设计模式11——享元模式的写法
1. 什么是享元模式? 享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量.它通过将对象分为可共享的和不可共享的来实现这一目的. 2. 为什么要使用享元模式? 使用享元模式可 ...