Fabyone / awesome-ebpf-zh

与 eBPF 相关的精选项目的中文清单

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

令人惊叹的 eBPF 令人惊叹

一个关于eBPF的项目精选清单。

BPF,即伯克利数据包过滤器(Berkeley Packet Filter),是运行从用户空间传递的程序的内核虚拟机。最初在BSD上实现,然后移植到Linux上,在内核中使用“经典BPF”或cBPF机器,例如tcpdump等工具用于过滤数据包,以避免将数据复制到用户空间。最近,Linux中的BPF基础设施已经完全重构,并诞生了“扩展BPF”(eBPF),它获得了新功能(程序的安全性和终止检查、JIT编译、持久化映射、标准库、硬件卸载支持等),并且现在被用于许多任务。在非常低的水平(XDP)处理数据包,跟踪和监视系统上的事件,或者强制执行访问控制cgroups等都是eBPF为其提供性能,可编程性和灵活性的一些例子。

最近,Cilium 推出了一个关于 eBPF 的很棒的网站 ebpf.io。它有着类似于这份列表的作用,提供了 eBPF 简介 以及与之相关的项目链接。

注意: eBPF 是一项令人兴奋的技术,其生态系统不断发展。我们很希望得到您的帮助,以使这个很棒的列表保持最新,以及以任何我们能做到的方式来提高其信噪比。请随意在 这里 留下任何反馈。

目录

参考文档

eBPF 基础知识

内核文档

手册页面

  • bpf(2) - 用于从用户空间管理 BPF 程序和映射的系统调用 bpf() 的手册页。
  • tc-bpf(8) - 关于如何与 tc 一起使用 BPF 的手册页,包括示例命令和代码示例。
  • bpf-helpers(7) 手册页 - 描述组成 BPF 标准库的内核帮助程序函数。

其他

文章和演示

通用的 eBPF 演示文稿和文章

如果你刚接触eBPF,你可能想尝试本节中被描述为“介绍”的链接。

BPF 内部机制

内核跟踪

XDP

AF_XDP

bpfilter

BTF

BTF

cBPF

传统BPF

硬件卸载

教程

示例

  • linux/samples/bpf/ - 内核树:一些 eBPF 程序示例。
  • linux/tools/testing/selftests/bpf - 内核树:Linux BPF 自测,包含许多 eBPF 程序。
  • prototype-kernel/kernel/samples/bpf - Jesper Dangaard Brouer 的原型内核存储库包含一些可以在内核基础设施之外编译的附加示例。
  • iproute2/examples/bpf/ - 一些网络程序用于连接到 TC 接口。
  • Netronome sample network applications - 提供基本但完整的 eBPF 应用程序示例,也与硬件卸载兼容。
  • bcc/examples - 与 bcc 工具一起提供的示例,主要与跟踪有关。
  • bcc/tools - 这些工具本身可以被视为 BPF 程序的示例用例,主要用于追踪和监视。 bcc 工具已针对一些 Linux 发行版进行了打包。
  • MPLSinIP sample - 大量注释的示例,演示了如何在 IP 中封装和解封装 MPLS。 该代码适用于 BPF 开发新手。
  • ebpf-samples - 多个项目中收集的编译(作为 ELF 对象文件)的示例集合,主要用作用户空间验证器的测试用例。
  • ebpf-kill-example - 完全记录和测试过的 eBPF 探针示例,可记录所有强制终止并在用户空间中将其打印出来。
  • redbpf examples - 使用 RedBPF 编写 Rust eBPF 程序的示例程序。

eBPF 工作流程:工具和实用程序

抄送

  • bcc - 框架和工具 - 一种处理BPF程序的方法,特别是用于跟踪和监视。还包括一些实用程序,可帮助检查系统中的映射或程序。
  • 用于BCC的Lua前端 - 另一种替代C,甚至是bcc中大多数Python代码的选择。

iproute2

  • iproute2 - 这个软件包包含了在 Linux 上进行网络管理的工具,其中包括了用于管理 eBPF 过滤器和动作的 tc,以及用于管理 XDP 程序的 ip。大多数与 BPF 相关的代码都在 lib/bpf.c 中。
  • iproute2-next - 这是 iproute2 的开发树,与 net-next 同步更新。

LLVM

LLVM

  • LLVM - 包含在 eBPF 工作流程中广泛使用的多个工具。最新版本的 Ubuntu/Debian 快照可以从 这里 获取。

  • clang被用来将C语言编译成eBPF格式的ELF目标文件(需使用clang v3.7.1+)。 BPF后端是通过此提交添加的。

  • llvm-objdump用于以人类可读的格式转储目标文件的内容,可能包括初始的C源代码(需使用llvm-objdump v4.0+)。

  • llvm-mc用于从LLVM中间表示编译成eBPF目标文件,因此可以从C语言编译成eBPF汇编语言,进而修改汇编代码,最后编译成ELF文件。

