边缘的容器化 — WasmEdge 与 seL4
本研發(fā)基于開(kāi)源項(xiàng)目 WasmEdge 和 seL4,并得到了Second State 和 FutureWei 的支持。
應(yīng)用程序容器,例如 Docker,是云原生應(yīng)用程序增長(zhǎng)背后的關(guān)鍵驅(qū)動(dòng)力。然而,雖然云原生開(kāi)發(fā)范式已經(jīng)非常流行,但由于應(yīng)用程序容器需要大量計(jì)算資源,因此很難將云原生基礎(chǔ)設(shè)施擴(kuò)展到大型數(shù)據(jù)中心之外。例如,Docker 不支持實(shí)時(shí)操作系統(tǒng)(RTOS),僅適用于 POSIX 系統(tǒng)。
此外,在智能工廠和智能汽車(chē)等邊緣網(wǎng)絡(luò)和設(shè)備上,行業(yè)生態(tài)和供應(yīng)商網(wǎng)絡(luò)的現(xiàn)狀造就了應(yīng)用程序必須由多個(gè)獨(dú)立供應(yīng)商組裝。例如,在典型的電動(dòng)汽車(chē)中,有 100 多家供應(yīng)商為汽車(chē)的不同部分編寫(xiě)軟件組件。對(duì)于汽車(chē) OEM 來(lái)說(shuō),為供應(yīng)商和供應(yīng)商集成其軟件組件提供安全、高性能和實(shí)時(shí)的運(yùn)行環(huán)境至關(guān)重要。目前,我們已經(jīng)看到了幾個(gè)在邊緣 RTOS 上支持應(yīng)用程序容器的嘗試。
VxWorks 是一個(gè)領(lǐng)先的實(shí)時(shí)操作系統(tǒng),用在使命關(guān)鍵的系統(tǒng)中,如飛機(jī)和航天飛船中。VxWorks 容器 是2021年提出的要在 VxWorks RTOS 上支持符合 OCI 的輕量級(jí)容器。
可是使用 Docker 對(duì)于邊緣上的 RTOS 并不理想。從根本上說(shuō),Docker 不是實(shí)時(shí)的,Docker 假設(shè)許多底層操作系統(tǒng)服務(wù)是可用的。 更好的 RTOS Runtime 方案是高級(jí)字節(jié)碼 VM。 這樣的虛擬機(jī)比 Docker 更輕、更快。 它們提供基于能力的安全沙箱,對(duì)底層操作系統(tǒng)服務(wù)做很少的假設(shè),同時(shí)在前端支持多種編程語(yǔ)言。 WebAssembly 憑借其廣泛的行業(yè)支持和輕量級(jí)設(shè)計(jì),看起來(lái)恰恰是復(fù)雜邊緣應(yīng)用程序完美的虛擬機(jī) Runtime。
WebAssembly 另一個(gè)有意思的方面是 WebAssembly 程序通常可以像 seL4 那樣進(jìn)行形式化驗(yàn)證,因而對(duì)于像車(chē)載操作系統(tǒng)這種使命關(guān)鍵的系統(tǒng)來(lái)說(shuō)非常合適。
WasmEdge 和 seL4
seL4 操作系統(tǒng)是一個(gè)形式化驗(yàn)證的、高度安全且實(shí)時(shí)的微內(nèi)核操作系統(tǒng)。它現(xiàn)在越來(lái)越多地用于安全性和實(shí)時(shí)性能至關(guān)重要的場(chǎng)景,如自動(dòng)駕駛汽車(chē)和無(wú)人機(jī)。 seL4 OS 是一個(gè)微內(nèi)核,不符合 POSIX,這使得運(yùn)行類(lèi)似 Docker 的容器特別具有挑戰(zhàn)性。 另一方面,WebAssembly 可以從大部分操作系統(tǒng)中抽象出來(lái),并為開(kāi)發(fā)者提供一組統(tǒng)一的編程語(yǔ)言和 SDK 以供使用。
WasmEdge Runtime 是一個(gè)高性能且開(kāi)源的 WebAssembly runtime,由 CNCF 托管。它作為微服務(wù)、 serverless 函數(shù)和 plugin 用在云原生基礎(chǔ)設(shè)施中。除了標(biāo)準(zhǔn)的 WebAssembly 規(guī)范, WasmEdge 支持與云原生應(yīng)用場(chǎng)景相關(guān)的擴(kuò)展 API,例如 network sockets,基于 Tensorflow 的推理,數(shù)據(jù)庫(kù)存儲(chǔ)等。 WasmEdge 支持 Rust 和 JavaScript 作為前端語(yǔ)言,可以被嵌入 Rust、Go、Python 和 Node.js host 應(yīng)用作為 plugin 或者嵌入的函數(shù)。
與邊緣容器應(yīng)用場(chǎng)景最相關(guān)的是, WasmEdge 是一個(gè)符合 OCI 規(guī)范的 runtime,可以被 Docker 工具和 Kubernetes 管理和編排。本工作中我們?yōu)?seL4 和 WasmEdge 構(gòu)建了一個(gè) WebAssembly 管理代理。它允許 WebAssembly 字節(jié)碼應(yīng)用程序在 seL4 RTOS 上簡(jiǎn)單地被部署和執(zhí)行。
官方上來(lái)講, seL4 只支持 C/C++ 寫(xiě)的程序。通過(guò) WasmEdge Runtime, 開(kāi)發(fā)者現(xiàn)在可以使用任何 WebAssembly 語(yǔ)言開(kāi)發(fā) seL4 RTOS 應(yīng)用程序,包括 Rust、Swift、AssemblyScript 和 JavaScript。這對(duì)于 seL4 的開(kāi)發(fā)者體驗(yàn)來(lái)說(shuō)是一個(gè)重大的提升。
源代碼鏈接:https://github.com/second-state/wasmedge-seL4
整體設(shè)計(jì)
seL4 微內(nèi)核可以作為 hypervisor 運(yùn)行。它可以在同一硬件上啟動(dòng) Linux 操作系統(tǒng)(稱(chēng)為 guest OS)并列運(yùn)行。Linux guest OS有用于文件系統(tǒng)、networking、用戶(hù)帳戶(hù)、shell 和 CLI 的全套功能和工具,但不是實(shí)時(shí)的。 seL4 端是實(shí)時(shí)的,但是是 headless。 我們的方法是在 guest Linux 中運(yùn)行 WasmEdge 代理( WasmEdge agent)。 將 WasmEdge 字節(jié)碼文件上傳并存儲(chǔ)在 guest Linux 中,然后使用安裝在 seL4 中的 WasmEdge runner 使用代理熱部署和執(zhí)行字節(jié)碼。 架構(gòu)如下。
這種代理和運(yùn)行器架構(gòu)能夠?qū)?guest Linux 的易用性與 seL4 的穩(wěn)健性、安全性和實(shí)時(shí)性能相結(jié)合。
這種設(shè)計(jì)提出了一個(gè)有趣的可能性。 也許我們可以在 guest OS 中運(yùn)行一個(gè)齊全完備的 Kubernetes pod 來(lái)管理和編排 seL4 上的 WasmEdge 應(yīng)用程序。 這是 WasmEdge 積極研究的領(lǐng)域。
樣本 WebAssembly 應(yīng)用
WasmEdge 可以在 seL4 上運(yùn)行任何 WebAssembly 字節(jié)碼程序。本 demo 中的樣本 WebAssembly 應(yīng)用是從 C 和 Rust 源代碼編譯而來(lái)的。
- nbody-c.wasm 是一個(gè) C 語(yǔ)言寫(xiě)的算數(shù)上模仿 N-body 問(wèn)題的程序。然后編譯成 WebAssembly 字節(jié)碼。
- hello.wasm 是一個(gè) Rust 程序,將字符串回顯到控制臺(tái)。
為 WasmEdge runner 補(bǔ)丁 seL4
seL4 的標(biāo)準(zhǔn)庫(kù)不直接支持 WasmEdge runner。我們需要給這些庫(kù)打補(bǔ)丁以添加、打開(kāi)或更新一些重要功能。 我們使用這些補(bǔ)丁構(gòu)建了 seL4 的定制版本。
- 打補(bǔ)丁的 LLVM 編譯器
- 打補(bǔ)丁的 seL4 系統(tǒng)庫(kù)
- 打補(bǔ)丁的 guest Linux 庫(kù)
模擬器 demo
build 腳本自動(dòng)化用補(bǔ)丁庫(kù)、WasmEdge runner、guest Linux OS (Ubuntu 20.04) 和 WasmEdge 代理構(gòu)建 seL4 發(fā)行版(seL4 distribution)的過(guò)程。
build 腳本要求安裝有一個(gè)帶開(kāi)發(fā)者工具的 Ubuntu 20.04 系統(tǒng) 。 點(diǎn)此查看系統(tǒng)要求的的 apt 軟件包的完整列表。
一旦構(gòu)建了定制的 seL4 發(fā)行版,我們就可以在 QEMU 模擬器中運(yùn)行它。 我們可以登錄 guest Linux OS 的命令 shell,上傳并保存 WebAssembly 字節(jié)碼文件,然后運(yùn)行 wasmedge_emit 在 seL4 中部署和運(yùn)行這些 WebAssembly 文件。
你可以根據(jù) demo 指引完成全過(guò)程。也可以查看視頻了解具體效果。
GitHub 操作日志顯示成功構(gòu)建任務(wù)的控制臺(tái)輸出,artifact 包含構(gòu)建結(jié)果。 只需將 build artifact 下載到自己的 Ubuntu 20.04 機(jī)器上,就可以啟動(dòng)模擬器,在 seL4 上運(yùn)行 WebAssembly 程序。
展望未來(lái)
本文演示了如何使用模擬器在 seL4 上管理和執(zhí)行 WebAssembly 應(yīng)用程序。 下一步是在真實(shí)硬件上運(yùn)行 WasmEdge 應(yīng)用程序。
WasmEdge 的主要特性之一是可擴(kuò)展的。 從共享的原生庫(kù)向 WasmEdge 添加 host function API 很容易,這樣 WasmEdge WebAssembly 字節(jié)碼程序可以很方便地訪問(wèn)硬件,例如 GPIO pin、相機(jī)、USB 連接器、I/O 板和 GPU。
請(qǐng)繼續(xù)關(guān)注 seL4 上 WasmEdge 的更多應(yīng)用場(chǎng)景 demo!
總結(jié)
以上是生活随笔為你收集整理的边缘的容器化 — WasmEdge 与 seL4的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wav转mp3文件
- 下一篇: lightoj1234——调和级数+欧拉