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 运行时,使用相同的工具链来构建应用!使用 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
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 在线学习,除外之外还有什么适宜的场景?