文章目录

  • 1. 使用BPF/BCC
    • 1.1在centos8操作系统上安装对应的软件二进制包
    • 1.2 源码包安装
    • 1.3 程序示例
  • 2. Systemtap
    • 2.1安装 systemtap
    • 2.2 Stap-prep
    • 2.3 程序示例
  • 3. bpftrace
    • 3.1 安装软件
    • 3.2 程序示例
  • 4 总结
  • 参考文献:

本篇文章通过一个案例,对systemtap、BPF/BCC、bpftrace三种不同类型的内核探测工具进行剖析和对比。这个程序就是简单对icmp_rcv函数,收到icmp报文,打印出对应的源IP地址和目的IP地址。

1. 使用BPF/BCC

1.1在centos8操作系统上安装对应的软件二进制包

1)    安装kernel-devel包;
2)   安装dnf -y install bcc-tools

1.2 源码包安装

dnf install -y bison cmake ethtool flex git iperf3 libstdc+±devel python3-netaddr python3-pip gcc gcc-c++ make zlib-devel elfutils-libelf-devel
dnf install -y clang clang-devel llvm llvm-devel llvm-static ncurses-devel
dnf -y install netperf
pip3 install pyroute2
ln -s /usr/bin/python3 /usr/bin/python
dnf -y install openssl
git clone https://github.com/iovisor/bcc.git
mkdir bcc_build
cmake …/bcc -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_LLVM_SHARED=1
cd …/&& make -j10
make install

1.3 程序示例

使用bpf/bcc需要的内核版本最少是4.10以上。
使用下面的bcc代码,

#!/usr/bin/env python3.6from __future__ import print_function
from bcc import BPF
from bcc.utils import printbbpf_text = """
#include <uapi/linux/ptrace.h>
#include <net/sock.h>
#include <bcc/proto.h>
#include <uapi/linux/icmp.h>
#include <linux/icmp.h>
#include <uapi/linux/ip.h>
#include <linux/ip.h>static inline struct iphdr *skb_to_iphdr(const struct sk_buff *skb)
{// unstable API. verify logic in ip_hdr() -> skb_network_header().return (struct iphdr *)(skb->head + skb->network_header);
}int icmp_rcv_cb(struct pt_regs *ctx, struct sk_buff *skb)
{struct icmphdr *icmph ;struct iphdr *iph = skb_to_iphdr(skb);bpf_trace_printk("ipsrc:%pI4  ipdst:%pI4 \\n",&iph->saddr, &iph->daddr);icmph = (struct icmphdr *)skb->data;bpf_trace_printk("devname:%s ----- icmp_type:%d  \\n",skb->dev->name, icmph->type);return 0;
};
"""
# initialize BPF
b = BPF(text=bpf_text)
b.attach_kprobe(event="icmp_rcv", fn_name="icmp_rcv_cb")
#end format output
while 1:# Read messages from kernel pipe(task, pid, cpu, flags, ts, msg) = b.trace_fields()print("task:%s pid: %d %s " % (task, pid, msg))
#b.trace_print()

2. Systemtap

2.1安装 systemtap

在centos8 上直接使用yum安装 yum install systemtap systemtap-runtime

2.2 Stap-prep


通过在http://debuginfo.centos.org/8/x86_64/Packages/下载安装完debuginfo包后,执行stap-prep命令

简单测试可以运行成功

2.3 程序示例

下面是systemtap的方式对icmp_rcv函数的探测,对本机收到的ICMP报文打印出,对应的源IP和目的IP地址。

