操作系统实验三:基于BPF机制的系统跟踪与探测

  • 实验内容

学习BPF机制,了解BCC(BPF Compiler Collection)和bpftarce的实现原理,利用BPF工具实现对系统的跟踪和探测,如跟踪新创建的进程,统计线程占用CPU的时间,统计某内核函数的调用次数,跟踪系统中的内存调用和页错误,跟踪文件打开信息等。

  • 实验目的

通过实验,让学生了解BPF机制,掌握利用BPF工具对系统进行跟踪与探测的方法。

  • 设计思路和流程图
  1. 认识BCC:

BCC 是一个用于创建高效内核跟踪和操作程序的工具包,包括几个有用的工具和示例。它利用了扩展的 BPF(Berkeley Packet Filters),正式名称为 eBPF,这是首次添加到 Linux 3.15 的新功能。BCC 使用的大部分内容都需要 Linux 4.1 及更高版本。

BCC 使 BPF 程序更易于编写,使用 C 中的内核工具(并包括围绕 LLVM 的 C 包装器),以及 Python 和 lua 中的前端。它适用于许多任务,包括性能分析和网络流量控制。

BCC 是 eBPF 的一个工具集,是 eBPF 提取数据的上层封装,它的形式是

python 等程序中嵌套 bpf 程序。python 部分的作用是为用户提供友好的使

用 eBPF 的上层接口,也用于数据处理。bpf 程序会注入内核,提取数据。

当 bpf 程序运行时,通过 LLVM 将 bpf 程序编译得到 bpf 指令集的 elf 文

件,从 elf 文件中解析出可以注入内核的部分,用 bpf_load_program()方

法完成注入。注入程序 bpf_load_program()加入了更复杂的 verifier 机

制,在运行注入程序之前,先进行一系列的安全检查,最大限度的保证系统

的安全。

  1. 了解BPF

BPF,及伯克利包过滤器Berkeley Packet Filter,最初构想提出于 1992 年,其目的是为了提供一种过滤包的方法,并且要避免从内核空间到用户空间的无用的数据包复制行为。它最初是由从用户空间注入到内核的一个简单的字节码构成,它在那个位置利用一个校验器进行检查 —— 以避免内核崩溃或者安全问题 —— 并附着到一个套接字上,接着在每个接收到的包上运行。几年后它被移植到 Linux 上,并且应用于一小部分应用程序上(例如,tcpdump)。其简化的语言以及存在于内核中的即时编译器(JIT),使 BPF 成为一个性能卓越的工具。

在 2013 年,Alexei Starovoitov 对 BPF 进行彻底地改造,并增加了新的功能,改善了它的性能。这个新版本被命名为 eBPF (意思是 “extended BPF”),与此同时,将以前的 BPF 变成 cBPF(意思是 “classic” BPF)。新版本出现了如映射和尾调用tail call这样的新特性,并且 JIT 编译器也被重写了。新的语言比 cBPF 更接近于原生机器语言。并且,在内核中创建了新的附着点。

用Linux Kernel Module来做一个类比说明eBPF诞生的目的。

Kernel Module的主要目的就是让用户可以通过这种机制,实现对内核的“赋能”,动态添加一些内核本身不支持的功能,比如硬件的驱动能力,新的文件系统或是系统调用。当然也可以融合到现有的内核处理流程中,比如在netfilter的某个hook点中添加包处理方法等。

Kernel Module的优点:

动态添加/删除,无需重新编译内核

减小内核体积

缺点:

一旦出现BUG可能导致内核直接崩溃

增加内核攻击面,影响内核安全

eBPF要做的事情也非常类似,但它想要克服Kernel Module的缺点,即确保执行的代码绝对安全。

为了达到这一目的,eBPF在内核中实现了一个虚拟机执行用户的指令。与Kernel Module直接在真实的物理硬件上执行用户的指令不同,eBPF提供给用户一个虚拟的RISC处理器,以及一组相关的指令。用户可以直接用这组指令编写程序。同时,程序在下发到该虚拟机之前也会经过eBPF的检查,比如会不会进入无限循环,会不会访问不合法的内存地址等等。只有在通过检查之后才可以进入执行的环节。

