打造轻量级监控系统:基于Ketones的自定义eBPF工具开发教程
打造轻量级监控系统基于Ketones的自定义eBPF工具开发教程【免费下载链接】ketonesA kempt eBPF tool for a new environments项目地址: https://gitcode.com/openeuler/ketones前往项目官网免费下载https://ar.openeuler.org/ar/Ketones是openEuler社区推出的一款轻量级eBPF工具集专为新环境设计能够帮助开发者快速构建高效的系统监控解决方案。本文将带你了解如何使用Ketones开发自定义eBPF工具打造属于你的轻量级监控系统。什么是eBPF和KetoneseBPFExtended Berkeley Packet Filter是一种革命性的技术它允许在 Linux 内核中运行沙箱程序而无需修改内核源码或加载内核模块。这为系统监控、网络分析、安全审计等领域带来了前所未有的灵活性和性能。Ketones作为基于eBPF的工具集提供了丰富的预定义工具和开发框架让开发者能够轻松构建自定义的eBPF应用。它基于libbpf库开发后者是eBPF程序开发的核心库。libbpf库的标志Ketones基于该库构建准备开发环境要开始使用Ketones开发自定义eBPF工具首先需要准备好开发环境。安装依赖Ketones的编译和运行需要一些依赖库和工具。具体的依赖项可以在项目的spec文件中找到ketones.spec获取源代码可以通过以下命令克隆Ketones项目的源代码git clone https://gitcode.com/openeuler/ketones了解Ketones项目结构Ketones项目的结构清晰主要包含以下几个部分bpftool/: 包含bpftool工具的源代码和文档debian/: Debian打包相关文件libbpf/: libbpf库的源代码和文档src/: Ketones工具的源代码包含多个子目录每个子目录对应一个eBPF工具vmlinux/: 不同架构的vmlinux头文件其中src/目录是我们开发自定义工具的主要工作区。每个工具通常包含以下文件*.bpf.c: eBPF程序源代码*.c: 用户空间程序源代码Makefile: 编译规则开发第一个自定义eBPF工具下面我们将以一个简单的例子展示如何使用Ketones开发自定义eBPF工具。创建工具目录首先在src/目录下创建一个新的工具目录例如mytool/mkdir src/mytool cd src/mytool创建eBPF程序创建mytool.bpf.c文件编写eBPF程序#include vmlinux.h #include bpf/bpf_helpers.h #include bpf/bpf_tracing.h #include bpf/bpf_core_read.h // 定义事件结构体 struct event { u32 pid; u32 uid; char comm[16]; }; // 定义环形缓冲区 struct { __uint(type, BPF_MAP_TYPE_RINGBUF); __uint(max_entries, 1 24); } events SEC(.maps); // 定义跟踪点 SEC(tp/sched/sched_process_exec) int BPF_PROG(trace_process_exec, struct task_struct *p, char *filename) { struct event *e; // 分配环形缓冲区空间 e bpf_ringbuf_reserve(events, sizeof(*e), 0); if (!e) return 0; // 填充事件数据 e-pid bpf_get_current_pid_tgid() 32; e-uid bpf_get_current_uid_gid() 32; bpf_get_current_comm(e-comm, sizeof(e-comm)); // 提交事件 bpf_ringbuf_submit(e, 0); return 0; } // 许可声明 char LICENSE[] SEC(license) GPL;创建用户空间程序创建mytool.c文件编写用户空间程序#include stdio.h #include stdlib.h #include signal.h #include bpf/libbpf.h #include mytool.skel.h static volatile bool exiting false; static void sig_handler(int sig) { exiting true; } static int handle_event(void *ctx, void *data, size_t data_sz) { const struct event *e data; printf(PID: %-6d UID: %-6d COMM: %s\n, e-pid, e-uid, e-comm); return 0; } int main(int argc, char **argv) { struct mytool_bpf *skel; int err; // 注册信号处理函数 signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); // 加载并验证eBPF程序 skel mytool_bpf__open_and_load(); if (!skel) { fprintf(stderr, Failed to open and load BPF skeleton\n); return 1; } // 附加跟踪点 err mytool_bpf__attach(skel); if (err) { fprintf(stderr, Failed to attach BPF skeleton: %d\n, err); goto cleanup; } // 设置环形缓冲区回调 err ring_buffer__set__callback(skel-maps.events, handle_event, NULL, NULL); if (err) { fprintf(stderr, Failed to set ring buffer callback: %d\n, err); goto cleanup; } printf(Monitoring process executions... Press CtrlC to exit\n); // 轮询事件 while (!exiting) { err ring_buffer__poll(skel-maps.events, 100 /* timeout, ms */); if (err -EINTR) err 0; if (err 0) { printf(Error polling ring buffer: %d\n, err); break; } } cleanup: // 清理资源 mytool_bpf__destroy(skel); return err 0 ? -err : 0; }创建Makefile创建Makefile文件定义编译规则include ../Makefile.inc APPS mytool mytool-objs : mytool.o mytool-bpfobjs : mytool.bpf.o include ../common.mk编译和运行工具编译工具回到项目根目录执行以下命令编译整个项目make -C src这将编译所有工具包括我们刚刚创建的mytool。运行工具编译完成后可以运行我们的自定义工具sudo src/mytool/mytool工具将开始监控进程执行事件并输出相关信息。深入学习和扩展Ketones提供了丰富的示例工具你可以在src/目录下找到它们例如src/execsnoop/: 监控进程执行src/opensnoop/: 监控文件打开操作src/tcpconnect/: 监控TCP连接通过学习这些示例你可以了解更多eBPF编程技巧和最佳实践进一步扩展你的自定义工具功能。此外项目的文档目录也提供了丰富的学习资源libbpf/docs/总结使用Ketones开发自定义eBPF工具是构建轻量级监控系统的理想选择。它提供了简单易用的开发框架和丰富的示例让开发者能够快速上手eBPF编程。通过本文介绍的步骤你已经掌握了基本的开发流程可以开始构建属于你的eBPF工具了。希望这篇教程对你有所帮助祝你在eBPF的世界中探索愉快 【免费下载链接】ketonesA kempt eBPF tool for a new environments项目地址: https://gitcode.com/openeuler/ketones创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考