eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。

本文是 eBPF 入门开发实践指南的第三篇,在 eBPF 中使用 fentry 捕获 unlink 系统调用。

Fentry

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>char LICENSE[] SEC("license") = "Dual BSD/GPL";SEC("fentry/do_unlinkat")
int BPF_PROG(do_unlinkat, int dfd, struct filename *name)
{pid_t pid;pid = bpf_get_current_pid_tgid() >> 32;bpf_printk("fentry: pid = %d, filename = %s\n", pid, name->name);return 0;
}SEC("fexit/do_unlinkat")
int BPF_PROG(do_unlinkat_exit, int dfd, struct filename *name, long ret)
{pid_t pid;pid = bpf_get_current_pid_tgid() >> 32;bpf_printk("fexit: pid = %d, filename = %s, ret = %ld\n", pid, name->name, ret);return 0;
}

这段程序通过定义两个函数,分别附加到 do_unlinkat 和 do_unlinkat_exit 上。这两个函数分别在进入 do_unlinkat 和离开 do_unlinkat 时执行。这两个函数通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数来获取调用 do_unlinkat 的进程 ID,文件名和返回值,并在内核日志中打印出来。

与 kprobes 相比,fentry 和 fexit 程序有更高的性能和可用性。在这个例子中,我们可以直接访问函数的指针参数,就像在普通的 C 代码中一样,而不需要使用各种读取帮助程序。fexit 和 kretprobe 程序最大的区别在于,fexit 程序可以访问函数的输入参数和返回值,而 kretprobe 只能访问返回值。

从 5.5 内核开始,fentry 和 fexit 程序可用。

eunomia-bpf 是一个结合 Wasm 的开源 eBPF 动态加载运行时和开发工具链,它的目的是简化 eBPF 程序的开发、构建、分发、运行。可以参考 https://github.com/eunomia-bpf/eunomia-bpf 下载和安装 ecc 编译工具链和 ecli 运行时。我们使用 eunomia-bpf 编译运行这个例子。

编译运行上述代码:

$ ecc fentry-link.bpf.c
Compiling bpf object...
Packing ebpf object and config into package.json...
$ sudo ecli package.json
Runing eBPF program...

在另外一个窗口中:

touch test_file
rm test_file
touch test_file2
rm test_file2

运行这段程序后,可以通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出:

$ sudo cat /sys/kernel/debug/tracing/trace_piperm-9290    [004] d..2  4637.798698: bpf_trace_printk: fentry: pid = 9290, filename = test_filerm-9290    [004] d..2  4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file, ret = 0rm-9290    [004] d..2  4637.798698: bpf_trace_printk: fentry: pid = 9290, filename = test_file2rm-9290    [004] d..2  4637.798843: bpf_trace_printk: fexit: pid = 9290, filename = test_file2, ret = 0

总结

这段程序是一个 eBPF 程序,通过使用 fentry 和 fexit 捕获 do_unlinkat 和 do_unlinkat_exit 函数,并通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 do_unlinkat 的进程 ID、文件名和返回值,并在内核日志中打印出来。

编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令,并通过查看 /sys/kernel/debug/tracing/trace_pipe 文件查看 eBPF 程序的输出。更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:https://github.com/eunomia-bpf/eunomia-bpf

完整的教程和源代码已经全部开源,可以在 https://github.com/eunomia-bpf/bpf-developer-tutorial 中查看。