stap -g icmp_systemtap.stp
#!/usr/bin/stap -g
%{#include <linux/kernel.h>
#include <linux/net.h>
#include <linux/skbuff.h>
#include <net/ip.h>
#include <linux/module.h>
#include <uapi/linux/if_packet.h>
#include <linux/fdtable.h>
#include <net/icmp.h>static inline void ip2str(char *to,unsigned int from){int size = snprintf(to,16,"%pI4",&from);to[size] = '\0';}
%}
function get_icmp_packet_info:string(skb:long)
%{int ret = -1;struct sk_buff *skb = (struct sk_buff *)STAP_ARG_skb;struct iphdr *ip_header;unsigned int src_ip_1 = 0;unsigned int  dst_ip_1 = 0;char src_ip[16],dst_ip[16];struct icmphdr *icmph;if(!skb){goto EXIT_F;}ip_header = (struct iphdr *)skb_network_header(skb);if(!ip_header){goto EXIT_F;}src_ip_1 = (unsigned int)ip_header->saddr;dst_ip_1 = (unsigned int)ip_header->daddr;ip2str(src_ip,src_ip_1);ip2str(dst_ip,dst_ip_1);icmph = icmp_hdr(skb);if(icmph->type == 0){goto ECHO_ICMP;}if(icmph->type == 8){goto REPLY_ICMP;}EXIT_F:snprintf(STAP_RETVALUE,MAXSTRINGLEN,"ERROR:src_ip:%s dst_ip:%s",src_ip,dst_ip);
ECHO_ICMP:snprintf(STAP_RETVALUE,MAXSTRINGLEN,"ECHO_ICMP:src_ip:%s dst_ip:%s",src_ip,dst_ip);
REPLY_ICMP:snprintf(STAP_RETVALUE,MAXSTRINGLEN,"REPLY_ICMP:src_ip:%s dst_ip:%s",src_ip,dst_ip);
%}global locationsprobe begin { printf("Monitoring for recv icmp packets\n") }
probe end { printf("Stropping monitoring  packets\n") }probe kernel.function("icmp_rcv").return
{printf("%s\n",get_icmp_packet_info($skb))iphdr = __get_skb_iphdr($skb)saddr = format_ipaddr(__ip_skb_saddr(iphdr), @const("AF_INET"))daddr = format_ipaddr(__ip_skb_daddr(iphdr), @const("AF_INET"))printf("src_ip:%s  dst_ip:=%s\n",saddr,daddr);}probe timer.sec(5)
{exit ()
}

下面是运行后的测试结果:

3. bpftrace

3.1 安装软件

yum -y install bpftrace

3.2 程序示例

bpftrace是使用自定义单行代码和简短脚本的临时工具的不错的选择,而BCC是复杂工具和守护程序的理想选择、bpftrace和BCC都是BPF的前端工具。

在这里插入代码片#!/usr/bin/bpftrace#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/socket.h>BEGIN
{printf("Tracing icmp rev.Hit  Ctrl-C end.\n");
}kprobe:icmp_rcv
{$skb = (struct sk_buff *)arg0;$iph = (struct iphdr*)($skb->head + $skb->network_header);$src_ip = ntop(AF_INET,$iph->saddr);$dst_ip = ntop(AF_INET,$iph->daddr);printf("src_ip:%s  ----> dst_ip:%s\n",$src_ip,$dst_ip);
}END
{printf("OVER  bye!!")
}

运行结果如下:

4 总结

  1. 使用systemtap工具跟踪内核需要安装和内核对应版本的debuginfo包,systemtap作为老牌的内核跟踪工具,可以支持比较老的内核版本,对于现有存量的内核定位跟踪有明显的优势。
  2. BPF/BCC作为新的内核跟踪工具,需要较新的内核版本,最少是4.10版本,最好是4.19版本的内核。
  3. 通过运行对比发现,编译和运行BPF/BCC的代码比systemtap的代码要快的多。
  4. BPF有各类安全检查,避免在内核跟踪过程中产生panic,systemtap没有此类的安全检查,需要开发者在开发systemtap程序时,保证代码的安全性。
  5. Bpftrace作为内核跟踪的一种工具,特别适合简单的内核跟踪,适合一条命令搞定的内核跟踪,bpftrace也有自己的一套语法体系可用。
    各种不同类型的内核探测跟踪技术,适合不同类型的场景,在实际使用中可选择适合自己的方式。

