近日,在 2022 雲栖大會龍蜥峰會 eBPF & Linux 穩定性專場上,來自 eBPF 技術探索 SIG Maintainer 、浙江大學的鄭昱笙分享了《eunomia-bpf:eBPF 輕量級開發架構》技術演講,以下為本次演講内容:
大家好!我是來自浙江大學的鄭昱笙,今天為大家介紹下 eunomia-bpf 項目作為一個為了簡化 eBPF 程式的開發、分發、運作而設計的輕量級 eBPF 開發架構的背景和目标;再通過一些簡單的執行個體,展示一下 eunomia-bpf 是如何從雲端一行指令下載下傳運作 eBPF 程式、隻編寫核心态代碼即可運作和導出事件,以及和 WebAssembly 的結合等功能,最後簡要闡述一下 eunomia-bpf 的原理和設計實作的思路,探讨一下接下來的發展方向。
eunomia-bpf 項目龍蜥社群開源倉庫:https://gitee.com/anolis/eunomia
概要
eunomia-bpf 起源于 2022 年全國大學生作業系統大賽,希望将 eBPF 程式作為服務運作,把 eBPF 程式打包為一個 JSON 對象,通過 HTTP 請求即可動态插拔運作任意一個可重定位的 eBPF 程式,并且可以适應不同核心版本和架構。比賽結束之後,在高校的幾位老師和社群中的一些夥伴的幫助和指導下(在這裡重點感謝西安郵電大學陳莉君教授及團隊和龍蜥社群毛文安老師),逐漸把這些想法變成了一個初具雛形的開源項目。
目前,eunomia-bpf 想要解決的問題或 eBPF 程式目前的開發和分發過程中存的痛點主要有以下兩個:
第一對于新手而言,搭建和開發 eBPF 程式的門檻較高,不僅需要必須同時關注核心态和使用者态兩方面的互動和資訊處理,還需要編寫使用者态加載代碼。
第二在不同架構的不同核心版本上無法友善快捷地打包、分發、釋出各種 eBPF 程式。eBPF 很多小工具由不同的語言開發,存在不同的接口,無法輕易內建到大型的可觀測系統。目前沒有很好的插件方案,很多時候必須重新編譯整個可觀測的架構,再重新部署上線,才能更新 eBPF 探針或資料處理子產品。另外,如果引入第三方的使用者态資料處理代碼,代碼崩潰會導緻整個程式崩潰。
是以,針對上面兩個問題,我們提出了三種解決思路:
- 針對初學者,隻需要編寫核心态代碼即可自動擷取核心态導出的資料,編譯後即可進行加載和運作,降低了 eBPF 的學習成本,提高了開發效率。
- 基于 libbpf一次編譯處處運作的特性,将使用者态、核心态的編譯和運作的完全分離,通過标準 JSON 或 WASM子產品的方式進行分發,無需進行重新編譯,應用啟動占用資源少,時間短,甚至容器啟動更短。
- WebAssembly (縮寫 WASM) 是一種基于堆棧虛拟機的二進制格式, WASM 是為了可移植的目标而設計。可作為 C/C+/RUST 等進階語言的編譯目标,使用戶端和伺服器應用程式能夠在 Web 上部署。到現在為止, WASM 已經發展成為一個輕量級、高性能、跨平台和多語種的軟體沙盒環境,被運用于雲原生軟體元件,可以在非浏覽器環境下運作。 WASM 的設計思路和 eBPF 也有不少相似之處。
3.隻編寫核心态代碼的時候,使用 JSON 即可完成分發、加載、打包的過程,對于完整的、需要使用者态和核心态進行互動的 eBPF 應用或工具,可以在 WASM 中編寫複雜的使用者态處理程式進行控制和處理,并且将編譯好的 eBPF 位元組碼嵌入在 WASM 子產品中一同分發,在目标機器上動态加載運作。
- 和 WASM 生态項結合可以給 eBPF 程式帶來許多特性,同時和 eBPF 程式原本的設計思路也不謀而合,比如可移植、隔離性、安全性,它也是一個跨語言、輕量級的運作環境等等。同時也可以借助 WASM 的相關工具完成 eBPF 程式的 OCI 鏡像的存儲和分發,最近 Docker 官方也推出了一個基于 WASM 的分發工具。
以上三部分就是 eunomia-bpf 的核心特性,接着和大家一起來看一些示例。
示例
eunomia-bpf 并不是一個完整的系統,而是類似于開發庫和開發架構,可以很輕松地嵌入 Coolbpf 工具鍊裡,也可以作為開發庫或開發架構嵌入其他程式。
可以通過一行指令從網頁端直接下載下傳預編譯好的 eBPF 程式運作。使用 WebAssembly 或 JSON 子產品的方式進行分發,部署時無需重新編譯,啟動速度很快。eunomia-bpf 适用于通用的、任意類型的 eBPF 程式,不僅局限于 trace 方面的 kprobe、uprobe、fentry 等,也支援如 lsm、tc、xdp 等類型的 eBPF 應用,都隻需要編寫核心态代碼即可完成。
上圖中為放入 URL 裡的形式,也可以換成 OCI 鏡像或 Docker 鏡像,可以存儲在 Docker 倉庫或 github package ,使用方式與 Docker 基本一緻,隻需簡單地執行 pull、run 即可運作,也可以将編譯好的程式包 push 下去直接使用。
而相比于傳統的 Docker 鏡像,它的啟動速度更快,同時也保留了 eBPF 很重要的特性,可以輕松嵌入到其他程式作為子子產品或插件使用。
通過 eunomia-bpf ,隻需編寫核心态代碼即可正确運作,能夠最大程度減少新手的上手障礙,省略了使用者态的加載架構編寫,能夠自動導出核心态 perf event 或 ring buffer 事件。另外,它與和原生 libbpf 完全相容,可以擷取 libbpf tools 的核心态代碼,無需修改任何代碼,可直接運作。
可以額外添加 tracepoint ,也可以通過注釋的形式添加其他内容。使用容器打包編譯工具鍊,無需擔心環境配置問題,一行指令生成項目模闆、一行指令編譯。
一般來說,一個完整的 eBPF 應用程式分為使用者空間程式和核心程式兩部分,使用者空間程式負責加載 BPF 位元組碼至核心,或負責讀取核心回傳的統計資訊或者事件詳情,進行相關的資料處理和控制。
我們可以在 WASM 中編寫使用者态輔助程式,來完成安全、高效的使用者态資料處理和控制邏輯,它同樣具備 eBPF 的特性,例如安全性( WASM 和 eBPF 一樣也是個沙盒環境,在使用者态運作的時候即使 WASM 子產品崩潰了,也不會造成宿主程式的異常退出)、可移植性、輕量級、子產品化等等,也可以作為插件使用,添加新的資料處理邏輯時,也不需要更改原本的代碼。(注意 WASM 是可選而不是必須的,對于一些簡單的應用而言,編寫核心态代碼就足夠了)
實際上,我們是用 C 語言編寫代碼,然後打包生成 WASM 子產品,之後我們可以:
- 借助 WebAssembly 的相關生态幫助分發、管理 eBPF 程式,例如 docker-wasm。
- 可嵌入大型應用中作為 eBPF 可程式設計子產品或插件使用。
這裡示範的是一個簡單的 WASM 子產品,它可以擷取目前系統的程序間的 signal 信号傳遞的事件,也可以接受一些指令行參數,并且對上報的資訊進行處理。
目前來看,我們已經可以基本上不用進行代碼修改,就可以直接把 BCC/libbpf-tools 裡面的程式編譯為 WASM 子產品。對開發體驗來說,也可以做到和使用 C 語言開發 libbpf 的 eBPF 程式完全相同,之後也可以引入其他的語言開發 SDK。
把 WASM 和 eBPF 結合起來主要的困難在于,WASM 的記憶體布局和 eBPF 程式并不一樣,C 語言的結構體并不能直接映射,是以傳遞結構體必須要經過序列化操作。同時, WASM 對于通路系統資源,例如檔案、網絡等等,也有不少限制,很多标準庫是缺失的,是以我們需要在 WASM 子產品中進行一些特殊的處理和移植。
系統架構
架構底層依賴的是核心态和使用者态的基礎設施,比如 libbpf 庫和 Kernel 中的 eBPF 虛拟機。在核心的基礎設施這之上,我們會提供相關的編譯工具鍊,和對應的運作時加載器,幫助生成 JSON 或打包成 WASM 的子產品,工具鍊本身使用了比如 Clang/LLVM、bpftool 等工具。動态加載庫可以獨立使用,與 WASM 無關,也可以借助動态加載 JSON 配置資訊即可熱插拔、熱更新 eBPF 程式的形式,通過 API 接口輕松實作 kernel function as a service(核心函數即服務)。
我們還實作了 WASM 抽象層,包含 API 規範,比如用于擴充 WASM 的虛拟機 WSAI 系統占用的通路形式或與 eBPF 互動的通路形式。還有基于 WASM 定制的 libbpf 庫、移植的輔助态程式以及序列化庫等,用于在 WASM 子產品加載基于 libbpf 的 eBPF 程式。
運作時庫可以輕松進行替換,比如替換成 WSI 的 WASM 運作時。除此之外,上層還在 LMP 項目中,實作了 eBPF hub 等包管理和分發設施,以及其他的指令行工具、可觀測性工具等。
目前,eunomia-bpf 項目已在龍蜥社群開源,歡迎各位開發者體驗,也歡迎大家提出建議和回報,一起來做大做強。
相關連結:
eunomia-bpf 項目位址連結:
https://github.com/eunomia-bpf/eunomia-bpf
eBPF技術探索 SIG 位址:
https://openanolis.cn/sig/ebpfresearch
關于龍蜥峰會 eBPF & Linux 穩定性專場課件擷取方式:
【PPT 課件擷取】:關注微信公衆号(OpenAnolis),回複“龍蜥課件” 即可擷取。有任何疑問請随時咨詢龍蜥助手—小龍(微信:openanolis_assis)。
【視訊回放】:視訊回放可前往龍蜥官網 https://openanolis.cn/video 檢視。