关于clang:轻量易部署Coolbpf-发布不依赖-Clang-的脚本化编程特性-lwcb

45次阅读

共计 3361 个字符,预计需要花费 9 分钟才能阅读完成。

基于 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 地址和端口号信息。

  1. 反对 BTF,可能进行类型推导。如 th = tcphdr(skb);,lwcb 可能依据 BTF 信息,晓得 skb 的类型是 struct sk_buff,th 的类型是 struct tcphdr 。用户能够间接来拜访 struct tcphdr 构造体中的成员,如 th->source,而无需再申明 th 的类型。
  2. 反对 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)
  1. 反对批量探测点,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.

  1. -sSf https://sh.rustup.rs | sh 克隆 Coolbpf 代码:git clone https://gitee.com/anolis/coolbpf.git 进入到 lwcb 目录:cd coolbpf/lwcb2. 编译:cargo build –release 即可实现编译,生成的 lwcb 可执行程序在:target/release/lwcb。
  2. 此外,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 脚本。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。

  1. 编译 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

文 /eBPF 技术摸索 SIG

原文链接

本文为阿里云原创内容,未经容许不得转载。

正文完
 0