参考文献:

https://lwn.net/Articles/852112/

BPF学习笔记(五)--Systemtap BPF/BCC bpftrace 实践对比相关推荐

  1. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  2. Ethernet/IP 学习笔记五

    Ethernet/IP 学习笔记五 Accessing data within a device using a non-time critical message (an explicit mess ...

  3. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  4. 吴恩达《机器学习》学习笔记五——逻辑回归

    吴恩达<机器学习>学习笔记五--逻辑回归 一. 分类(classification) 1.定义 2.阈值 二. 逻辑(logistic)回归假设函数 1.假设的表达式 2.假设表达式的意义 ...

  5. 好程序员教程分析Vue学习笔记五

    好程序员教程分析Vue学习笔记五,上次我们学习了Vue的组件,这次我们来学习一下路由的使用.在Vue中,所谓的路由其实跟其他的框架中的路由的概念差不多,即指跳转的路径. 注意:在Vue中,要使用路由, ...

  6. 【AngularJs学习笔记五】AngularJS从构建项目开始

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...

  7. ROS学习笔记五:理解ROS topics

    ROS学习笔记五:理解ROS topics 本节主要介绍ROS topics并且使用rostopic和rqt_plot命令行工具. 例子展示 roscore 首先运行roscore系列服务,这是使用R ...

  8. Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )

    Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...

  9. Java学习笔记(五):一张图总结完JVM8基础概念

    Java学习笔记(五):一张图总结完JVM8基础概念 引文 最近在学习JVM的相关内容,好不容易把基础概念全部都学了一遍,却发现知识网络是零零散散的.迫不得已,只好再来一次总的归纳总结.为了更好的理解 ...

最新文章

  1. Spring Boot + BeetlSQL + H2数据库项目整合
  2. android okhttp 架构,Android okhttp3.0 框架使用总结
  3. Scala代码案例:统计三个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级的平均分
  4. wxpython列表控件listctrl设置某行颜色_wxPython ListCtrl:写入彩色纹理
  5. Oracle用户和权限管理
  6. EOS Nation更新“flash.sx遭攻击”进展:将建议MSIG根据快照将资金退还
  7. [转]Birdfont 2.10 发布,字体编辑器
  8. WPF基础(八)bitmapImage.EndInit()引发异常 未找到适用于完成此操作的图像处理组件:可能是收发图片格式不一致导致的。
  9. Mac安装Mysql,并启动
  10. ArduinoUNO实战-第九章-光敏电阻或亮度传感器
  11. Array 常用函数
  12. PowerBI-筛选器函数-LOOKUPVALUE
  13. 玄幻:我!收徒就变强!(三)
  14. 关于travis scott的网名_小仙女可爱单纯的网名
  15. springboot2 集成shiro-spring-boot-web-starter
  16. 研一学习笔记-小白NLP入门学习笔记
  17. 用arjs和aframe打造太阳系-第二章
  18. 如何在计算机上注销一个用户登录,如何取消Microsoft账户登录电脑
  19. 海思HI3518E视频处理基础概念《三》----- 视频处理子系统VPSS
  20. [转]VS2008中开发智能设备程序的一些总结收藏1

热门文章

  1. 电脑从新分盘(软件)
  2. kl-scroll-text (文字滚动)
  3. 为什么我的iPhone iOS 15少了一些新功能
  4. 【杂货铺】金融机构分类
  5. AlexNet网络练习
  6. 关于mysql出现delete from student where `stu_id` = '1' Error Code: 1175. You are using safe update错误
  7. Jzoj P6305 最小值___单调栈优化dp
  8. 淘宝海报常见的英文字体精选,让你的设计更显逼格!
  9. EasyExcel 复杂数据导出
  10. 串口转网络DTU工具软件