輕量易部署!Coolbpf 釋出不依賴 Clang 的指令碼化程式設計特性 lwcb | 龍蜥技術
文/eBPF技術探索 SIG
基於 CO-RE(Compile Once – Run Everywhe)實現的 Coolbpf 專案,新推出輕量級指令碼化程式設計特性 lwcb(Lightweight Coolbpf)。lwcb 是一款面向 eBPF 的指令碼語言和 tracing 開發工具,它可以解析使用者編寫的指令碼,生成 eBPF 位元組碼,從而實現對 Linux 核心系統的跟蹤診斷、效能分析和監控。此外,lwcb 還提供了大量內建函式,如 tcpstate 可以輕鬆將整數轉換成 tcp 狀態字串,tcphdr、iphdr 可以讓使用者從 skb 裡獲取 tcphdr 或 iphdr 結構體,有助於快速編寫核心網路相關的 eBPF 程式。lwcb 也讓使用者方便地新增更多的內建函式,覆蓋更多應用場景。
01 lwcb 特性
輕量級、易部署
lwcb 使用 rust 開發了一個小巧的解析器,不依賴於 Clang。它採用輕量級的編譯器,並且為編譯器新增了 eBPF 後端,使其不需要依賴於 llvm。lwcb 編譯後只有一個大小約為 8MB 的獨立二進位制程式,部署非常方便快捷。以往部署 BCC 和 bpftrace 等工具,需要在目標執行機器上安裝一堆編譯和執行庫。
指令碼化、開發快
lwcb 當前支援類似於 bpftrace 的指令碼解釋執行能力,優勢是不需要編譯。同時提供了更多內建函式,方便開發和使用。另外,他天然支援 CO-RE 的能力,在不同核心版本上安全執行。可以說,功能比較強大。
lwcb 功能性強主要體現在以下幾點:
-
更多的內建函式:如tcphdr、iphdr、tcpstate 等等。
-
探測點函式引數自動注入功能:
lwcb -t 'kprobe:tcp_rcv_established { ih = iphdr(skb); print("sip: %s dip: %s\n", ntop(bswap(ih->saddr)), ntop(bswap(ih->daddr))); }'
使用者可以直接訪問 tcp_rcv_established 函式的 skb 引數,進而獲取 IP 地址和埠號資訊。
-
支援 BTF,能夠進行型別推導。如 th = tcphdr(skb);,lwcb能夠根據 BTF 資訊,知道 skb 的型別是 struct sk_buff*,th 的型別是 struct tcphdr *。使用者可以直接來訪問 struct tcphdr結構體中的成員,如 th->source,而無需再宣告 th 的型別。
-
支援 python,使得 lwcb 可以充分利用python來進行復雜的資料處理,類似於 bcc 的開發方式。使用者可以透過 import pylwcb 來使用 lwcb 的功能。下面是一個簡單的例子:
import pylwcb lwcb_program = """ kprobe:tcp_rcv_established { th = tcphdr(skb); ih = iphdr(skb); print(ntop(bswap(ih->saddr)), ntop(bswap(ih->daddr)), bswap(th->source), bswap(th->dest)); } """ lwcb = pylwcb.Pylwcb(lwcb_program) lwcb.attach() events = lwcb.read_events() for event in events: print(event)
-
支援批次探測點,kprobe:(struct sock *sk) 會跟蹤核心裡所有攜帶有 struct sock *sk 引數的函式。可以利用該功能,實現更細粒度的 function graph。
kprobe:(struct sock *sk) { sport = sk->__sk_common.skc_num; if (sport == 22) { print("%s %s\n", timestr(ns()), ksym(reg("ip"))); } }
02 lwcb 使用方法
只需要更新 Coolbpf () 到 1.0.0 版本,就可以使用 lwcb 指令碼化程式設計功能。
編譯 lwcb
-
準備編譯環境()
安裝 rust 編譯工具鏈:curl --proto '=https' --tlsv1.2 -sSf | sh
克隆 Coolbpf 程式碼:git clone .git
進入到 lwcb 目錄:cd coolbpf/lwcb
-
編譯:cargo build --release 即可完成編譯,生成的 lwcb 可執行程式在:target/release/lwcb。
-
此外,lwcb 執行還需要 BTF 檔案,可以從該網址()下載對應核心的 BTF 檔案,然後放在 /boot 目錄下。
lwcb 執行單行命令
lwcb -t <TEXT> 可以直接執行單條命令形式的 eBPF 程式,如:
lwcb -t 'kprobe:tcp_rcv_established {print("%s :triggerred by tcp_rcv_established\n", timestr(ns()));}
lwcb 執行指令碼
lwcb <*.cb> 可以直接執行指令碼。在 coolbpf/tools/lwcb 目錄已經有若干個 lwcb 指令碼,我們可以透過命令:lwcb tcpdrop.cb 來執行 tcpdrop 指令碼。
03 pylwcb:lwcb 的 python 模組
pylwcb 是 lwcb 的 python 模組。透過 pylwcb 我們可以使用 lwcb 提供的指令碼化能力,同時可以利用 python 強大的資料處理能力。
04 pylwcb 使用方法
編譯 pylwcb
-
編譯環境準備
a. 進入到 pylwcb 專案目錄:cd coolbpf/lwcb/pylwcb。
b. 建立獨立的 python 虛擬環境:python -m venv .env。
c. 啟用該開發虛擬環境:source .env/bin/activate。
d. 安裝 pylwcb 編譯環境依賴的 python 庫:pip install tomli && pip install setuptools_rust && pip install maturin。
-
編譯 pylwcb:我們可以透過命令:maturin develop 來編譯 pylwcb,進而生產相應的 python 模組。一般生成的 python 模組所在目錄是:.env/lib64/python3.6/site-packages/。
使用 pylwcb
下面是一個簡單的 pylwcb 指令碼示例:
import pylwcb lwcb_program = """ kprobe:tcp_rcv_established { th = tcphdr(skb); ih = iphdr(skb); print(ntop(bswap(ih->saddr)), ntop(bswap(ih->daddr)), bswap(th->source), bswap(th->dest)); } """ lwcb = pylwcb.Pylwcb(lwcb_program) lwcb.attach() events = lwcb.read_events() for event in events: print(event)
-
lwcb_program 存放了 lwcb 指令碼程式碼,其主要功能是探測核心的 tcp_rcv_established 函式,列印 tcp 接收到報文的四元組,即源地址、目的地址、源埠和目的埠。
-
lwcb = pylwcb.Pylwcb(lwcb_program) 建立了 Pylwcb 例項。
-
lwcb.attach() 編譯並載入 eBPF 程式。
-
lwcb.read_events() 讀取 eBPF 程式的輸出。
相關連結可移步龍蜥公眾號(OpenAnolis龍蜥)2023年2月28日相同推送檢視。
—— 完 ——
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2937557/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於 Coolbpf 的應用可觀測實踐 | 龍蜥技術
- 跨語言程式設計的探索 | 龍蜥技術程式設計
- 入門即享受!coolbpf 硬核提升 BPF 開發效率 | 龍蜥技術
- 技術門檻高?來看 Intel 機密計算技術在龍蜥社群的實踐 | 龍蜥技術Intel
- 《可信計算技術最 佳實踐白皮書》釋出,龍蜥助力可信計算技術應用推廣(可下載)
- 高階Bash指令碼程式設計指南 一個對指令碼程式設計技術的深入探討指令碼程式設計
- 雙龍賀歲,龍蜥 LoongArch GA 版正式釋出
- 1024程式設計師節開幕,龍蜥多位技術專家參與演講程式設計師
- ATC'22頂會論文RunD:高密高併發的輕量級 Serverless 安全容器執行時 | 龍蜥技術Server
- 龍蜥利器:系統運維工具 SysAK的雲上應用效能診斷 | 龍蜥技術運維
- 龍蜥LoongArch架構研發全揭秘,龍芯開闢龍騰計劃技術合作新正規化架構
- 龍蜥社群聯合浪潮資訊釋出《eBPF技術實踐白皮書》(附下載連結)eBPF
- Java 指令碼化程式設計指南Java指令碼程式設計
- 助力Koordinator雲原生單機混部,龍蜥混部技術提升CPU利用率達60%|龍蜥技術
- 萬里資料庫加入龍蜥社群,打造基於“龍蜥+GreatSQL”的開源技術底座資料庫SQL
- eBPF 雙子座:天使 or 惡魔?| 龍蜥技術eBPF
- 輕量級模型設計與部署總結模型
- 致敬 hacker :盤點記憶體虛擬化探索之路|龍蜥技術記憶體
- 直播回顧:隱私計算的關鍵技術以及行業應用技巧 | 龍蜥技術行業
- clang-format的程式碼格式化ORM
- 龍蜥開源核心追蹤利器 Surftrace:協議包解析效率提升 10 倍! | 龍蜥技術協議
- 龍蜥開源Plugsched:首次實現 Linux kernel 排程器熱升級 | 龍蜥技術Linux
- 技術解讀倚天 ECS 例項——Arm 晶片的 Python-AI 算力最佳化 | 龍蜥技術晶片PythonAI
- 整合開源技術的輕量級的 Web Application Framework 設計思路WebAPPFramework
- 龍蜥社群高效能儲存技術 SIG 11 月運營回顧 | 龍蜥 SIG
- 程式設計師的燈下黑:重知識輕技術程式設計師
- 低程式碼之光!輕量級 GUI 的設計與實現GUI
- Nim 0.10.2 釋出,指令式程式設計語言程式設計
- iofsstat:幫你輕鬆定位 IO 突高,前因後果一目瞭然 | 龍蜥技術
- 程式設計師常用的五種輕量級程式碼編輯器程式設計師
- 不依賴 Gulp、Babel、WebPack,還能優雅地寫程式碼嗎?BabelWeb
- SysOM 案例解析:消失的記憶體都去哪了 !| 龍蜥技術記憶體
- 技術卡片 - 限制依賴注入的數量依賴注入
- 建立映象釋出到映象倉庫【不依賴docker環境】Docker
- 鑑釋加入龍蜥社群,助力開源生態建設
- 虛擬化解決方案 virtio 的技術趨勢與 DPU 實踐解讀 | 龍蜥技術
- gomock: 不依賴interface{}的stuct method mockGoMock
- 全面升級!龍蜥自動化運維平臺 SysOM 2.0 可支援作業系統一站式遷移 | 龍蜥技術運維作業系統