当前位置: 首页 > 软件库 > 大数据 > 数据处理 >

Wasm-bpf

WebAssembly eBPF 库和运行时
授权协议 MIT
开发语言 C/C++
所属分类 大数据、 数据处理
软件类型 开源软件
地区 国产
投 递 者 曾枫
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

Wasm-bpf 是一个 WebAssembly eBPF 库和运行时, 基于 CO-RE(一次编写 – 到处运行) libbpf wasm-micro-runtime 实现。

Wasm 最初是以浏览器安全沙盒为目的开发的,发展到目前为止,WebAssembly 已经成为一个用于云原生软件组件的高性能、跨平台和多语言软件沙箱环境,Wasm 轻量级容器也非常适合作为下一代无服务器平台运行时。另一个令人兴奋的趋势是 eBPF 的兴起,它使云原生开发人员能够构建安全的网络、服务网格和多种可观测性组件,并且它也在逐步渗透和深入到内核的各个组件,提供更强大的内核态可编程交互能力。

现在,借助 Wasm-bpf 编译工具链和运行时,我们可以使用 Wasm 将 eBPF 程序编写为跨平台的模块,同时使用 C/C++ 或 Rust 来编写 Wasm-eBPF 程序并发布。通过在 WebAssembly 中使用 eBPF 程序,我们不仅能让 Wasm 应用享受到 eBPF 的高性能和对系统接口的访问能力,还可以让 eBPF 程序使用到 Wasm 的沙箱、灵活性、跨平台性、和动态加载,并且使用 Wasm 的 OCI 镜像来方便、快捷地分发和管理 eBPF 程序。结合这两种技术,我们将会给 eBPF 和 Wasm 生态来一个全新的开发体验!

  • 亮点:
  • 通用: 给 WASM 提供大部分的 eBPF 功能。 比如从 ring buffer 或者 perf buffer 中获取数据、 通过 maps 提供 内核 eBPF 和 用户态 Wasm 程序之间的双向通信、 动态 加载, 附加 或者 解除附加 eBPF程序等。 支持大量的 eBPF 程序类型和 map 类型, 覆盖了用于 tracing(跟踪), networking(网络), security(安全) 的使用场景。
  • 高性能: 对于复杂数据类型,没有额外的 序列化 开销。 通过 共享内存 来避免在 Host 和 WASM 端之间的额外数据拷贝。
  • 简单便捷的开发体验: 提供和 libbpf-bootstrap 相似的开发体验, 自动生成 Wasm-eBPF 的 skeleton 头文件以及用于绑定的 类型 定义。
  • 非常轻量: 编译完成的二进制文件只有 1.5 MB 的大小,编译好的 WASM 模块只有 ~90K ,远远比传统的以容器方式分发和运行 eBPF 程序来的轻量,同时保持良好的隔离性和沙箱特性。你可以非常容易地使用任何语言,在任何平台上建立你自己的 Wasm-eBPF 运行时,使用相同的工具链来构建应用!

WASI-bpf

使用 C/C++ 在 Wasm 中构建 eBPF 应用,将 eBPF 字节码加载到内核并处理内核返回的对应的数据

/* Load and verify BPF application */
    skel = bootstrap_bpf__open();
    if (!skel) {
        fprintf(stderr, "Failed to open and load BPF skeleton\\n");
        return 1;
    }
