eBPF 開(kāi)發(fā)入門(mén)之 helloworld

我是 LEE李破,老李,一個(gè)在 IT 行業(yè)摸爬滾打 16 年的技術(shù)老兵壹将。

事件背景

最近一直想寫(xiě)一個(gè)關(guān)于 ebpf 的文章嗤攻,但是不知道從哪里開(kāi)始寫(xiě)起。思考良久之后诽俯,決定站在一個(gè)研發(fā)的角度妇菱,求真務(wù)實(shí)的從入門(mén)的角度來(lái)介紹下 ebpf。 實(shí)際我真正的目的是能夠用好的 cilium 的整個(gè)系統(tǒng)暴区,但是站在 cilium 角度上看 ebpf闯团,它確實(shí)一個(gè)黑盒子。emmm.... 這個(gè)不符合我的人設(shè)仙粱,決定今天整理一個(gè)文章往里嘗試看看究竟房交。

廢話不多說(shuō),我們從一個(gè)非常簡(jiǎn)單的 helloworld 的編寫(xiě)出發(fā)伐割。

前置知識(shí)

這個(gè)作為 epbf 學(xué)習(xí)的第一章知識(shí)候味,我相信很多小伙伴跟我一樣都是“白手起家淹遵,一窮二白”,害怕 ebpf 整個(gè)環(huán)境的復(fù)雜性负溪。既然是前置知識(shí)透揣,那一定是最簡(jiǎn)單的,能夠讓我們一下就懂的川抡。

ebpf 是一個(gè)轉(zhuǎn)發(fā)層的驅(qū)動(dòng)模型辐真,既然是模型,就一定有定義和抽象等概念崖堤,我們通過(guò)下圖就可以有了第一印象侍咱。

ebpf

eBPF 分為用戶空間程序和內(nèi)核程序兩部分

  1. 用戶空間程序負(fù)責(zé)加載 BPF 字節(jié)碼至內(nèi)核,如需要也會(huì)負(fù)責(zé)讀取內(nèi)核回傳的統(tǒng)計(jì)信息或者事件詳情
  2. 內(nèi)核中的 BPF 字節(jié)碼負(fù)責(zé)在內(nèi)核中執(zhí)行特定事件密幔,如需要也會(huì)將執(zhí)行的結(jié)果通過(guò) maps 或者 perf-event 事件發(fā)送至用戶空間
  3. 其中用戶空間程序與內(nèi)核 BPF 字節(jié)碼程序可以使用 map 結(jié)構(gòu)實(shí)現(xiàn)雙向通信楔脯,這為內(nèi)核中運(yùn)行的 BPF 字節(jié)碼程序提供了更加靈活的控制

上面的內(nèi)容用大白話說(shuō):ebpf 包含用戶層和內(nèi)核層兩層組成。用戶層主要是負(fù)責(zé)業(yè)務(wù)邏輯處理和響應(yīng)胯甩,同時(shí)也兼顧著內(nèi)核中的 epbf 的邏輯 bytescode 生成(當(dāng)然這里可以使用第三方生成)昧廷,并將 bytescode 注入到內(nèi)核中。內(nèi)核層主要是接受 bytescode偎箫,然后在內(nèi)核層內(nèi)完成對(duì) bytescode 執(zhí)行木柬。果真是妥妥的控制與轉(zhuǎn)發(fā)分離的模型,要不然為什么 ebpf 這么高效呢淹办?

上手開(kāi)發(fā)

環(huán)境準(zhǔn)備

我們使用 Ubuntu 20.04 這個(gè)系統(tǒng)作為整體開(kāi)發(fā)環(huán)境眉枕,內(nèi)核使用的是 5.4.0。

檢查內(nèi)核

root@ubuntu:/tmp# uname -a
Linux ubuntu 5.4.0-126-generic #142-Ubuntu SMP Fri Aug 26 12:12:57 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

安裝編譯工具和包

# apt install -y bison build-essential cmake flex git libedit-dev pkg-config libmnl-dev \
   python zlib1g-dev libssl-dev libelf-dev libcap-dev libfl-dev llvm clang pkg-config \
   gcc-multilib luajit libluajit-5.1-dev libncurses5-dev libclang-dev clang-tools

安裝內(nèi)核源碼

# apt install linux-source-5.4.0

源碼安裝至 /usr/src/ 目錄下, 使用下面的命里初始化編譯環(huán)境怜森。

# cd /usr/src/linux-source-5.4.0/
#
# tar xvf linux-source-5.4.0.tar.bz2
# cd linux-source-5.4.0
#
# cp -v /boot/config-$(uname -r) .config
# make headers_install && make modules_prepare

開(kāi)發(fā)代碼

ebpf 是使用內(nèi)核層和用戶兩層速挑,那么我們寫(xiě)代碼也要實(shí)現(xiàn)兩層代碼。