libbpf

  • libbpf - 一个用于处理BPF对象(程序和映射)和操作包含它们的ELF对象文件的C库。它随内核一起提供,并在GitHub上进行了镜像
  • libbpf-bootstrap - 用于使用libbpf和BPF CO-RE进行BPF应用开发的脚手架。

Go 库

  • cilium/ebpf - 纯Go库,用于读取、修改、加载eBPF程序并将其附加到Linux内核中的各种钩子。
  • libbpfgo - 由libbpf支持的用于Go的eBPF库。
  • gobpf - 用于创建eBPF程序的BCC的Go绑定。

阿嫣

  • aya - 一种用纯 Rust 编写、加载和管理 eBPF 对象的库,专注于开发人员体验和可操作性。它支持在 Rust 中编写 eBPF 程序,并通过 crates.io 分发库代码以在 eBPF 程序之间共享。Aya 不依赖于 libbpf。
  • aya-template - 用于在 Aya 中编写 BPF 应用程序的模板,可以与 cargo generate 一起使用。

eunomia-bpf

  • eunomia-bpf - 一个编译框架和运行库,可用于构建、分发、动态加载和运行多语言和WebAssembly的CO-RE eBPF应用程序。它支持仅写eBPF内核代码(以构建简单的CO-RE libbpf eBPF应用程序)、同时以BCC和libbpf风格编写内核部分,以及在WASM模块中以多种语言编写用户空间,并使用简单的JSON数据或WASM OCI镜像分发它。运行时仅基于libbpf,并提供CO-RE给BCC-style的eBPF程序,而不依赖于LLVM库。

氧化物bpf

  • oxidebpf - 一个纯Rust库,用于管理eBPF程序,专为安全用例设计。功能集比其他库更有限,但强调在广泛的内核范围和向后兼容的编译一次运行多个地方方面的稳定性。

bpftool和内核树中的其他工具

  • bpftool - 还有一些其他内核树中的工具,位于版本早于4.15的linux/tools/net/,或者之后的linux/tools/bpf/

  • bpftool - 一个通用的实用工具,可用于与eBPF程序和用户空间映射进行交互,例如显示、转储、加载、反汇编、附着和分离程序到控制组,或显示、创建、固定、更新、删除映射。

    • bpf_asm - 一个最小的cBPF汇编器。
    • bpf_dbg - 一个用于cBPF程序的小型调试器。
    • bpf_jit_disasm - 一种适用于两种BPF语言的反汇编器,对JIT调试非常有用。

用户空间 eBPF

  • uBPF - 用 C 编写。包含一个解释器、一个用于 x86_64 架构的 JIT 编译器、一个汇编器和反汇编器。
  • A generic implementation - 支持 FreeBSD kernel、FreeBSD user space、Linux kernel、Linux user space 和 macOS user space。用于 VALE 软件交换机BPF 扩展模块
  • rbpf - 用 Rust 编写。用于 Linux、macOS 和 Windows 的解释器,以及在 Linux 下用于 x86_64 的 JIT 编译器。
  • PREVAIL - 用于 eBPF 的用户空间验证器,使用抽象解释层实现,支持循环。
  • oster - 用 Go 编写。通过将 eBPF 附加到 uprobes 来跟踪 Go 程序的执行的工具。
  • wachy - 一款追踪分析器,旨在通过将跟踪结果显示在源代码旁边并允许交互式分析以简化 eBPF uprobes 调试的使用。

其他平台上的eBPF

  • eBPF for Windows - 这个项目还在进行中,它允许使用现有的eBPF工具链和Linux生态系统中熟悉的API在Windows上使用。

在虚拟环境中进行测试

与 eBPF 相关的项目

网络

可观测性

  • InKeV: In-Kernel Distributed Network Virtualization for DCN
  • DEEP-mon - 用于测量服务器能耗的工具,利用eBPF程序进行数据聚合处理。
  • pixie - 使用eBPF进行Kubernetes的可观测性分析。支持协议跟踪,应用程序分析以及分布式bpftrace部署等功能。
  • SkyWalking Rover - Apache SkyWalking是一个专门为分布式微服务、云原生和基于容器(Kubernetes)架构而设计的开源应用程序性能监控(APM)平台。SkyWalking Rover是一个基于eBPF的调试器和度量收集器,支持C、C++、Golang和Rust应用程序。
  • parca-agent - 基于eBPF的持续分析CPU和内存使用情况的分析器,可分析到代码行和时间流逝情况。
  • rbperf - 用于Ruby的采样分析器和跟踪器。
  • Hubble - 使用eBPF为Kubernetes提供网络、服务和安全可观测性。
  • Caretta - 通过eBPF生成的即时Kubernetes服务依赖图,可直接输出到Grafana示例。