<span style="color:var(--color-prettylights-syntax-comment)"><span style="color:var(--color-prettylights-syntax-comment)">/*</span> Parameterize BPF code with minimum duration parameter <span style="color:var(--color-prettylights-syntax-comment)">*/</span></span> skel->rodata->min_duration_ns = env.min_duration_ms * <span style="color:var(--color-prettylights-syntax-constant)">1000000ULL</span>; <span style="color:var(--color-prettylights-syntax-comment)"><span style="color:var(--color-prettylights-syntax-comment)">/*</span> Load & verify BPF programs <span style="color:var(--color-prettylights-syntax-comment)">*/</span></span> err = bootstrap_bpf__load(skel); <span style="color:var(--color-prettylights-syntax-keyword)">if</span> (err) { <span style="color:var(--color-prettylights-syntax-constant)">fprintf</span>(stderr, <span style="color:var(--color-prettylights-syntax-string)"><span style="color:var(--color-prettylights-syntax-string)">"</span>Failed to load and verify BPF skeleton<span>\\n</span><span style="color:var(--color-prettylights-syntax-string)">"</span></span>); <span style="color:var(--color-prettylights-syntax-keyword)">goto</span> cleanup; } <span style="color:var(--color-prettylights-syntax-comment)"><span style="color:var(--color-prettylights-syntax-comment)">/*</span> Attach tracepoints <span style="color:var(--color-prettylights-syntax-comment)">*/</span></span> err = bootstrap_bpf__attach(skel); <span style="color:var(--color-prettylights-syntax-keyword)">if</span> (err) { <span style="color:var(--color-prettylights-syntax-constant)">fprintf</span>(stderr, <span style="color:var(--color-prettylights-syntax-string)"><span style="color:var(--color-prettylights-syntax-string)">"</span>Failed to attach BPF skeleton<span>\\n</span><span style="color:var(--color-prettylights-syntax-string)">"</span></span>); <span style="color:var(--color-prettylights-syntax-keyword)">goto</span> cleanup; }</pre> 

使用 Rust 在 Wasm 中编写 eBPF 应用:

extern "C" fn handle_event(_ctx: u32, data: u32, _data_sz: u32) {
    let event_slice = unsafe { slice::from_raw_parts(data as *const Event, 1) };
    let event = &event_slice[0];
    let pid = event.pid;
    let ppid = event.ppid;
    let exit_code = event.exit_code;
    if event.exit_event == 1 {
        print!(
            "{:<8} {:<5} {:<16} {:<7} {:<7} [{}]",
            "TIME",
            "EXIT",
            unsafe { CStr::from_ptr(event.comm.as_ptr() as *const i8) }
                .to_str()
                .unwrap(),
            pid,
            ppid,
            exit_code
        );
        ...
}

一行命令从云端的 Github Packages 中下载并运行 eBPF 程序,或通过 Github Packages 发布:

# push to Github Packages
ecli push https://ghcr.io/eunomia-bpf/sigsnoop:latest
# pull from Github Packages
ecli pull https://ghcr.io/eunomia-bpf/sigsnoop:latest
# run eBPF program
ecli run https://ghcr.io/eunomia-bpf/sigsnoop:latest
  • 后续更新计划:
    • 继续完善多种语言支持;
    • 支持更完善的 eBPF 特性;
    • 探索更多的应用场景;
  • eunomia-bpf 项目是一个开源项目,旨在提供一组工具,用于在 Linux 内核中更方便地编写和运行 eBPF 程序。在过去一个月中,该项目取得了一些新的进展,以下是这些进展的概述。 首先,eunomia-bpf 动态加载库进行了一些重要的更新。该库现在支持 btf hub,这使得在低内核版本上移植 eBPF 程序更加容易。ecli 程序也进行了完全的重写,现在是使用 Rust 编写的,已经

  • Wasm-bpf 是一款基于 WebAssembly 的 eBPF 库、工具链和运行时,它可以帮助您利用 CO-RE 的 eBPF 运行时和 WebAssembly 运行时(例如 WAMR)构建 eBPF 应用程序。 借助 Wasm-bpf 编译工具链和运行时,我们可以使用 Wasm 将 eBPF 程序编写为跨平台的模块,使用 C/C++ 和 Rust 编写程序。通过在 WebAssembly 中

  • 项目介绍 对比 Web 的发展,eBPF 与内核的关系有点类似于 JavaScript 与浏览器内核的关系。 eunomia-bpf 是一套编译工具链和运行时,以及一些附加项目,我们希望做到让 eBPF 程序真正像 JavaScript 或者 WASM 那样易于分发和运行,或者说内核态或可观测性层面的 FaaS:eBPF 即服务 仅需一个数十kb的请求,包含预编译 eBPF 程序字节码和辅助信息,

  • eunomia-bpf 简介 eBPF 源于 BPF,本质上是处于内核中的一个高效与灵活的虚拟机组件,以一种安全的方式在许多内核 hook 点执行字节码,开发者可基于 eBPF 开发性能分析工具、软件定义网络、安全等诸多场景。但是,目前对于开发和使用 eBPF 应用而言还可能存在一些不够方便的地方: 搭建和开发 eBPF 程序是一个门槛比较高、比较复杂的工作,必须同时关注内核态和用户态两个方面的交

  • 回望过去的 2022 年,有两项技术备受瞩目:eBPF 和 WebAssembly。 eBPF: 全新的可能性 eBPF 是一项革命性的技术,起源于Linux内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。 过去一年中,可观测技术得到了极大关注,也被 Gartner 列为 2023 年十大战略技术趋势之一。eBPF 本身是对传统

  • 系列之:在 WebAssembly 中使用 Rust 编写 eBPF 程序并发布 OCI 镜像 eBPF(extended Berkeley Packet Filter)是一种高性能的内核虚拟机,可以运行在内核空间中,以收集系统和网络信息。随着计算机技术的不断发展,eBPF 的功能日益强大,并且已经成为各种效率高效的在线诊断和跟踪系统,以及构建安全的网络、服务网格的重要组成部分。 WebAssem

  • 系列之:在 WebAssembly 中使用 C/C++ 和 libbpf 编写 eBPF 程序 eBPF(extended Berkeley Packet Filter)是一种高性能的内核虚拟机,可以运行在内核空间中,用来收集系统和网络信息。随着计算机技术的不断发展,eBPF 的功能日益强大,进而被用来构建各种效率高效的在线诊断和跟踪系统,以及安全的网络和服务网格。 WebAssembly(Was

 相关资料
  • 如果你在WABT工具使用中遇到了一下几个问题,可以大概这样解决: 如果你不会编译wabt,请在github直接下载编译好的二进制 wabt-1.0.34-ubuntu.tar.gz GLIBC_2.33 not found GLIBC_2.34 not found GLIBCXX_3.4.29 not found 以上问题进作为参考,目的是能够使用这个工具 这个源地址加到sources.list

  • �� ✨ wasm-pack Your favorite Rust → Wasm workflow tool! Docs | Contributing | Chat Built with �� �� by The Rust and WebAssembly Working Group About This tool seeks to be a one-stop shop for building a

  • wasm-bindgen 是一个用于促进 wasm 模块和 JavaScript 之间进行高级交互的项目,改进 JavaScript 和 Rust 代码之间的互操作性。 目前这个工具是基于 Rust 编写的,不过它的底层基础是独立于语言的,随着这个工具日趋稳定,它还可以用于像 C/C++ 这种语言。 显著特性 将 JavaScript 功能导入到 Rust,如 DOM 操作、控制台日志记录以及性能

  • Modern WASM Starter A starter template to easily create WebAssembly packages for npm using type-safe C++ code with automatic declarations.This project should take care of most of the boilerplate code

  • 我有一个eclipse(版本:2021-09(4.21.0))项目,我得到了“org.w3c.dom包可以从多个模块访问:未命名 组织。w3c。dom是java语言。构建路径上jre系统库(openjdk-17)中的xml。组织。w3c。dom也在xercesImpl-2.12.0模块中。SP03.jar,它包含在添加到我的构建路径的wildfly 25运行时库中。 我的项目需要jar中的xerc

  • 我看有很多基于 WASM 的在浏览器客户端使用的 SQL 数据库,想请教一下有什么不错的应用场景吗?相比 IndexedDB 有什么优势? 我能想到的一个就是 SQL 在线学习,除外之外还有什么适宜的场景?