ebpm

An ebpf package manager

index

index can be auto generated.

design

一个包管理器:ebpm

类似于 cargo 和 wapm

用例:

首先,我们有一个开发人员的用例,他想使用 ebpf 二进制文件或者程序,但不知道如何/在哪里找到它:

试着运行

./ebpm run opensnoop                                                     # 使用一个名字直接跑起来
./ebpm run https://github.com/ebpf-io/raw/master/examples/opensnoop.bpf  # 使用一个http API
./ebpm run ./opensnoop.bpf                                               # 使用一个本地路径
ECLI_REGISTRY="https://ebpf-registry.example.com"
ecli run "package-name"
->
curl "$ECLI_REGISTRY/{package-name}.json" | ecli run

“run” = “pull” + “start”

我们的第二个角色是一个开发人员,他想要创建一个通用二进制,并在任何机器和操作系统上分发它。这对于命令行工具或者可以直接在Shell中运行的任何东西都很有用:

create project

$./ebpm init opensnoop
$ cd opensnoop
$ tree -a
.
├── bootstrap.bpf.c
├── bootstrap.bpf.h
├── config.json
├── .gitignore
└── README.md
$./ebpm build opensnoop

会产生一个配置文件模板:

[package]
name = "username/my_package"
version = "0.1.0"
description = ""
license = "MIT"

[[module]]
name = "my_app"
source = "path/to/app.ebpf"

发布 ebpf 数据文件

./ebpm publish opensnoop

我应该在哪里发布它?Github?Npm?但这只是 ebpf,没有任何语言的关联…那就Github!

git push …

可以直接下载:

我们可以在任何有绑定的语言中使用 ebpf:

./ebpm get opensnoop

这会创建一个 config 文件;

或者在 config 里面定义之后:

ebpm.toml/json

[[module]]
name = "opensnoop"
path = http://....."
version = 0.1

[[module]]
name = "execsnoop"
path = ./bpftools/execsnoop.bpf
version = 0.1

运行

./ebpm install .

就能在本地下载并运行;

import "ebpm"

handler := ebmp.open_and_run("execsnoop")
handler.stop()
handler := ebmp.open_and_run("execsnoop")
handler.stop()

或者更进一步,它应该可以被内嵌在别的包管理器里面,比如,我想安装一个 go 的 opensnoop 包,我只需要:

go get ebpm-opensnoop
import "ebpm-opensnoop"

所有这些用例促使我们重新思考包管理器的当前全景,以及我们如何创建一个只关注 ebpf 的包管理器,它将统一以下原则:

需要注意循环依赖; 有必要的话,某些库可以有供应商依赖;