Skip to content

eunomia-bpf:简化并增强eBPF,支持CO-RE1和WebAssembly2

GitHub release (latest by date) codecov DeepSource CodeFactor

一个帮助你更容易构建和分发eBPF程序的编译器和运行时框架。

简介

eunomia-bpf是一个动态加载库/运行时以及一个编译工具链框架,旨在帮助您更容易地构建和分发eBPF程序。

有了eunnomia-bpf,您可以:

  • 简化 编写 eBPF 程序的库:
  • 简化构建 CO-RE 1 libbpf eBPF应用程序:仅编写 eBPF 内核代码,并通过 perf eventring buffer 自动暴露您的数据从内核。
  • 自动采样数据 从哈希映射并在用户空间打印直方图。
  • 自动生成 并配置 eBPF 程序的命令行参数
  • 您可以同时以 BCClibbpf 的方式编写内核部分。
  • 使用 Wasm2 构建eBPF程序:参见 Wasm-bpf 项目
  • 运行时,库和工具链可以用 C/C++、Rust、Go 等以 Wasm 编写 eBPF,涵盖从跟踪网络安全的使用场景。
  • 简化eBPF程序的分发
  • 一个工具用于推送、拉取和运行预编译的eBPF程序作为Wasm模块的OCI镜像。
  • 1行 bash云端URL 运行eBPF程序,无需重新编译,独立于内核版本和架构。
  • 使用 JSON 配置文件或 Wasm 模块动态加载 eBPF 程序。

更多信息,请参见documents/introduction.md

开始使用

作为 CLI 工具或服务运行

您可以通过以下方式从云中运行预编译的eBPF程序到内核,只需1行bash命令:

# 从https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecli 下载发布版本
$ wget https://aka.pw/bpf-ecli -O ecli && chmod +x ./ecli
$ sudo ./ecli run https://eunomia-bpf.github.io/eunomia-bpf/sigsnoop/package.json # 从URL简单地运行一个预编译的ebpf代码
INFO [bpf_loader_lib::skeleton] Running ebpf program...
TIME     PID    TPID   SIG    RET    COMM   
01:54:49  77297 8042   0      0      node
01:54:50  77297 8042   0      0      node
01:54:50  78788 78787  17     0      which
01:54:50  78787 8084   17     0      sh
01:54:50  78790 78789  17     0      ps
01:54:50  78789 8084   17     0      sh
01:54:50  78793 78792  17     0      sed
01:54:50  78794 78792  17     0      cat
01:54:50  78795 78792  17     0      cat

$ sudo ./ecli run ghcr.io/eunomia-bpf/execve:latest # 使用一个名称运行并从我们的仓库下载最新版本的bpf工具
[79130] node -> /bin/sh -c which ps 
[79131] sh -> which ps 
[79132] node -> /bin/sh -c /usr/bin/ps -ax -o pid=,ppid=,pcpu=,pmem=,c 
[79133] sh -> /usr/bin/ps -ax -o pid=,ppid=,pcpu=,pmem=,command= 
[79134] node -> /bin/sh -c "/home/yunwei/.vscode-server/bin/2ccd690cbf 
[79135] sh -> /home/yunwei/.vscode-server/bin/2ccd690cbff 78132 79119 79120 79121 
[79136] cpuUsage.sh -> sed -n s/^cpu\s//p /proc/stat

您还可以使用服务器来管理和动态安装eBPF程序。

启动服务器:

$ sudo ./ecli-server
[2023-08-08 02:02:03.864009 +08:00] INFO [server/src/main.rs:95] Serving at 127.0.0.1:8527

使用ecli来控制远程服务器并管理多个eBPF程序:

$ ./ecli client start sigsnoop.json # 开始程序
1
$ ./ecli client log 1 # 获取程序日志
TIME     PID    TPID   SIG    RET    COMM   
02:05:58  79725 78132  17     0      bash
02:05:59  77325 77297  0      0      node
02:05:59  77297 8042   0      0      node
02:05:59  77297 8042   0      0      node
02:05:59  79727 79726  17     0      which
02:05:59  79726 8084   17     0      sh
02:05:59  79731 79730  17     0      which

有关更多信息,请参见documents/src/ecli/server.md

安装项目

  • 安装ecli工具以从云端运行eBPF程序:

    $ wget https://aka.pw/bpf-ecli -O ecli && chmod +x ./ecli
    $ ./ecli -h
    ecli子命令,包括run、push、pull、login、logout
    
    用法: ecli-rs [PROG] [EXTRA_ARGS]... [COMMAND]
    
    命令:
      run     运行ebpf程序
      client  客户端操作
      push    
      pull    从注册表中提取oci图像
      login   登录到oci注册表
      logout  从注册表登出
      help    打印此消息或给定子命令的帮助
    
    参数:
      [PROG]           不推荐使用。只为了与旧版本兼容。Ebpf程序URL或本地路径,设置为`-`可以从stdin读取程序
      [EXTRA_ARGS]...  不推荐使用。只为了与旧版本兼容。额外的程序参数;对于wasm程序,将直接传递给它;对于JSON程序,将传递给生成的参数解析器
    
    选项:
      -h, --help  打印帮助
    ....
    
  • 安装ecc编译器工具链,用于将eBPF内核代码编译为config文件或Wasm模块(为了编译,需要安装clangllvmlibclang):

    $ wget https://github.com/eunomia-bpf/eunomia-bpf/releases/latest/download/ecc && chmod +x ./ecc
    $ ./ecc -h
    eunomia-bpf编译器
    用法: ecc [OPTIONS] <SOURCE_PATH> [EXPORT_EVENT_HEADER]
    ....
    

或使用docker镜像进行编译:

```bash
# 对于x86_64和aarch64
docker run -it -v `pwd`/:/src/ ghcr.io/eunomia-bpf/ecc-`uname -m`:latest # 使用docker进行编译。`pwd`应包含*.bpf.c文件和*.h文件。
```
  • 构建编译器、运行库和工具:

有关构建详细信息,请参见build

示例

有关简单eBPF工具和eunomia-bpf库使用的详细信息,请参见examples

许可证

MIT LICENSE

Share on Share on