边缘的容器化 — WasmEdge 与 seL4
本研發基于開源項目 WasmEdge 和 seL4,并得到了Second State 和 FutureWei 的支持。
應用程序容器,例如 Docker,是云原生應用程序增長背后的關鍵驅動力。然而,雖然云原生開發范式已經非常流行,但由于應用程序容器需要大量計算資源,因此很難將云原生基礎設施擴展到大型數據中心之外。例如,Docker 不支持實時操作系統(RTOS),僅適用于 POSIX 系統。
此外,在智能工廠和智能汽車等邊緣網絡和設備上,行業生態和供應商網絡的現狀造就了應用程序必須由多個獨立供應商組裝。例如,在典型的電動汽車中,有 100 多家供應商為汽車的不同部分編寫軟件組件。對于汽車 OEM 來說,為供應商和供應商集成其軟件組件提供安全、高性能和實時的運行環境至關重要。目前,我們已經看到了幾個在邊緣 RTOS 上支持應用程序容器的嘗試。
VxWorks 是一個領先的實時操作系統,用在使命關鍵的系統中,如飛機和航天飛船中。VxWorks 容器 是2021年提出的要在 VxWorks RTOS 上支持符合 OCI 的輕量級容器。
可是使用 Docker 對于邊緣上的 RTOS 并不理想。從根本上說,Docker 不是實時的,Docker 假設許多底層操作系統服務是可用的。 更好的 RTOS Runtime 方案是高級字節碼 VM。 這樣的虛擬機比 Docker 更輕、更快。 它們提供基于能力的安全沙箱,對底層操作系統服務做很少的假設,同時在前端支持多種編程語言。 WebAssembly 憑借其廣泛的行業支持和輕量級設計,看起來恰恰是復雜邊緣應用程序完美的虛擬機 Runtime。
WebAssembly 另一個有意思的方面是 WebAssembly 程序通常可以像 seL4 那樣進行形式化驗證,因而對于像車載操作系統這種使命關鍵的系統來說非常合適。
WasmEdge 和 seL4
seL4 操作系統是一個形式化驗證的、高度安全且實時的微內核操作系統。它現在越來越多地用于安全性和實時性能至關重要的場景,如自動駕駛汽車和無人機。 seL4 OS 是一個微內核,不符合 POSIX,這使得運行類似 Docker 的容器特別具有挑戰性。 另一方面,WebAssembly 可以從大部分操作系統中抽象出來,并為開發者提供一組統一的編程語言和 SDK 以供使用。
WasmEdge Runtime 是一個高性能且開源的 WebAssembly runtime,由 CNCF 托管。它作為微服務、 serverless 函數和 plugin 用在云原生基礎設施中。除了標準的 WebAssembly 規范, WasmEdge 支持與云原生應用場景相關的擴展 API,例如 network sockets,基于 Tensorflow 的推理,數據庫存儲等。 WasmEdge 支持 Rust 和 JavaScript 作為前端語言,可以被嵌入 Rust、Go、Python 和 Node.js host 應用作為 plugin 或者嵌入的函數。
與邊緣容器應用場景最相關的是, WasmEdge 是一個符合 OCI 規范的 runtime,可以被 Docker 工具和 Kubernetes 管理和編排。本工作中我們為 seL4 和 WasmEdge 構建了一個 WebAssembly 管理代理。它允許 WebAssembly 字節碼應用程序在 seL4 RTOS 上簡單地被部署和執行。
官方上來講, seL4 只支持 C/C++ 寫的程序。通過 WasmEdge Runtime, 開發者現在可以使用任何 WebAssembly 語言開發 seL4 RTOS 應用程序,包括 Rust、Swift、AssemblyScript 和 JavaScript。這對于 seL4 的開發者體驗來說是一個重大的提升。
源代碼鏈接: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 的定制版本。
- 打補丁的 LLVM 編譯器
- 打補丁的 seL4 系統庫
- 打補丁的 guest Linux 庫
模擬器 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!
總結
以上是生活随笔為你收集整理的边缘的容器化 — WasmEdge 与 seL4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wav转mp3文件
- 下一篇: lightoj1234——调和级数+欧拉