安全

  • Falco - 一款云原生的运行时安全项目,用作 Kubernetes 威胁检测引擎。
  • Sysmon for Linux - 一款安全监控工具。它依赖于SysinternalsEBPF
  • Red Canary Linux Agent - Red Canary 已经开始将 eBPF 纳入其 Linux 安全传感器。
  • Tracee - 一款用于 Linux 的运行时安全和取证工具,它使用 eBPF 技术对系统和应用程序进行跟踪,在运行时分析收集的事件以检测可疑的行为模式。
  • redcanary-ebpf-sensor - 一组 BPF 程序,从 Linux 内核中收集与安全相关的事件数据。BPF 程序组合成一个单独的 ELF 文件,可以根据运行的操作系统和内核版本选择性加载单个探针。
  • bpflock - 锁定 Linux 机器 - 一种基于 eBPF 的安全工具,用于锁定和审计 Linux 机器。
  • Tetragon - 面向 Kubernetes、基于 eBPF 的安全监测和运行时强制执行工具。

工具

  • ply - 一个 Linux 的小型而灵活的开源动态跟踪器,具有类似于 bcc 工具的功能,但语言更简单,灵感来自 awk 和 DTrace。
  • bpftrace - 一个使用自己的高级跟踪语言进行跟踪的工具。它足够灵活,可以被想象成 DTrace 和 SystemTap 的 Linux 替代品。
    • bpftrace Cheat Sheet - bpftrace 编程的摘要和备忘单。 包含有关语法,探针类型,变量和函数的信息。
  • kubectl trace - 一个用于在 Kubernetes 集群中执行 bpftrace 程序的 kubectl 插件。
  • inspektor-gadget - 基于 eBPF 的工具集合,用于调试和检查 Kubernetes 资源和应用程序。
  • bpfd - 运行带有 Linux 规则的 BPF 程序的框架。 容器感知。
  • BPFd - 明显的 BPF 守护程序,试图利用 bcc 工具的灵活性来跟踪和调试远程目标,特别是在运行 Android 的设备上。
  • adeb - 用于在拥有 BPFd 的 Android 上使用跟踪工具的 Linux shell 环境。
  • greggd - 系统守护进程,用于将 eBPF 程序编译和加载到内核中,并将程序输出转发到套接字以进行度量聚合。
  • FUSE - 考虑使用 eBPF。
  • upf-bpf - 基于 XDP 的内核解决方案,适用于 5G UPF。
  • redbpf - 用于高效编写 Rust 中的 eBPF 代码的工具和框架。

eBPF在安全中

代码

  • linux/include/linux/bpf.h - 包含与eBPF相关定义的头文件,适用于内核开发和用户空间交互。

  • linux/include/linux/filter.h - 包含用于运行BPF程序本身的信息。

  • linux/kernel/bpf/ - 此目录包含大部分与BPF相关的代码。特别是以下文件值得关注:。

  • syscall.c - 系统调用允许的各种操作,如程序加载或映射管理。

  • linux/net/core/filter.c - 与网络相关的函数和 eBPF 帮助程序(TC,XDP 等);还包含将 cBPF 字节码迁移到 eBPF 的代码(所有 cBPF 程序在近期内核中都被转换为 eBPF)。

  • linux/kernel/trace/bpf_trace.c - 与跟踪和监控相关的函数和 eBPF 帮助程序(kprobes,tracepoints 等)。

  • JIT 编译器位于其各自体系结构的目录下,例如文件 linux/arch/x86/net/bpf_jit_comp.c 用于 x86. 对于用于硬件卸载的 JIT 编译器,其驱动程序会有相应的文件,例如 linux/drivers/net/ethernet/netronome/nfp/bpf/jit.c 是针对 Netronome NFP 的。

  • linux/net/sched/ - 特别是在文件 act_bpf.c(操作)和 cls_bpf.c(过滤器)中:与使用 TC 的 BPF 操作和过滤器相关的代码。

  • linux/kernel/seccomp.c

  • linux/net/core/dev.c - 包含函数 dev_change_xdp_fd(),该函数通过一个 Netlink 命令调用,将 XDP 程序钩到设备上,然后将从用户空间加载到内核的程序。该函数会使用相关驱动程序的回调函数。

开发和社区

eBPF相关资源列表

(Note: This translation is in simplified Chinese. If you need traditional Chinese or another Chinese variant, please let me know!)

致谢

感谢Quentin Monnet和Daniel Borkmann对 深入理解BPF:阅读材料列表 的原创工作,为该列表奠定了基础。

贡献

欢迎贡献!首先请阅读贡献指南

许可证

知识共享CC0

尽可能根据法律规定,zoidbergwill已放弃对此作品的所有版权和相关权利。

About

与 eBPF 相关的精选项目的中文清单

License:Creative Commons Zero v1.0 Universal