对eBPF来说,和Kernle Module一样,也是通过特定的Hook点监听内核中的特定事件,进而执行用户定义的处理。这些Hook点包括:

静态tracepoint

动态内核态探针(Dynamic Kernel probes)

动态用户态探针(Dynamic User Probes)

其他hook点

针对主要是监控、跟踪使用的eBPF应用来说,主要通过这种方式取得内核运行时的一些参数和统计信息。例如,系统调用的参数值、返回值,通过eBPF map将得到的信息送给用户态程序,进而在用户态完成后处理流程。

另外一类应用则直接在一些内核处理流程中加入自己的处理逻辑,例如XDP,就是在网卡驱动和内核协议栈之间插入了eBPF扩展的网包过滤、转发功能。

eBPF 是一个在内核中运行的虚拟机,它可以去运行用户。在用户态实现的这种 eBPF 的代码,在内核以本地代码的形式和速度去执行,它可以跟内核的 Trace 系统相结合,给我们提供了几乎无限的可观测性。

eBPF 的基本原理——它所有的接口都是通过 BPF 系统调用来跟内核进行交互,eBPF 程序通过 LVM 和 Cline 进行编译,产生 eBPF 的字节码,通过 BPF 系统调用,加载到内核,验证代码的安全性,从而通过 JIT 实时的转化成 Native 的 X86 的指令。

3. 了解 bpftrace:

bpftrace 是一个基于bcc和bpf的开源跟踪器

bpftrace 提供了一种快速利用 eBPF 实现动态追踪的方法,可以作为简

单的命令行工具或者入门级编程工具来使用。动态追踪是一种高级的内核调

试技术,通过探针机制,采集内核态或者用户态程序的运行信息,而不需要

修改内核和应用程序的代码。这种机制性能损耗小,不会对系统运行构成任

何危险。因此,能够以非常低的成本,在短时间内获得丰富的运行信息,进

而可以快速的分析、排查、发现系统运行中的问题。

  • 主要数据结构及其说明

  • 源程序并附上注释(关键部分)

有关安装相关代码:

sudo apt-get install -y bpftrace

安装依赖:

sudo apt-get -y install bison build-essential cmake flex git libedit-dev \

  libllvm6.0 llvm-6.0-dev libclang-6.0-dev python zlib1g-dev libelf-dev libfl-dev python3-distutils

sudo apt-get install python3-distutils

sudo apt-get install python3-pip

sudo apt-get install python3-setuptools

安装bcc:

tar zxvf bcc-src-with-submodule.tar.gz

cd bcc

mkdir build

cd build

cmake ..

make

sudo make install

cmake - DPYTHON_CMD = python3 .. #build python3 binding

pushd src/python/

make

sudo make install

popd

使用BCC构建一个Trace Point程序

#!/usr/bin/python

#

# urandomread  Example of instrumenting a kernel tracepoint.

#              For Linux, uses BCC, BPF. Embedded C.

#

# REQUIRES: Linux 4.7+ (BPF_PROG_TYPE_TRACEPOINT support).

#

# Test by running this, then in another shell, run:

#     dd if=/dev/urandom of=/dev/null bs=1k count=5

#

# Copyright 2016 Netflix, Inc.

# Licensed under the Apache License, Version 2.0 (the "License")

from __future__ import print_function

from bcc import BPF

from bcc.utils import printb

# load BPF program

b = BPF(text="""

TRACEPOINT_PROBE(random, urandom_read) {

    // args is from /sys/kernel/debug/tracing/events/random/urandom_read/format

    bpf_trace_printk("%d\\n", args->got_bits);

    return 0;

}

""")

# header

print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "GOTBITS"))

# format output

while 1:

    try:

        (task, pid, cpu, flags, ts, msg) = b.trace_fields()

    except ValueError:

        continue

    except KeyboardInterrupt:

        exit()

