Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >eBPF是什么

eBPF是什么

作者头像
虚拟化云计算
发布于 2023-03-28 00:57:05
发布于 2023-03-28 00:57:05
8400
举报
文章被收录于专栏:虚拟化云计算虚拟化云计算

大家好,今天聊聊eBPF,

一看带e的都很厉害,

PCI Express

NVM Express

eBPF也很厉害:extended BPF。

聊eBPF首先得知道BPF,BPF如果也不熟悉,那大名鼎鼎的 tcpdump 和 wireshark大家很熟悉,他俩是借助BPF实现的。

什么是BPF

BPF出现于BSD,其全称是 Berkeley Packet Filter,顾名思义,它是在伯克利大学诞生的,并且是一个用于过滤(filter)网络报文(packet)的技术。

1992年Steven McCanne 和 Van Jacobson 写了一篇《The BSD Packet Filter: A New Architecture for User-level Packet Capture》论文 ,第一次提出了BPF技术。

在文中,描述了他们如何在 Unix 内核实现网络数据包过滤,这种新的技术比当时最先进的数据包过滤技术快 20 倍。

BPF干什么用?

BPF与之前网络过滤的区别是把过滤功能放到了内核中,其过程是网卡接收到一个数据包后,从数据链路层将数据包额外的拷贝一份交给BPF程序进行处理,BPF根据用户设定的过滤规则对数据包进行过滤。只有符合规则的数据包从内核空间拷贝到用户空间,这样就减少了无用的数据包的拷贝。

BPF 可谓是名气不大,作用不小的典范呀,BPF 可是大名鼎鼎的 tcpdump 和 wireshark 乃至网络监控(Network Monitoring)领域的基石。

eBPF来了

BPF在引入Linux内核后,在发展过程中出现了很多的改进,较革命性的大动作就要等到内核3.17 了。

在这版本内核中BPF代码被添置到了 kernel/bpf 下,这一全新设计最终被命名为了 extended BPF(eBPF),而传统的BPF 仍被保留了下来,并被重命名为 classical BPF(cBPF)。

由一个文件(net/core/filter.c)进化到一个目录(kernel/bpf),相对于 cBPF,eBPF 带来的改变可谓是革命性的:

一方面引入Map机制,以前cBPF通过队列将过滤后的数据发送到用户空间,而eBPF则通过用户空间和内核空间共享的Map空间实现数据的传输。

另一方面,除了网络数据包过滤,添加了新的功能,如XDP、Perf Event、kprobe、tracepoint等。

同时eBPF还有了专门的用于编译BPF字节码的编译器clang/llvm。

eBPF基本原理

eBPF也叫内核虚拟机,本质上它是一种内核代码注入的技术,它提供了一种在不修改内核代码的情况下,可以灵活修改内核处理策略的方法。

eBPF程序attach到内核中的指定代码路径上,当内核执行到此路径时,将执行所有附加的eBPF程序。

鉴于其起源,eBPF特别适合于编写网络程序,例如 XDP就是在进入内核协议栈之前插入eBPF的扩展的网络包的过滤和转发功能。

但是目前,除了支持原来cBPF的Socket外,内核中已经支持了 几十 种 eBPF 程序类型。

开发语言

早期的cBPF程序直接使用BPF指令集来编写。

后来eBPF通过c语言进行编写,通过clang/llvm将c语言编译为BPF字节码并 手动注入到内核中。

再后来出现了BCC(BPF Compiler Collection),BCC可帮用户编译、解析 ELF、注入内核以及创建 map 等。

用户只需要用C语言来设计 BPF 程序,剩下的交给BBC处理。

同时也出现了对go和Rust的支持库,感兴趣的朋友可以看看libbpfgo和libbpf-rs这两个开源库。

举个例子

在iovisor的官方github上有一个例子:

bcc/examples/tracing/disksnoop.py

这里有一个磁盘监控的BPF程序,下图是它的代码片断:

其中trace_start 的函数将被编译进 BPF 字节码,然后注入到内核函数 blk_start_request 上,每当内核执行blk_start_request时,都会执行我们注入的trace_start函数。

目前eBPF已经成为内核中炙手可热的项目,其生态也日益壮大,从基础运行时,到各种语言的接口库,再到五花八门的应用程序,下面展示了部分生态成员:

生态系统

基础平台:

linux runtime

windows runtime

FPGA runtime

LLVM编译器

eBPF Libraries:

C/C++库:libbpf

Rust语言库:libbpf-rs

Go语言库:libbpfgo

应用程序:

工具集BCC

bpftrace

cilium

falco

katran

hubble

KubeArmor

kubectl trace

L3AF

ply

Tracee

BumbleBee

