eBPF

Ubuntu下bpf纯c程序的编写与运行

由 梁金荣 | 3600字 | 阅读大约需要8分钟 | 归档于eBPF

2020年10月7日

编写纯c的bpf程序主要编写或修改三个文件。第一个是编写bpfname_kern.c文件,这是需要被llvm编译为目标码而注入内核的代码。第二个是编写bpfname_user.c文件,它主要用来将目标码安全的注入内核,并通过bpf的map机制来做数据处理,是和bpfname_kern.c文件成对出现的。第三个就是修改Makefile文件,一般要修改三处,详细文中可见。最后编译生成可执行文件,就可在用户态下安全和高效的提取和处理很多内核数据。

继续阅读

eBPF项目依赖安装及简单介绍

由 陈小龙 | 700字 | 阅读大约需要2分钟 | 归档于eBPF

2020年8月26日

本文主要介绍eBPF的安装clang和llvm的过程,如何编写eBPF的程序、了解eBPF的工作流程和程序的一些基本的数据类型。在安装eBPF的时候遇到的问题及解决办法

继续阅读

使用eBPF&bcc提取内核网络流量信息(二)

由 梁金荣 | 3300字 | 阅读大约需要7分钟 | 归档于eBPF

2020年8月3日

使用eBPF&bcc提取内核网络流量信息(一)已经将流量信息提取出来,本文将通过分析内核源码,扩展此bcc,为其增加源地址、源端口、目的地址、目的端口等字段。

继续阅读

使用bcc提取内核网络流量信息

由 梁金荣 | 2700字 | 阅读大约需要6分钟 | 归档于eBPF

2020年7月28日

本文将分享从0开始编写自己的bcc程序用来提取内核网络流量信息。那么开始编写bcc之前,自己一定要明确,我们要用bcc提取什么数据。本文的实例将会提取的数据关键字段为进程的PID,进程的名字,进程的收包实时流量、发包实时流量,收包流量总和,发包流量总和,总的收发流量等。

继续阅读

kprobes/kretprobes 在bcc程序中的使用

由 梁金荣 | 1300字 | 阅读大约需要3分钟 | 归档于eBPF

2020年6月21日

本文简单介绍了kprobes和kretprobes机制,以获取系统中的 TCP IPv4 连接信息的bcc代码为例,介绍了kprobes/kretprobes 在 bcc 程序中的使用,并给出了运行结果和分析。

继续阅读

eBPF内核探测中将任意系统调用转换成事件

由 梁金荣 | 1900字 | 阅读大约需要4分钟 | 归档于eBPF

2020年6月7日

Linux 4.4 以上内核基于 eBPF 可以将任何内核函数调用转换成可带任何数据的用户空间事件。程序采集系统相关参数时,通常有两种方式。一种是程序主动去轮询,检查系统变化,即 poll 模型;另一种是系统主动通知程序,即 push 模型。使用 poll 模型还是 push 模型取决于具体的问题。通常情况下,如果事件频率相对于事件处理时间来说比较低,那 push 模型比较合适;如果事件频率很高,就采用 pull 模型。例如,通常的网络驱动会等待网卡事件,而 dpdk 这样的框架会主动 poll 网卡, 以获得最高的吞吐性能和最低的延迟。理想情况下,我们需要一个通用的方式处理事件,具体做法请看此篇。

继续阅读

eBPF学习——获取内核网络中的socket信息

由 梁金荣 | 1400字 | 阅读大约需要3分钟 | 归档于eBPF

2020年5月31日

本文将使用 bcc工具抓取内核网络中的数据,包括抓取 backlog 信息、port 和 IP 信息、网络命名空间信息等。bcc 是基于 LLVM 的工具集,用 Python 封装了底层机器相关的细节,bcc工具使得 eBPF 的使用更加方便,使用时内核探测代码用 C 写, 数据处理用 Python 。

继续阅读

eBPF学习——eBPF简介、安装和简单示例

由 梁金荣 | 2300字 | 阅读大约需要5分钟 | 归档于eBPF

2020年5月30日

本文将简单介绍eBPF,并分享安装过程和bcc程序实例。eBPF是将原先的BPF发展成一个指令集更复杂、应用范围更广的“内核虚拟机”。eBPF支持在用户态将C语言编写的一小段“内核代码”注入到内核中运行,注入时要先用llvm编译得到使用BPF指令集的elf文件,然后从elf文件中解析出可以注入内核的部分,最后用 bpf_load_program 方法完成注入。

继续阅读