eBPF 入门开发实践指南三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用相关推荐

  1. 《Core Data应用开发实践指南》一1.3 创建Grocery Dude项目

    本节书摘来自华章出版社<Core Data应用开发实践指南>一书中的第1章,第1.3节,作者 (美)Tim Roadley,更多章节内容可以访问云栖社区"华章计算机"公 ...

  2. iPad应用开发实践指南:菜鸟如何用ios 5开发ipad上的复杂应用程序

    <iPad应用开发实践指南>前言 2011年10月,苹果公司首席执行官Tim Cook公布了有关iPad的一些有趣数据,包括: 财富500强公司有92%在测试或部署iPad: 美国本土80 ...

  3. AndEngine 《Android游戏开发实践指南》之“吸血鬼游戏”实例学习(一)

    购买的<Android游戏开发实践指南>一书用的AndEngine库已经更新过,书上很多代码不适应于AndEngine GLES 2. 根据书上的步骤通过学习<少女大战吸血鬼> ...

  4. 《OpenGL ES应用开发实践指南:Android卷》—— 2.3 定义空气曲棍球桌子的结构...

    本节书摘来自华章出版社<OpenGL ES应用开发实践指南:Android卷>一 书中的第2章,第2.3节,作者:(美)Kevin Brothaler ,更多章节内容可以访问云栖社区&qu ...

  5. 《OpenGL ES应用开发实践指南:Android卷》—— 2.2 不要从头开始

    本节书摘来自华章出版社<OpenGL ES应用开发实践指南:Android卷>一 书中的第2章,第2.2节,作者:(美)Kevin Brothaler ,更多章节内容可以访问云栖社区&qu ...

  6. 《OpenGL ES应用开发实践指南:Android卷》—— 3.7 练习

    本节书摘来自华章出版社<OpenGL ES应用开发实践指南:Android卷>一 书中的第3章,第3.7节,作者:(美)Kevin Brothaler ,更多章节内容可以访问云栖社区&qu ...

  7. OpenGL ES应用开发实践指南:iOS卷

    <OpenGL ES应用开发实践指南:iOS卷> 基本信息 原书名:Learning OpenGL ES for iOS:A Hands-On Guide to Modern 3D Gra ...

  8. 20189200余超 2018-2019-2 移动平台应用开发实践第三周作业

    2018-2019-2 移动平台应用开发实践第三周作业 核心类 基本类型的封装类 封装类: java语言认为一切皆对象.8个基本数据类型野应该具备对应的对象.通过封装类可以把8个基本类型的值封装对象进 ...

  9. Python编程:从入门到实践 第三章--函数

    Python编程:从入门到实践 第三章-函数 语法 就还是需要先记一下函数定义的语法: def Test(num):num = 12 如上,def func_name(factors): # code ...

最新文章

  1. 阿里120页PPT诠释国家“智能+”战略
  2. python读取输入流_python – 将一个正在运行的程序的输出流传输到其他正在运行的程序的输入流...
  3. 深度css:关于浮动(float,clear)的图形化理解
  4. CV Code | 本周新出计算机视觉开源代码汇总(含实例分割、行人检测、姿态估计、神经架构搜索、超分辨率等)...
  5. android+后台+拍照,Android相机无法从后台服务拍照
  6. 怎样使用http代理IP判断公立幼儿园和私立幼儿园的差距
  7. python 常微分方程_常微分方程数值解法——python实现
  8. 系统辨识(五):系统辨识的最小二乘法基础
  9. 调研内容(算法相关--MDP)
  10. 微信小程序加入购物车动画
  11. Python Pandas缺失值处理
  12. MacOS Ventura 13.1 (22C65) 正式版带 OC 0.8.7 and winPE 双分区原版黑苹果镜像
  13. python用保留字while实现无限循环_Python中无限循环需要什么条件
  14. Java技巧之双括弧初始化
  15. python lisp_给Lisp程序员的Python简介
  16. 国外军事信息网站爬虫源
  17. 为了不当接盘侠,这位程序员做了一个识别“特殊”职业女性的系统
  18. Caffe 源码 - BatchNorm 层与 Scale 层
  19. H3C 5130及华为5700交换机的802.1X认证
  20. Sharding-JDBC简单使用

热门文章

  1. Linux常用命令大全(冰河世纪到现在最全的收集)
  2. ili9325显示方向反了(原点设置与方向设置)
  3. 崔尚森《web开发技术》复习提纲
  4. 给程序员老公20年后的一封信
  5. MobaXterm文档手册
  6. Linux常用命令——lvdisplay命令
  7. Spring Security入门基础
  8. 【Spring Cloud Alibaba】Spring Cloud Alibaba 分布式配置Nacos实践
  9. AutoML:人工智能领域-自动化技术之机器学习自动化技术的简介(预处理→设计算法→训练模型→优化参数)、常用的工具或框架之详细攻略
  10. SpringAOP所需jar包(cglib、aopalliance、aspectj.weaver)