我是cloud3,一起聊聊。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 虚机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
eBPF 介绍_bcp方案是什么意思
Tcpdump 是Linux 平台常用的网络数据包抓取及分析工具,tcpdump 主要通过libpcap 实现,而libpcap 就是基于eBPF。
全栈程序员站长
2022/11/08
8830
eBPF 介绍_bcp方案是什么意思
eBPF技术简介
“eBPF 是我见过的 Linux 中最神奇的技术,没有之一,已成为 Linux 内核中顶级子模块,从 tcpdump 中用作网络包过滤的经典 cbpf,到成为通用 Linux 内核技术的 eBPF,已经完成华丽蜕变,为应用与神奇的内核打造了一座桥梁,在系统跟踪、观测、性能调优、安全和网络等领域发挥重要的角色。为 Service Mesh 打造了具备 API 感知和安全高效的容器网络方案 Cilium,其底层正是基于 eBPF 技术”
CNCF
2020/08/24
19.8K1
eBPF技术简介
【云原生技术研究】BPF使能软件定义内核
BPF通过一种软件定义的方式,将内核的行为和数据暴露给用户空间,开发者可以通过在用户空间编写BPF程序,加载到内核空间执行,进而实现对内核行为的灵活管理和控制
绿盟科技研究通讯
2020/03/12
1.4K0
eBPF文章翻译(1)—eBPF介绍
Brendan Gregg,他在2017年的linux.conf.au大会上的演讲提到「内核虚拟机eBPF」,表示,”超能力终于来到了Linux操作系统“。让eBPF达到这一点是一条漫长的进化和设计之路。虽然eBPF最初用于网络包过滤,但事实证明,对于内核开发人员和生产工程师来说,在一个可以进行健康检查的虚拟机中运行用户态代码,能成为一个强大的工具。随着时间的推移,越来越多新的eBPF用户开始利用它的高性能和便利性。本文解释了eBPF是如何演进,如何工作,以及如何在内核中使用它。
nevermosby
2020/05/11
2.7K0
Service Mesh架构新技能之eBPF入门与实践
在分享这篇文章之前,先简单和大家说下背景。在之前的文章中作者分享了一些关于Service Mesh微服务架构的文章,在Service Mesh架构中需要通过SideCar代理的方式对应用容器流量进行劫持,并以此实现微服务治理相关的各种能力。但这种SideCar方式在微服务数量过多时会造成系统性能的降低,因为SideCar本质上来说,也是通过用户代码实现的网络代理来进行流量管控的。而eBPF则是一种替代SideCar的新式解决方案,它存在于操作系统的内核层级,在性能上表现更优。 因此目前关于Service Mesh微服务架构的技术方案开始逐步趋向于使用eBPF来替代原先的像Envoy这样的SideCar代理。本文的内容将详细介绍eBPF的前世今生,具体如下:
用户5927304
2022/08/30
1.4K0
Service Mesh架构新技能之eBPF入门与实践
eBPF在android上的使用
eBPF是extended BPF的缩写,而BPF是Berkeley Packet Filter的缩写。对linux网络比较熟悉的伙伴对BPF应该比较了解,它通过特定的语法规则使用基于寄存器的虚拟机来描述包过滤的行为。比较常用的功能是通过过滤来统计流量,tcpdump工具就是基于BPF实现的。而eBPF对它进行了扩展来实现更多的功能。
刘盼
2021/02/12
5.5K0
eBPF在android上的使用
eBPF 入门开发实践指南一:介绍 eBPF 的基本概念、常见的开发工具
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方,但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中,实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为,稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。
云微
2023/02/24
8630
大规模储能技术_新技术储备
可执行与可链接格式 (英语:Executable and Linkable Format,缩写 ELF,此前的写法是 Extensible Linking Format),常被称为 ELF格式,在计算中,是一种用于可执行文件、目标代码、共享库和核心转储(core dump)的标准文件格式。
全栈程序员站长
2022/09/27
9440
大规模储能技术_新技术储备
ebpf技术_EBM技术
BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成,它在那个位置利用一个校验器进行检查 —— 以避免内核崩溃或者安全问题 —— 并附着到一个套接字上,接着在每个接收到的包上运行。几年后它被移植到 Linux 上,并且应用于一小部分应用程序上(例如,tcpdump)。其简化的语言以及存在于内核中的即时编译器(JIT),使 BPF 成为一个性能卓越的工具。
全栈程序员站长
2022/11/08
2.7K0
ebpf技术_EBM技术
基于ubuntu22.04-深入浅出 eBPF
笔者在很早之前就看eBPF这类似的文章,那时候看这个技术一脸懵逼,不知道它是用来做什么,可以解决什么问题。所以也没有太关注这个技术。很庆幸最近刚好有机会研究这个技术。
Rice加饭
2023/06/13
8250
基于ubuntu22.04-深入浅出 eBPF
探索eBPF:Linux内核的黑科技
Linux内核在2022年主要发布了5.16-5.19以及6.0和6.1这几个版本,每个版本都为eBPF引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。总体而言,eBPF在内核中依然是最活跃的模块之一,它的功能特性也还在高速发展中。某种意义上说,eBPF正朝着一个完备的内核态可编程接口快速进化。
嵌入式Linux内核
2023/06/28
1.9K0
探索eBPF:Linux内核的黑科技
ebpf简介_ebpf编程
eBPF 是什么呢? 从它的全称“扩展的伯克利数据包过滤器 (Extended Berkeley Packet Filter)” 来看,它是一种数据包过滤技术,是从 BPF (Berkeley Packet Filter) 技术扩展而来的。顾名思义BPF来源于伯克利大学, 最早应用于网络数据包过滤器,它比当时最先进的抓包技术快20倍,其主要得利于它的两个设计:
全栈程序员站长
2022/11/08
6600
ebpf简介_ebpf编程
初探linux 革命性技术eBPF
在排查网络问题与深入了解网络协议的工作原理的时候,sre最常使用tcpdump。但是实际上tcpdump只能告诉你网络上传输了哪些包,没有体现为什么这么传输,在排查网络丢包问题的时候是存在一定的局限性的。这时候就需要依赖BCC这个工具来深入地排查网络的问题了。(对于tcpdump与bcc的使用后续可以单独介绍)。
五分钟学SRE
2023/11/22
1.3K0
初探linux 革命性技术eBPF
张亦鸣 : eBPF 简史 (下篇)
本文介绍了 Linux 内核中的 BPF,从最初的 BPF 指令集,到后续的扩展指令集,以及将 BPF 用于 Linux 内核的进程调度、网络协议、文件系统等场景。作者还介绍了 BCC,即 BCC 框架,该框架是对 Linux 内核的扩展,可以用 BCC 框架来开发高性能、现代化的内核模块。
Linuxer
2017/11/09
6.5K0
张亦鸣 : eBPF 简史 (下篇)
BPF简介
BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成,它在那个位置利用一个校验器进行检查 —— 以避免内核崩溃或者安全问题 —— 并附着到一个套接字上,接着在每个接收到的包上运行。几年后它被移植到 Linux 上,并且应用于一小部分应用程序上(例如,tcpdump)。其简化的语言以及存在于内核中的即时编译器(JIT),使 BPF 成为一个性能卓越的工具。
233333
2022/05/10
1.6K0
BPF简介
基于 eBPF 的 Linux 可观测性
最近发布的 Linux 内核带了一个针对内核的能力强大的 Linux 监控框架。它起源于历史上人们所说的的 BPF。
黑光技术
2020/05/14
2.4K0
基于 eBPF 的 Linux 可观测性
从0带你开始搭建ebpf开发环境
对于操作系统来说,他应该越稳定越好,100年不更新代码才好呢,但是对于运行在操作系统的软件来说,它应该变化的越快越好,比如我想新增一些设备驱动,或者是iptables扩展,再或者内核到用户态进程的全链路监控(性能监控),再或者恶意程序在内核态挂钩关键函数(EDR杀毒),再或者传统的流量检测引擎都是运行在用户态的,那么赖系统调用和频繁的数据拷贝,性能开销大(CPU利用率高),且无法访问内核内部状态(如TCP重传队列)(现在有DPDK了,直接旁路协议栈更牛了)。
于顾而言SASE
2025/03/24
2730
从0带你开始搭建ebpf开发环境
Linux eBPF解析
今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。截至目前,业界使用范围最广的 K8S CNI 网络方案 Calico 已宣布支持 eBPF,而作为第一个实现了Kube-Proxy 所有功能的 K8S 网络方案——Cilium 也是基于 eBPF 技术。因此,只有了解其底层机制,才能有助于更好、更易地融入容器生态中。
Luga Lee
2021/12/09
1.3K0
Linux eBPF解析
eBPF 入门开发实践教程一:介绍与快速上手
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方, 但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中, 实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为, 稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。
云微
2023/02/24
1.7K0
eBPF 概述:第 3 部分:软件开发生态
在本系列的第 1 部分和第 2 部分中,我们对 eBPF 虚拟机进行了简洁的深入研究。阅读上述部分并不是理解第 3 部分的必修课,尽管很好地掌握了低级别的基础知识确实有助于更好地理解高级别的工具。为了理解这些工具是如何工作的,我们先定义一下 eBPF 程序的高层次组件:
233333
2023/11/27
3850
eBPF 概述:第 3 部分:软件开发生态
相关推荐
eBPF 介绍_bcp方案是什么意思
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档