边缘的容器化 — WasmEdge 与 seL4 RTOS

2021年11月22日 阅读数:1
这篇文章主要向大家介绍边缘的容器化 — WasmEdge 与 seL4 RTOS,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

本研发基于开源项目 WasmEdgeseL4,并获得了 Second StateFutureWei 的支持。javascript

应用程序容器,例如 Docker,是云原生应用程序增加背后的关键驱动力。然而,虽然云原生开发范式已经很是流行,但因为应用程序容器须要大量计算资源,所以很难将云原生基础设施扩展到大型数据中心以外。例如,Docker 不支持实时操做系统(RTOS),仅适用于 POSIX 系统。前端

此外,在智能工厂和智能汽车等边缘网络和设备上,行业生态和供应商网络的现状造就了应用程序必须由多个独立供应商组装。例如,在典型的电动汽车中,有 100 多家供应商为汽车的不一样部分编写软件组件。对于汽车 OEM 来讲,为供应商和供应商集成其软件组件提供安全、高性能和实时的运行环境相当重要。目前,咱们已经看到了几个在边缘 RTOS 上支持应用程序容器的尝试。java

VxWorks 是一个领先的实时操做系统,用在使命关键的系统中,如飞机和航天飞船中。VxWorks 容器 是2021年提出的要在 VxWorks RTOS 上支持符合 OCI 的轻量级容器。linux

但是使用 Docker 对于边缘上的 RTOS 并不理想。从根本上说,Docker 不是实时的,Docker 假设许多底层操做系统服务是可用的。 更好的 RTOS Runtime 方案是高级字节码 VM。 这样的虚拟机比 Docker 更轻、更快。 它们提供基于能力的安全沙箱,对底层操做系统服务作不多的假设,同时在前端支持多种编程语言。 WebAssembly 凭借其普遍的行业支持和轻量级设计,看起来偏偏是复杂边缘应用程序完美的虚拟机 Runtime。git

WebAssembly 另外一个有意思的方面是 WebAssembly 程序一般能够像 seL4 那样进行形式化验证,于是对于像车载操做系统这种使命关键的系统来讲很是合适。github

WasmEdge 和 seL4

seL4 操做系统是一个形式化验证的、高度安全且实时的微内核操做系统。它如今愈来愈多地用于安全性和实时性能相当重要的场景,如自动驾驶汽车和无人机。 seL4 OS 是一个微内核,不符合 POSIX,这使得运行相似 Docker 的容器特别具备挑战性。 另外一方面,WebAssembly 能够从大部分操做系统中抽象出来,并为开发者提供一组统一的编程语言和 SDK 以供使用。golang

WasmEdge Runtime 是一个高性能且开源的 WebAssembly runtime,由 CNCF 托管。它做为微服务serverless 函数plugins 用在云原生基础设施中。除了标准的 WebAssembly 规范, WasmEdge 支持与云原生应用场景相关的扩展 API,例如 network sockets基于 Tensorflow 的推理,数据库存储等。 WasmEdge 支持 Rust 和 JavaScript 做为前端语言,能够被嵌入 RustGo、Python 和 Node.js host 应用做为 plugin 或者嵌入的函数。web

与边缘容器应用场景最相关的是, WasmEdge 是一个符合 OCI 规范的 runtime,能够被 Docker 工具和 Kubernetes 管理和编排。本工做中咱们为 seL4 和 WasmEdge 构建了一个 WebAssembly 管理代理。它容许 WebAssembly 字节码应用程序在 seL4 RTOS 上简单地被部署和执行。docker

官方上来说, seL4 只支持 C/C++ 写的程序。经过 WasmEdge Runtime, 开发者如今可使用任何 WebAssembly 语言开发 seL4 RTOS 应用程序,包括 Rust、Swift、AssemblyScript 和 JavaScript。这对于 seL4 的开发者体验来讲是一个重大的提高。shell

源代码连接:https://github.com/second-state/wasmedge-seL4

总体设计

seL4 微内核能够做为 hypervisor 运行。它能够在同一硬件上启动 Linux 操做系统(称为 guest OS)并列运行。Linux guest OS有用于文件系统、networking、用户账户、shell 和 CLI 的全套功能和工具,但不是实时的。 seL4 端是实时的,可是是 headless。 咱们的方法是在 guest Linux 中运行 WasmEdge 代理( WasmEdge agent)。 将 WasmEdge 字节码文件上传并存储在 guest Linux 中,而后使用安装在 seL4 中的 WasmEdge runner 使用代理热部署和执行字节码。 架构以下。

这种代理和运行器架构可以将 guest Linux 的易用性与 seL4 的稳健性、安全性和实时性能相结合。

这种设计提出了一个有趣的可能性。 也许咱们能够在 guest OS 中运行一个齐全完备的 Kubernetes pod 来管理和编排 seL4 上的 WasmEdge 应用程序。 这是 WasmEdge 积极研究的领域。

样本 WebAssembly 应用

WasmEdge 能够在 seL4 上运行任何 WebAssembly 字节码程序。本 demo 中的样本 WebAssembly 应用是从 C 和 Rust 源代码编译而来的。

  • nbody-c.wasm 是一个 C 语言写的算数上模仿 N-body 问题的程序。而后编译成 WebAssembly 字节码。
  • hello.wasm 是一个 Rust 程序来将字符串回显到控制台。

为 WasmEdge runner 补丁 seL4

seL4 的标准库不直接支持 WasmEdge runner。咱们须要给这些库打补丁以添加、打开或更新一些重要功能。 咱们使用这些补丁构建了 seL4 的定制版本。

模拟器 demo

build 脚本自动化用补丁库、WasmEdge runner、guest Linux OS (Ubuntu 20.04) 和 WasmEdge 代理构建 seL4 发行版(seL4 distribution)的过程。

build 脚本要求安装有一个带开发者工具的 Ubuntu 20.04 系统 。 点此查看系统要求的的 apt 软件包的完整列表。

一旦构建了定制的 seL4 发行版,咱们就能够在 QEMU 模拟器中运行它。 咱们能够登陆 guest Linux OS 的命令 shell,上传并保存 WebAssembly 字节码文件,而后运行 wasmedge_emit 在 seL4 中部署和运行这些 WebAssembly 文件。

你能够根据 demo 指引完成全过程。也能够查看视频了解具体效果。

GitHub 操做日志显示成功构建任务的控制台输出,artifact 包含构建结果。 只需将 build artifact 下载到本身的 Ubuntu 20.04 机器上,就能够启动模拟器,在 seL4 上运行 WebAssembly 程序。

展望将来

本文演示了如何使用模拟器在 seL4 上管理和执行 WebAssembly 应用程序。 下一步是在真实硬件上运行 WasmEdge 应用程序。

WasmEdge 的主要特性之一是可扩展的。 从共享的原生库向 WasmEdge 添加 host function API 很容易,这样 WasmEdge WebAssembly 字节码程序能够很方便地访问硬件,例如 GPIO pin、相机、USB 链接器、I/O 板和 GPU。

请继续关注 seL4 上 WasmEdge 的更多应用场景 demo