-
轻量易部署!Coolbpf 发布不依赖 Clang 的脚本化编程特性 lwcb
- 网站名称:轻量易部署!Coolbpf 发布不依赖 Clang 的脚本化编程特性 lwcb
- 网站分类:技术文章
- 收录时间:2025-09-10 22:49
- 网站地址:
“轻量易部署!Coolbpf 发布不依赖 Clang 的脚本化编程特性 lwcb” 网站介绍
基于 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 也让用户方便地添加更多的内置函数,覆盖更多应用场景。
01lwcb 特性
轻量级、易部署
lwcb 使用 rust 开发了一个小巧的解析器,不依赖于 Clang。它采用轻量级的编译器,并且为编译器添加了 eBPF 后端,使其不需要依赖于 llvm。lwcb 编译后只有一个大小约为 8MB 的独立二进制程序,部署非常方便快捷。以往部署 BCC 和 bpftrace 等工具,需要在目标执行机器上安装一堆编译和运行库。
脚本化、开发快
lwcb 当前支持类似于 bpftrace 的脚本解释执行能力,优势是不需要编译。同时提供了更多内置函数,方便开发和使用。另外,他天然支持 CO-RE 的能力,在不同内核版本上安全运行。可以说,功能比较强大。
lwcb 功能性强主要体现在以下几点:
1. 更多的内置函数:如tcphdr、iphdr、tcpstate 等等。
2. 探测点函数参数自动注入功能:
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 地址和端口号信息。
3. 支持 BTF,能够进行类型推导。如 th = tcphdr(skb);,lwcb能够根据 BTF 信息,知道 skb 的类型是 struct sk_buff*,th 的类型是 struct tcphdr *。用户可以直接来访问 struct tcphdr结构体中的成员,如 th->source,而无需再声明 th 的类型。
4. 支持 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)
5. 支持批量探测点,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")));
}
}
02lwcb 使用方法
只需要更新 Coolbpf (
https://gitee.com/anolis/coolbpf) 到 1.0.0 版本,就可以使用 lwcb 脚本化编程功能。
编译 lwcb
1. 准备编译环境(
https://coolbpf.readthedocs.io/en/latest/lwcb/build.html#id1)
- 安装 rust 编译工具链:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- 克隆 Coolbpf 代码:git clone https://gitee.com/anolis/coolbpf.git
- 进入到 lwcb 目录:cd coolbpf/lwcb
2. 编译:cargo build --release 即可完成编译,生成的 lwcb 可执行程序在:target/release/lwcb。
3. 此外,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 脚本。
03pylwcb:lwcb 的 python 模块
pylwcb 是 lwcb 的 python 模块。通过 pylwcb 我们可以使用 lwcb 提供的脚本化能力,同时可以利用 python 强大的数据处理能力。
04pylwcb 使用方法
编译 pylwcb
1. 编译环境准备
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。
2. 编译 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 程序的输出。
相关阅读
lwcb 文档:
https://coolbpf.readthedocs.io/en/latest/lwcb/index.html
pylwcb 文档:
https://coolbpf.readthedocs.io/en/latest/pylwcb/index.html
相关链接
eBPF技术探索 SIG 主页:
https://openanolis.cn/sig/ebpfresearch
—— 完 ——
更多相关网站
- 携TCL同步院线 乐视HDR曲面4K电视发布
- Apple 苹果 iPhone 14 Pro Max 智能手机屏幕测评报告 「SOOMAL」
- OPPO A3 Pro支持IP69级防水:防水,更防高压喷热水
- 游戏早报:尺度惊人!写实向3D动作手游《欲神幻想》开启预约
- 如何计算UDP头的checksum_udp的校验和怎么计算
- 使用 eBPF 和 Rust 模拟开放端口,实现欺骗端口扫描器
- 第22届上海国际电影节金爵盛典将首次运用5G+4K技术全程直播
- 图像压缩技术的跃迁:从JPEG2000到JPEG XS的音视频传输革命
- SONY 索尼 HDR-AZ1 佩戴式摄影机_索尼hdr系列摄像机
- Python 高级编程之网络编程 Socket(六)
- MFC IP地址控件、拆分按钮和超链接
- 「观潮」4K HDR高动态范围制作技术(下)
- 探索eBPF:Linux内核的黑科技_bsd linux
- 【小知识点】一个netfilter forward hook的例子
- 动手写一个基于Linux内核的网络数据包拦截扩展
- 苹果12pro和13pro外观有哪些区别?
- 网卡VXLAN的offload技术介绍_vnic网卡
- Linux 网络协议栈_linux网络协议栈
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- 兔兔工程量计算软件下载 (27)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- segoe ui是什么字体 (27)
- head first java电子版 (32)
- clickhouse中文文档 (28)
- jdk-8u181-linux-x64.tar.gz (32)
- 计算机网络自顶向下pdf (34)
- -dfile.encoding=utf-8 (33)
- jdk1.9下载 (32)