內(nèi)核層代碼:hello_kern.c

#include <linux/bpf.h>
#include "bpf/bpf_helpers.h"

#define SEC(NAME) __attribute__((section(NAME), used))

SEC("tracepoint/syscalls/sys_enter_execve")
int bpf_prog(void *ctx)
{
    char msg[] = "Hello Shengyan.li, I'm in eBPF World\n";

    bpf_trace_printk(msg, sizeof(msg));  /* 把信息打印到 trace 隊(duì)列中 */

    return 0;
}

char _license[] SEC("license") = "GPL"; /* 這里很重要副硅,告訴 ebpf 當(dāng)前的模塊協(xié)議是 GPL姥宝,如果不是GPL,libpbf 報(bào)錯(cuò) err = 22, 退出想许。*/

用戶層代碼:hello_user.c

#include <stdio.h>
#include "bpf_load.h"

int main(int argc, char **argv)
{
    if(load_bpf_file("hello_kern.o") != 0) /* 加載生成的 bytescode 到內(nèi)核*/
    {
        printf("The kernel didn't load BPF program\n");
        return -1;
    }

    read_trace_pipe();  /* 從 trace 隊(duì)列中讀取信息伶授,輸出到 stdout */

    return 0;
}

編譯測(cè)試

修改 Makefile
在 /usr/src/linux-source-5.4.0/linux-source-5.4.0/samples/bpf 目錄下,修改 Makefile流纹,然后在對(duì)應(yīng)的位置添加對(duì)應(yīng)內(nèi)容糜烹。

hostprogs-y += helloworld
hello-objs := bpf_load.o hello_user.o
always += hello_kern.o

編譯

# cd /usr/src/linux-source-5.4.0/linux-source-5.4.0
# make M=samples/bpf

測(cè)試

# cd /usr/src/linux-source-5.4.0/linux-source-5.4.0/samples/bpf
# ./helloworld

當(dāng)你執(zhí)行上面的 helloworld 命令后,發(fā)現(xiàn)沒(méi)有反應(yīng)漱凝,不要慌疮蹦,這個(gè)是正常的。這個(gè)時(shí)候你只需要在打開(kāi)一個(gè)新會(huì)話連接到編譯環(huán)境的機(jī)器上茸炒,然后在這個(gè)新窗口執(zhí)行如下命令:

# watch "ls -l"

之前執(zhí)行 helloworld 的命令的窗口會(huì)有如下的輸出:

helloworld

總結(jié)

我們通過(guò)上面的操作和使用愕乎,基本確認(rèn)了 epbf 整體開(kāi)發(fā)流程阵苇。 通過(guò)簡(jiǎn)單的開(kāi)發(fā),我們基本可以得出下面的幾個(gè)結(jié)論:

  1. ebpf 開(kāi)發(fā)不需要重新編譯內(nèi)核和重啟服務(wù)器感论,能夠非成鹣睿快速的迭代開(kāi)發(fā)。
  2. 和 DPDK 的邏輯很像比肄,之前很多積累的知識(shí)這里可以無(wú)腦復(fù)用快耿。
  3. 有很多開(kāi)發(fā)框架和庫(kù)都在使用 ebpf,代碼風(fēng)險(xiǎn)可控芳绩。
  4. ebpf 開(kāi)發(fā)模型沒(méi)有那么復(fù)雜掀亥,還是很簡(jiǎn)單,且很有意思的妥色。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搪花,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘹害,更是在濱河造成了極大的恐慌撮竿,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼拥,死亡現(xiàn)場(chǎng)離奇詭異倚聚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)凿可,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)授账,“玉大人枯跑,你說(shuō)我怎么就攤上這事“兹龋” “怎么了敛助?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)屋确。 經(jīng)常有香客問(wèn)我纳击,道長(zhǎng),這世上最難降的妖魔是什么攻臀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任焕数,我火速辦了婚禮,結(jié)果婚禮上刨啸,老公的妹妹穿的比我還像新娘堡赔。我一直安慰自己,他們只是感情好设联,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布善已。 她就那樣靜靜地躺著灼捂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪换团。 梳的紋絲不亂的頭發(fā)上悉稠,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音艘包,去河邊找鬼偎球。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辑甜,可吹牛的內(nèi)容都是我干的衰絮。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼磷醋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猫牡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起邓线,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤淌友,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后骇陈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體震庭,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年你雌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器联。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婿崭,死狀恐怖拨拓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氓栈,我是刑警寧澤渣磷,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站授瘦,受9級(jí)特大地震影響醋界,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜提完,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一形纺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氯葬,春花似錦挡篓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秽澳。三九已至,卻和暖如春戏羽,著一層夾襖步出監(jiān)牢的瞬間担神,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工始花, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妄讯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓酷宵,卻偏偏與公主長(zhǎng)得像亥贸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浇垦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容