• eBPF 入门实践教程(一):编写 eBPF 程序监控打开文件路径并使用 Prometheus 可视化


    背景

    通过对 open 系统调用的监测,opensnoop可以展现系统内所有调用了 open 系统调用的进程信息。

    使用 ecli 一键运行

    $ # 下载安装 ecli 二进制
    $ wget https://aka.pw/bpf-ecli -O ./ecli && chmod +x ./ecli
    $ # 使用 url 一键运行
    $ ./ecli run https://eunomia-bpf.github.io/eunomia-bpf/opensnoop/package.json
    
    running and waiting for the ebpf events from perf event...
    time ts pid uid ret flags comm fname 
    00:58:08 0 812 0 9 524288 vmtoolsd /etc/mtab 
    00:58:08 0 812 0 11 0 vmtoolsd /proc/devices 
    00:58:08 0 34351 0 24 524288 ecli /etc/localtime 
    00:58:08 0 812 0 9 0 vmtoolsd /sys/class/block/sda5/../device/../../../class 
    00:58:08 0 812 0 -2 0 vmtoolsd /sys/class/block/sda5/../device/../../../label 
    00:58:08 0 812 0 9 0 vmtoolsd /sys/class/block/sda1/../device/../../../class 
    00:58:08 0 812 0 -2 0 vmtoolsd /sys/class/block/sda1/../device/../../../label 
    00:58:08 0 812 0 9 0 vmtoolsd /run/systemd/resolve/resolv.conf 
    00:58:08 0 812 0 9 0 vmtoolsd /proc/net/route 
    00:58:08 0 812 0 9 0 vmtoolsd /proc/net/ipv6_route 
    

    实现

    使用 eunomia-bpf 可以帮助你只需要编写内核态应用程序,不需要编写任何用户态辅助框架代码;需要编写的代码由两个部分组成:

    • 头文件 opensnoop.bpf.h 里面定义需要导出的 C 语言结构体:
    • 源文件 opensnoop.bpf.c 里面定义 BPF 代码:

    头文件 opensnoop.bpf.h

    /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
    #ifndef __OPENSNOOP_H
    #define __OPENSNOOP_H
    
    #define TASK_COMM_LEN 16
    #define NAME_MAX 255
    #define INVALID_UID ((uid_t)-1)
    
    // used for export event
    struct event {
       
    	/* user terminology for pid: */
    	unsigned long long ts;
    	int pid;
    	int uid;
    	int ret;
    	int flags;
    	char comm[TASK_COMM_LEN];
    	char fname[NAME_MAX];
    };
    
    #endif /* __OPENSNOOP_H */
    

    opensnoop 的实现逻辑比较简单,它在 sys_enter_opensys_enter_openat 这两个追踪点下
    加了执行函数,当有 open 系统调用发生时,执行函数便会被触发。同样在,在对应的 sys_exit_open
    sys_exit_openat 系统调用下,opensnoop 也加了执行函数。

    源文件 opensnoop.bpf.c

    // SPDX-License-Identifier: GPL-2.0
    // Copyright (c) 2019 Facebook
    // Copyright (c) 2020 Netflix
    #include 
    #include 
    #include "opensnoop.bpf.h"
    
    struct args_t {
       
    	const char *fname;
    	int flags;
    };
    
    const volatile
  • 相关阅读:
    【Markdown】编辑器使用技巧大汇总6。行列式的输入,矩阵的输入(一般化的矩阵,增广矩阵,括号形式的矩阵,有元素省略的矩阵)
    SpringCloud Stream @EnableBinding注解过时
    Jetpack Compose 教程
    供应商管理流程涉及哪些内容?使用SRM供应商软件助力企业打造智慧采购新引擎
    java后端pageHelper分页实现方法
    Redis02-持久化策略
    【面试题】LockSupport
    第二十一章《万年历》第1节:万年历项目简介
    Mysql中索引详解
    python08_函数练习
  • 原文地址:https://blog.csdn.net/qq_42779423/article/details/127012433