
文章插圖
本文地址:https://www.ebpf.top/post/ebpf_rust_aya
1. 前言【RustAya 編寫 eBPF 程序】Linux 內(nèi)核 6.1 版本中有一個非常引人注意的變化:引入了對 Rust 編程語言的支持 。Rust 是一種系統(tǒng)編程語言,Rust 通過提供非常強大的編譯時保證和對內(nèi)存生命周期的明確控制 。在內(nèi)核開發(fā)中引入 Rust 語言,將會為內(nèi)核開發(fā)的早期帶來更多的安全保障 。eBPF 是在內(nèi)核中基于事件運行用戶自定義程序的技術,其驗證器機制可以保障運行在內(nèi)核中 eBPF 程序的安全性 。
Rust 與 eBPF 有著一個共同的目標:保證內(nèi)核安全,只是兩者側重的維度有所不同 。
盡管使用 Rust 編寫 eBPF 程序多數(shù)情況下都需要通過不安全的方式在內(nèi)核進行內(nèi)存讀寫,但是基于 Rust 和 Aya,的確能夠給我們帶來一個快速和高效的開發(fā)體驗,這包括自動生成整個程序框架(eBPF 程序及對應的用戶空間代碼)、參數(shù)檢查確認、錯誤處理、統(tǒng)一的相關構建和管理方式等等。
Aya 是一個以可操作性和開發(fā)者體驗為重點的 eBPF 庫,完全是在 Rust 基礎上建立的,只使用 libc 包來執(zhí)行系統(tǒng)調(diào)用 。Aya 官方倉庫地址為 https://github.com/aya-rs/aya/,當前版本為v0.1.11,項目還處于偏早期 。基于 Aya 庫開發(fā) eBPF 程序可以給我們帶來以下的便利:
- 基于 Rust 的 Cargo 工具來管理、構建和測試項目;
- 支持 CO-RE 直接生成與 Rust 與內(nèi)核文件的綁定;
- 用戶工具代碼(Rust)與運行在的內(nèi)核中的 eBPF 代碼輕松共享代碼;
- 對于 LLVM、libbpf、bcc 等完全沒有任何依賴;
2. Rust 開發(fā)環(huán)境搭建2.1 創(chuàng)建 VM 虛擬機為了使用 Rust 進行 eBPF 程序編寫,那么我們首先需要在本地搭建一個 Rust 開發(fā)環(huán)境 。這里我仍然采用 multipass 工具快速搭建一個 Ubuntu 22.04 LTS 的環(huán)境 。
$ multipass launch --name rust-aya -d 20G默認磁盤為 5G,比較容易造成磁盤空間滿,因此這里將磁盤空間大小設置為 20G,你可以根據(jù)自己的情況調(diào)整 。對于已經(jīng)創(chuàng)建的 mulipass 實例可以在創(chuàng)建后進行調(diào)整,則需要 multipass 版本大于 1.10,而且需要調(diào)整的實例處于停止狀態(tài),詳細可參見調(diào)整實例配置,例如 multipass set local.rust-aya.cpus=4 或 multipass set local.rust-aya.memory=8G 分別用于調(diào)整實例的 CPU 和 MEM 大小 。2.2 安裝 Rust 開發(fā)環(huán)境通常情況下,Rust 開發(fā)環(huán)境推薦通過 rustup 工具管理,我們可以通過以下命令快速安裝該工具:
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh一般情況下我們選擇默認選項安裝 。整個安裝過程會下載一個腳本完成 rustup 工具安裝,同時也會安裝最新的 Rust 穩(wěn)定版本 。如果安裝順利,我們可以在最后看到如下的信息:... stable-x86_64-unknown-linux-gnu installed - rustc 1.65.0 (897e37553 2022-11-02)Rust is installed now. Great!To get started you may need to restart your current shell.This would reload your PATH environment variable to includeCargo's bin directory ($HOME/.cargo/bin).To configure your current shell, run:source "$HOME/.cargo/env"在 rustup 工具安裝完成后,我們可以使用其安裝 Rust 穩(wěn)定版(實際上默認已經(jīng)安裝)和 nightly,其中 nightly 為開發(fā)者體驗新功能的發(fā)布通道,Rust 2021 年開始支持編譯 eBPF,當前使用 Aya 需要基于 Rust Nightly 版本 。Rust 有 3 個發(fā)布通道:
大部分 Rust 開發(fā)者主要采用穩(wěn)定版通道,不過希望實驗新功能的開發(fā)者可能會使用 nightly 或 beta 版 。詳情參見附錄 G:Rust 是如何開發(fā)的與 “Nightly Rust”
- Nightly
- Beta
- Stable(穩(wěn)定版)
經(jīng)驗總結擴展閱讀
- TCP套接字編寫,多進程多線程版本 Linux網(wǎng)絡通信
- 2d游戲怎么編程(怎么編寫一個2d游戲)
- 怎么編寫游戲程序(游戲外掛編寫教程)
- 手寫編程語言-如何為 GScript 編寫標準庫
- 編寫HelloWorld并運行
- 如何編寫 Pipeline 腳本
- Java 最長公共前綴
- qq郵箱模式怎么寫(qq郵箱怎么正確編寫)
- WPS表格圖標美化設置
- 如何編寫表白代碼 如何使用代碼表白?
