轻量易部署!Coolbpf 发布不依赖 Clang 的脚本化编程特性 lwcb | 龙蜥技术

news/2024/7/10 19:34:12 标签: linux, 开源, 运维

文/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 功能性强主要体现在以下几点:

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 pylwcblwcb_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")));  }}

02

lwcb 使用方法

只需要更新 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 文件,可以从该网址(https://mirrors.openanolis.cn/coolbpf/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

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 pylwcblwcb_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

什么?Coolbpf 不仅可以远程编译,还可以发现网络抖动!

基于 Coolbpf 的应用可观测实践

入门即享受!coolbpf 硬核提升 BPF 开发效率

龙蜥社区开源 coolbpf,BPF 程序开发效率提升百倍

相关链接

eBPF技术探索 SIG 主页:

https://openanolis.cn/sig/ebpfresearch

—— 完 ——


http://www.niftyadmin.cn/n/109421.html

相关文章

【社工篇】——水坑攻击

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a;努力赚钱不是因为爱钱“水坑攻击”&#xff0c;黑客攻…

力扣(LeetCode)426. 将二叉搜索树转化为排序的双向链表(2023.02.28)

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表&#xff0c;你可以将左右孩子指针作为双向循环链表的前驱和后继指针&#xff0c;第一个节点的前驱是最后一个节点&#xff0c;最后一个节点的后继是第一个节点。 特别地&#xff0c;我们希望可以…

pc端实现屏幕自适应

pc端实现屏幕自适应 采用&#xff1a;postcss-px-to-viewport lib-flexible 原理&#xff1a;flexible.js帮我们计算出1rem 等于多少px。 怎么计算的&#xff1f; 很简单&#xff0c;就是1rem 屏幕宽度的1/10 let width docEl.getBoundingClientRect().width; const rem …

【新生代、老年代是在哪个结构里面进行区分的,为什么要区分】

新生代和老年代是在Java虚拟机的堆结构中进行区分的。 在Java堆内存中&#xff0c;通常将堆分为新生代和老年代两部分。 新生代&#xff08;Young Generation&#xff09; 是Java堆中用于存储新创建的对象的一部分&#xff0c;一般占用整个堆的1/3到1/4。新生代分为Eden区和两…

房产营销、地产中介如何高效低成本获客?

数字化对企业而言&#xff0c;机遇和挑战并存。房产企业可借助数字化加强日益扩大的业务规模和业务领域管理&#xff0c;以提升管理效率&#xff0c;降低管理难度&#xff1b;基于数字化技术加强客户的服务体验&#xff0c;进而收集多业态客户和场景数据&#xff0c;拓展创新业…

upload-labs通关详细教程

文章目录文件上传要点1、前端验证绕过做题步骤源码分析2、Content-Type方式绕过做题步骤源码分析3、黑名单绕过做题步骤源码分析4、.htaccess文件绕过简介做题步骤源码分析5、后缀大小写绕过简介做题步骤源码分析6、文件后缀&#xff08;空&#xff09;绕过简介做题步骤源码分析…

CAS和CAS中的ABA问题

什么是 CAS CAS: 全称Compare and swap&#xff08;比较并交换&#xff09;&#xff0c;它是原子的操作。 一个CAS涉及的操作&#xff1a; 1、比较内存和寄存器A的值是否相同 2、相同的话将内存和寄存器B的值进行交换【主要目的是将寄存器B的值赋值给内存】并且返回true 3…

刷题打卡dayday 13 :239. 滑动窗口最大值、 347.前 K 个高频元素、总结

1、优先队列 优先队列在普通队列的基础上给每个元素增加了优先级&#xff0c;这样每次出队的元素不再是队首的元素&#xff0c;而是队列中优先级最高的元素&#xff0c;而具体的优先级可以自行定义&#xff0c;典型的就是按元素从大到小或从小到大的顺序定义优先级。 在STL中…