今天,我们来了解下 Linux 系统的革命性通用执行引擎-eBPF,之所以聊着玩意,因为它确实牛逼,作为一项底层技术,在现在的云原生生态领域中起着举足轻重的作用。 由于 eBPF 还在快速发展期,内核中的功能也日趋增强及完善,因此,在实际的业务场景中,我们一般推荐基于 Linux 4.4+ (4.9 以上效能会更佳) 内核的来使用 eBPF。 部分 Linux Event 和 BPF 版本支持见下图: 除上述较为知名的 eBPF 相关的开源项目外,还有越来越多的新兴项目如雨后脆笋一样开始蓬勃发展,并逐步在各种社区布局、 include/linux/bpf.h,对于无权限的BPF程序,仍然保留 4096 条限制 ( BPF_MAXINSNS );新版本的 eBPF 也支持了多个 eBPF 程序级联调用,虽然传递信息存在某些限制 3、eBPF 堆栈大小被限制在 MAX_BPF_STACK,截止到内核 Linux 5.8 版本,被设置为 512;可参考源码所示: include/linux/filter.h,这个限制特别是在栈上存储多个字符串缓冲区时
前言我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试。 与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序的任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。 print_functionfrom bcc import BPFfrom time import sleep# define BPF programbpf_program = """#include <uapi/linux
前言 我们可以使用BPF对Linux内核进行跟踪,收集我们想要的内核数据,从而对Linux中的程序进行分析和调试。 与其它的跟踪技术相比,使用BPF的主要优点是几乎可以访问Linux内核和应用程序的任何信息,同时,BPF对系统性能影响很小,执行效率很高,而且开发人员不需要因为收集数据而修改程序。 print_function from bcc import BPF from time import sleep # define BPF program bpf_program = """ #include <uapi/linux master/INSTALL.md bcc程序编写指导手册 https://github.com/iovisor/bcc/blob/master/docs/reference_guide.md 参考书《Linux 内核观测技术 BPF》 本文来源于陈莉君老师“Linux内核之旅”。
Linux内核在2022年主要发布了5.16-5.19以及6.0和6.1这几个版本,每个版本都为eBPF引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。 概述 1.1eBPF是什么 eBPF 是一个基于寄存器的虚拟机,使用自定义的 64 位 RISC 指令集,能够在 Linux 内核内运行即时本地编译的 “BPF 程序”,并能访问内核功能和内存的一个子集 eBPF 也是主线内核的一部分,所以它不像其他框架那样需要任何第三方模块(LTTng 或 SystemTap),而且几乎所有的 Linux 发行版都默认启用。 如下架构支持eBPF的JIT编译器: * x86-64 (since Linux 3.18; cBPF since Linux 3.0); * ARM32 (since Linux 3.18; cBPF Linux 3.16); * riscv (since Linux 5.1) 1.9eBPF辅助函数 可以参考官方帮助文档查看libbpf库提供的辅助函数。
目录 什么是eBPF eBPF架构 eBPF优势 eBPF相关工具 什么是eBPF eBPF 是什么呢? eBPF 程序架构强调安全性和稳定性,看上去更像内核模块,但与内核模块不同,eBPF 程序不需要重新编译内核,并且可以确保 eBPF 程序运行完成,而不会造成系统的崩溃。 eBPF优势 速度和性能。 eBPF 可以将数据包处理这项工作从内核空间转移到用户空间。同时,eBPF 还支持即时 (JIT) 编译器。 eBPF 为我们提供了一个单一、强大且易于访问的流程跟踪框架,这增加了可见性和安全性。 可编程性。 使用 eBPF 有助于在不添加额外层的情况下增加环境的功能丰富性。 BCC通常用在开发复杂的 eBPF 程序中,其内置的各种小工具也是目前应用最为广泛的 eBPF 小程序。
https://github.com/chompie1337/Linux_LPE_eBPF_CVE-2021-3490 https://www.youtube.com/watch? Gorilla) 构建: make groovy 为 Ubuntu 21.04 (Hirsute Hippo) 构建: make hirsute 运行: bin/exploit.bin [+] eBPF
eBPF 又是什么? eBPF 是对 Linux 观测系统 BPF 的扩展和加强版本。可以把它看作是 BPF 的同类。 为什么用 eBPF 来做 Linux 监控? 作为 Linux 内核核心的一部分,eBPF 不依赖于任何第三方模块或者扩展依赖。 Linux eBPF程序剖析 在进一步分析 eBPF 程序的结构之前,有必要说一下 BCC(BPF 编译器),这是一个工具集,用于编译 eBPF 需要的字节码,并且提供了 Python 和 Lua 的绑定支持 Linux eBPF 例子 现在来看一个 Linux eBPF 程序的例子。目标是捕获对 setns 系统调用的调用者。 它也通过使用 eBPF 来捕获 TCP/UDP 流量统计,为网络监控提供了一种高效的网络跟踪。eBPF 的目标似乎是通过 Linux 内核监控成为一个事实上的 Linux 监控标准。
实际上tcpdump与bcc能够很高效与强大,都是得益于eBPF技术。微服务潮流下linux内核的问题在介绍eBPF之前,我们先来看下微服务潮流下linux内核的问题。 同时,因为 eBPF 指令依然运行在内核中,无需向用户态复制数据,这就大大提高了事件处理的效率。eBPF的工作原理要理解 eBPF 首先要意识到:Linux 内核本质上是事件驱动的。 在图中间,是 12 million 行巨型单体应用(Linux Kernel)的代码,这些代码处理 各种事件。 eBPF 给我们提供了在事件发生时运行指定的 eBPF 程序的能力。 ,Linux 对eBPF调用会有一定的校验规则。 下面这张图是eBPF的 技术概览推荐与参考文章https://www.infoq.com/presentations/linux-cilium-ebpf/(How to Make Linux Microservice-Aware
写在前面 博文内容涉及 使用 eBPF 监控内存 OOM killer 事件,并且采集当前系统的部分相关指标数据 介绍了传统的监控方式以及使用 BPF/eBPF 的方式 关于 OOM killer 是什么 代指整个 BPF/eBPF 技术 OOM Killer 事件: OOM Killer(Out-Of-Memory Killer)是内核在系统内存严重不足时触发的紧急机制,通过终止进程释放内存以维持系统稳定 * For Linux, uses bpftrace and eBPF. For Linux, uses BCC, eBPF. # # This traces the kernel out-of-memory killer, and prints basic details, program bpf_text = """ #include <uapi/linux/ptrace.h> #include <linux/oom.h> struct data_t { u32
关键摘要新的 Linux 恶意软件活动:网络安全研究人员发现了一个利用 eBPF 技术并针对全球企业和用户的活跃 Linux 恶意软件活动。 Web 发现了一个针对东南亚企业和用户的新活跃 Linux 恶意软件活动。这一发现是在对他们的一位客户报告的恶意软件攻击进行调查时发现的。调查始于一位客户找到 Dr. 利用 eBPF 技术研究人员发现,黑客一直在攻击中使用 eBPF(扩展伯克利数据包过滤器)技术。eBPF 最初旨在提供更好的 Linux 操作系统网络功能的控制。 值得注意的是,人们对 eBPF 的关注度越来越高,尤其是在 2021 年 8 月之后,谷歌、Isovalent、Meta、Microsoft 和 Netflix 等科技巨头合作在 Linux 基金会下成立了 eBPF 基金会,以支持 eBPF 技术的发展和采用。
ebpf简介eBPF 是一种新标准,可以安全高效地对 Linux 内核功能进行编程,而无需更改内核源代码或加载内核模块。它支持开发新一代高性能工具,涵盖网络、安全性和可观测性用例。 ,它可以帮助开发者查看、加载、卸载 eBPF 程序,并操作 eBPF maps(映射)2。 它是 Linux 内核工具的一部分,专门用于与 eBPF 相关的任务。 查看当前系统中加载的 eBPF 程序bpftool prog list查看 eBPF mapsbpftool map list现有的ebpf工具目前除了 BCC,还有许多其他的 eBPF 相关工具:kyanos bpftrace一个更高级的 eBPF 追踪工具,适用于快速构建监测脚本。bpftrace 直接使用 eBPF 运行,无需额外编译。
原文名称:A thorough introduction to eBPF,原文地址:https://lwn.net/Articles/740157/ Brendan Gregg,他在2017年的linux.conf.au 大会上的演讲提到「内核虚拟机eBPF」,表示,”超能力终于来到了Linux操作系统“。 目录 eBPF的演变 你能用eBPF做什么 eBPF内核验证器 系统调用函数bpf() eBPF程序类型 eBPF 数据结构 如何编写一个eBPF程序 后记——翻译小结 eBPF的演变 原始的 bpf是设计用来抓取和过滤符合特定规则的网络包 你能用eBPF做什么 eBPF程序被“附加”到内核中指定的代码路径。当代码路径被遍历到时,任何附加的eBPF程序都会被执行。 eBPF 数据结构 eBPF程序使用的主要数据结构是eBPF map(键值对)数据结构,这是一种通用的数据结构,允许在内核内部或内核与用户空间之间来回传递数据。
2 eBPF 如何改变 Linux? InfoQ:作为⼀项⾰命性的技术,eBPF 为 Linux 带来了哪些改变?它是如何⼯作的? • LMP 项目:LMP(Linux显微镜)基于eBPF探索和孵化更多的创新项目,形成对Linux内核深入探索和细粒度观察,给初学者探索和学习提供一种项目超市。 通过技术创新和技术合作,降低 eBPF 的学习和使用门槛,为高校师生、eBPF 技术爱好者、Linux 从业者提供工具和平台,打造创新的 eBPF 技术落地到 Linux 内核社区。 今年有哪些值得关注的 Linux 及 eBPF 动态? 陈莉君教授:Linux 得以成功,主要得益于其开源自由、社区参与贡献、技术性能与安全性能兼备的特点。 值得关注的一些 Linux 及 eBPF 动态: • Linux 支持 eBPF 调度策略的定制。eBPF 调度策略系列补丁将会进一步提升这个功能的稳定性,预计今年会有比较多的实际应用呈现。
---- 如今,新一代的Linux防火墙技术出现了!是的,它就是基于eBPF的bpfilter! eBPF是一个非常古老但最近才大行其道的技术,Linux内核中被埋下了越来越多的eBPF调用点,bpfilter正是基于这些非固定的,不断增多的HOOK点来其作用的,这和Netfilter固定的HOOK 目前Linux内核中,XDP,TC,Socket是TCP/IP网络协议栈中三个关键的eBPF程序的调用点,可以想象,这种eBPF调用点会越来越多,它不像Netfilter那样是固定的5个或者说几个HOOK 很多年前我玩Cisco ACL就知道,Cisco的做法是将ACL规则优化编译加载到网卡,如今Linux的eBPF字节码在XDP运行,也是一样的路子。 循序渐进,下面的例子稍微有点难度,需要自己来解析数据包,禁止所有的TCP数据包: #include <linux/bpf.h> #include <linux/in.h> #include <linux
eBPF 允许用户在 Linux 内核中加载和安全运行自定义程序,而无需直接更改内核本身。可能性是无限的。 而这正是我们今天在 eBPF 周围看到的情况——另一项源自 Linux 内核原语的技术。如今,每个主要的网络、可观察性和安全供应商都在宣称提供“基于 eBPF 的”产品。 InfoWorld 与 Daniel Borkmann 进行了交谈——eBPF 的共同创造者,也是 Linux 内核当前的 eBPF 共同维护者——以了解更多关于该技术起源的信息,为什么 eBPF 已成为编程和定制 重新思考 Linux 操作系统中的网络 eBPF 背后的起源故事实际上始于 2011 年,当时软件定义网络 (SDN) 正在兴起,Linux 的采用率正在飙升。 “在 eBPF 出现之前,大多数用户使用企业 Linux 发行版,或者直接运行设备上安装的内核版本,”Cilium 的 Graf 说。
eBPF 如何重塑可观察性工程(第一部分) eBPF 一夜成名,但其发展由来已久。正如去年的 解锁内核 纪录片所示,eBPF 解释器早在 2014 年就首次合并到了 Linux 网络堆栈中。 eBPF 是一款变革性技术,因为它允许应用程序直接连接到 Linux 内核。这意味着 eBPF 应用程序可以清晰地查看网络流量,同时具有较小的占用空间和巨大的可扩展性。 限制 第一个是,目前,eBPF 是一项仅适用于 Linux 的技术。它不是跨平台的 - 尽管 Windows 版本正在开发中。 许多 eBPF 解决方案被描述为“云原生” - 这通常归结为在 Kubernetes 上运行 - 这显然又意味着在 Linux 主机上运行。 当 Pixie 部署在 K8S 集群中时,它会部署 eBPF 内核探针 (kprobes),这些探针被设置为在用于网络的 Linux 系统调用上触发。
一个eBPF程序会附加到指定的内核代码路径中,当执行该代码路径时,会执行对应的eBPF程序。 (Copy):将符合条件的报文由内核空间复制到用户空间; 缺点(落后):虚拟机指令集架构(ISA)相对落后,BPF提供的一小部分RISC指令无法在现有处理器上使用 (libpcap是unix/linux 对比Linux内核:需要更改内核源代码或加载内核模块,导致抽象层堆叠。 百度百科) 可以用ebpf做什么? eBPF程序“附加”到内核中的指定代码路径,进行数据包处理。遍历代码路径时,将执行所有附加的eBPF程序。 ebpf内核验证程序 允许用户空间代码在内核中运行存在固有的安全性和稳定性风险。因此,在加载每个eBPF程序之前,会对它们进行大量检查。 1、保证ebpf能正常结束,不会因为任何循环导致内核锁定。
在上一篇文章中,我们主要简单介绍了什么是 eBPF 和 eBPF 的简单使用,而本文重点介绍 eBPF 的实现原理。 eBPF虚拟机 其实我不太想介绍 eBPF 虚拟机的,因为一般来说很少会用到 eBPF 汇编来写程序。但是,不介绍 eBPF 虚拟机的话,又不能说清 eBPF 的原理。 下面我们用一个简单的例子来介绍怎么使用 Clang 编译 eBPF 程序,我们新建一个文件 hello.c 并且输入以下代码: #include <linux/bpf.h> static int (* 每个 eBPF 的 helper 函数都有一个编号(通过枚举类型 bpf_func_id 来定义),定义在 include/uapi/linux/bpf.h 文件中,定义如下(只列出一部分): enum __BPF_FUNC_MAX_ID, }; 下面我们来看看在 eBPF 程序中怎么调用 helper 函数: #include <linux/bpf.h> // 声明要调用的helper函数为:BPF_FUNC_trace_printk
eBPF的进化:随着时间的推移,BPF经历了多次改进和扩展,形成了今天的eBPF。eBPF拥有更丰富的指令集、更大的寄存器集合,以及更强的安全性和灵活性。 应用领域: 网络:eBPF可用于高级网络策略实施,比如使用XDP进行高性能的数据包处理。 性能监控:eBPF可以帮助收集详细的性能指标,如CPU使用情况、磁盘I/O、系统调用跟踪等。 当钩子点被触发时,eBPF程序自动执行。 这个工作流程就是一个简单的总结,实际上开发人员在编写 eBPF 时可以通过现在各种前端或者框架,很方便的进行使用。 eBPF技术以其高度的灵活性、安全性以及低开销的特点,正在成为现代云原生、容器化环境、以及需要高性能监控和安全控制场景下的关键技术。随着持续的发展和社区的支持,eBPF的应用前景非常广阔。 十年码农讲述eBPF和XDP技术!
“eBPF 是我见过的 Linux 中最神奇的技术,没有之一,已成为 Linux 内核中顶级子模块,从 tcpdump 中用作网络包过滤的经典 cbpf,到成为通用 Linux 内核技术的 eBPF,已经完成华丽蜕变 现在,Linux 内核只运行 eBPF,内核会将加载的 cBPF 字节码透明地转换成 eBPF 再执行。 对比 eBPF 在 Linux 3.18 版本以后引入,并不代表只能在内核 3.18+ 版本上运行,低版本的内核升级到最新也可以使用 eBPF 能力,只是可能部分功能受限,比如我就是在 Linux 发行版本 由于 eBPF 还在快速发展期,内核中的功能也日趋增强,一般推荐基于Linux 4.4+ (4.9 以上会更好) 内核的来使用 eBPF。 部分 Linux Event 和 BPF 版本支持见下图: 图 2-4 Linux 事件和 BPF 版本支持 2.2 eBPF 架构(观测) 基于 Linux 系统的观测工具中,eBPF 有着得天独厚的优势