printb(b"%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))

TRACEPOINT_PROBE(random, urandom_read): 启动内核跟踪点。根据目录/random/urandom_read输入参数。

args->got_bits: 自动生成的参数,每个event的参数各有不同

  • 程序运行结果及分析

查看 TCP 会话的生命周期和吞吐量统计:

输入指令:sudo python tcplife.py:

跟踪 hit radio:

输入指令:sudo python cachestat.py:

追踪每个任务占用 CPU 时间:

输入指令:sudo python cpudist.py:

追踪新的进程:

输入指令:sudo python execsnoop.py:

追踪新创建的线程:

输入指令:sudo python threadsnoop.py:

内存泄露使用的是memleak.py文件,作用是统计从运行开始之后,内存的分配与释放情况,每隔一段时间,打印出分配了,但没有被释放的内存,信息包括分配的函数栈以及内存大小、个数:

输入指令:sudo python memleak.py:

使用cachetop.py文件,可以统计每个进程的缓存命中率,原理是在内核cache相关的几个函数上加了kprobe进行统计。

输入指令:sudo python cachetop.py:

biolatency 统计bio的耗时分布情况:

输入指令:sudo python biolatency.py:

biotop 统计每个进程的bio数据量大小:

输入指令:sudo python biotop.py:

biosnoop 统计每个bio的进程、大小、耗时等信息:

输入指令:sudo python biosnoop.py:

bitesize 统计每个进程的bio大小的分布情况:

输入指令:sudo python bitesize.py:

使用BCC构建一个Trace Point程序:

TRACEPOINT_PROBE(random, urandom_read): 启动内核跟踪点。根据目录/random/urandom_read输入参数。

args->got_bits: 自动生成的参数,每个event的参数各有不同,见下文

输入指令:sudo python3 hello.py:

urandomread的参数设置如下:

输入指令:

cat /sys/kernel/debug/tracing/events/random/urandom_read/format

结果:

从最后一行可以看到,可以输出go_bits,pool_left,input_left三个参数。

  • 实验体会

在网上查看有关 BCCeBPF bpftrace 的有关资料,令我对他们有了从一无所知到初步了解。在安装的时候曾经遇到过各种各样的问题,比如说由于安装bcc所需的版本必须在4.1以上,所以在老师所提供的环境下无法进行。在SEED上进行安装的时候,也出现了各种各样的问题,比如:

当时还一度打开了系统文件:

在向老师和助教询问之后,我最终发觉是版本与系统的不适应所导致的,最后下载了2021年九月份的bcc,最终得以将问题解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/893394.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

98. UE5 GAS RPG 实现技能眩晕效果

我们在技能伤害基类上面设置了对应的负面效果应用的配置项,用来实现技能的负面效果应用。 在之前实现火球术的负面效果时,我们我们在创建火球时,通过伤害基类上的创建技能配置用于后续应用。 在火球攻击到敌人时,通过函数库书写…

电脑技巧:优化Edge浏览器占用C盘空间的解决方案

大家在日常使用电脑的使用,Edge浏览器作为Windows电脑自带的浏览器,使用体验还是非常不错的。对于电脑新手来说直接使用微软自带的Edge浏览器也可以满足使用需求。但是随着电脑使用的越久,整体Edge浏览器也会占用几个G甚至更多的磁盘空间,并且还是C盘。 今天给大家分享如何…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式: 在当今信息爆炸的时代,如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

【电商购物管理系统】Python+Django网页界面平台+商品管理+数据库

一、介绍 电商购物管理系统,本系统前端使用HTML、CSS、BootStrap等技术搭建前端界面,后端使用Django框架处理用户的逻辑请求。主要功能有: 管理员登录与管理:管理员可以登录后台,对用户和商品进行增删改查的操作。用…

stm32 bootloader写法

bootloader写法: 假设app的起始地址:0x08020000,则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义 typedef void (*APP_FUNC)(void); // 函数指针类型定义 /*main函数中调用rum_app&#x…

vue + 百度地图GL版判断一个点位是否在地图可视区内

利用BMapGLLib中isPointInRect 因为没有找到官方文档因此直接下载了该工具的源码,复制以下部分到自己的项目中,避免再次引用完整的BMapGLLib脚本 关键方法 isPointInRect(point, bounds) {if (!(point.toString() "Point" || point.toString(…

解锁机器人视觉与人工智能的潜力,从“盲人机器”改造成有视觉能力的机器人(下)

机器视觉产业链全景回顾 视觉引导机器人生态系统或产业链分为三个层次。 上游(供应商) 该机器人视觉系统的上游包括使其得以运行的硬件和软件提供商。硬件提供商提供工业相机、图像采集卡、图像处理器、光源设备(LED)、镜头、光…

英飞达医学影像存档与通信系统 WebUserLogin.asmx 信息泄露漏洞复现

0x01 产品简介 英飞达医学影像存档与通信系统 Picture Archiving and Communication System,它是应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声,各种X光机,各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟,DICOM,网络…

93、Python之异常:了解常见的内置异常,遇到不慌

引言 本文接着来聊Python中的异常管理,对于新手来说,一旦看到异常,就会比较慌张。其实,倒不是对异常比较害怕,而是担心不知道该怎么处理这种异常才是比较可怕的。本文就简单列举一下Python中比较常见的异常&#xff0…

python学习-怎么在Pycharm写代码

打开Pycharm,点击文件-新建项目 2.选择pure python-点击箭头 展开 3.选择 Existing interpreter 如果 Existing interpreter 下没有相关环境 (1)点击**…** (2)选择python的安装路径 4.可修改文件名称-点击创建 …

二叉搜索树中第 K 小的元素

二叉搜索树中第 K 小的元素 ​ 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出:1…

QT实现改变窗口大小其子控件也自动调节大小

创建一个顶层布局即可,一定要在MainWindows或者Widget的下面! 观察图标变化 带有禁止的意思是分拆布局(当前无布局) 现在是添加布局后了 注意:一定是在MainWindows或Widget才可以添加顶层布局,才可以实现…

Golang简介

目录 第一章 go语言起源 第一节 go语言发展 1.知名编程语言或系统的发展简吏 2.Go语言的前世今生 3.go语言的核心特性 4.Go语言的优势和其他语言的对比 5.Go开发环境搭建 第二章 go语言Helloworld 一、go项目工程结构 二、执行go程序 三、go程序的解释说明 第三章 g…

29.第二阶段x86游戏实战2-遍历周围-花指令与二叉树数据结构(有如何阅读vm代码混淆代码)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

VmWare下的linux虚拟机磁盘空间扩展

我用vmware开启了一个虚拟机,虚拟机操作系统是centos7。今天发现磁盘空间不够了,导数据到里面的mysql,提示没有空间,之后mysql也连不上了。这个mysql部署在docker里,结果停止都停止不了,强制停止也不行。无…

10-Python基础编程之函数

Python基础编程之函数 概念基本使用参数单个参数多个参数不定长参数缺省参数注意事项 返回值使用描述偏函数高阶函数返回函数匿名函数闭包装饰器生成器递归函数函数的作用域 概念 写了一段代码实现了某个小功能:然后把这些代码集中到一块,起一个名字&am…

五、Spring Boot集成Spring Security之认证流程2

一、Spring Boot集成Spring Security专栏 一、Spring Boot集成Spring Security之自动装配 二、Spring Boot集成Spring Security之实现原理 三、Spring Boot集成Spring Security之过滤器链详解 四、Spring Boot集成Spring Security之认证流程 五、Spring Boot集成Spring Se…

Flink 介绍(特性、概念、故障容错、运维部署、应用场景)

概述 特性 概念 数据流 状态 时间 savepoint 故障容错 运维部署 部署应用到任意地方 Flink能够更方便地升级、迁移、暂停、恢复应用服务 监控和控制应用服务 运行任意规模应用 应用场景 事件驱动型应用 什么是事件驱动型应用? 事件驱动型应用的优势 Flink如何…

OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 允许用户在给定的图像上选择多个 ROI。 该函数创建一个窗口,并允许用户使用鼠标来选择多个 ROI。控制方式:使用空格键或…

如何用示波器检测次级点火系统(一)

写在最前面: 单看标题可能会让你觉得这篇文章的主题是关于检测线圈,火花塞和火花塞插头电线。但我们指的是分析燃烧室内电子的行为。目标是看燃料混合物,阀座,压缩,积碳和其它影响这种特性的症状。最终目的是要学会分…