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. 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
  2. 简单支付验证(SPV)与创新
  3. python生成随机数代码_Python中产生随机数
  4. js(Dom+Bom)第五天(2)
  5. 【Emit基础】如何发射foreach代码?
  6. 文件实时上传至云服务器的方法,文件实时上传至云服务器的方法
  7. canvas绘制精细走动时钟
  8. 数据库切换为mysql中出现的问题:Error loading MySQLdb module.
  9. 【大话设计模式】——简单工厂模式
  10. Mybatis plus修改了Language Level后,IDEA运行应用出现了Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
  11. was supplied but isn‘t a known config
  12. .net反射调用值类型引用参数时的处理办法(转)
  13. 虚拟机打开了服务器维护,Vmware WorkStation 打开远程服务器上的虚拟机
  14. 微信商户收款码在哪里下载 -PC端
  15. Linux命令之ps命令
  16. GAMES101-现代计算机图形学入门
  17. 啥?学习微服务,你竟然不知道什么是熔断,降级和限流
  18. 计算机组成原理学习笔记——机器指令的基本结构
  19. 无限流量服务器可靠吗,你的无限流量真纯正吗?别再被骗了!
  20. AngularJS的$destory用法

热门文章

  1. 解决浏览器下用Debug Flash Player 访问游戏崩溃问题(2012-2-19)
  2. 台湾清华大学概率论笔记一 导论
  3. 一念逍遥显示服务器列表失败,《一念逍遥》进不去解决方法
  4. 将成“影楼第一股”,盘子女人坊坐得住吗?
  5. LV4500R二维码扫描器在酒店入住自助机的应用案例,打造高效快速的扫码入住体验
  6. 五百年的回眸才换来今生的擦肩而过!
  7. ChatGPT 被大面积封号,到底发生什么了?
  8. Linux命令详解之 mv
  9. linux:mv运用
  10. No.1 序 | Flink 知其然,知其所以然