type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM

0 运行环境配置

运行环境相关的配置、大家可以参考我这一篇文章
BPF 学习系列之 - BPF 实验环境配置 | 糖醋鱼的小破站
此系列的学习是跟随下面的这个学习手册进行的,同时相关的实验开发环境也是下面的项目提供的,想了解相关信息的话请参阅下面的链接: Vagrant 的安装,可以参考下方给出的官方安装指导手册。 Vagrant 安装完成后,需要克隆实验项目到本地,然后根据项目中 Vagrantfile 文件中的定义完成实验环境的自动化配置。 注意!因为项目所使用的虚拟机镜像是 2019 年发布的,因时间过于久远,官方将相关的下载链接从 Vagrant 中移除了,将其进行了归档处理,所以大家在直接启动实验环境的时候会出现无法找到镜像的报错。 在这里给出一个实验项目中使用到的虚拟机镜像的下载链接: 将原来定义的 fedora.vm.box = "fedora/30-cloud-base" 修改为下载下来的 box 文件的绝对地址 注释掉 fedora.vm.box_version 这个 Vagrant 命令,将在 Virtualbox 中启动一个 Fedora 30 虚拟机,你可以使用 SSH 进入机器(在当前终端中登陆 SSH): 当然也可以使用其它的 SSH 工具进行远程连接,运行下面的命令查看虚拟机的 SSH 配置,默认虚拟机是使用公私钥进行身份认证的。 下面显示出了 SSH 的连接地址与监听端口信息( HostName、 Port),同时也给出了用户名与身份认证文件所在的详细位置( User、 IdentityFile )。 在继续之前,请确保您下载了此存储库中所使用的内核源代码树。某些示例需要使用它作为依赖项。我们将下载内核 5.0.9 的代码--我们在这里避免使用 git 克隆,因为内核的 Git 历史非常长。 在正式开始进行实验之前,在环境中拥有此存储库的副本会很有用。 重要说明:项目中的例子都假设你已经在主文件夹 ~/linux-observability-with-bpf 中克隆了 repo,如果您没有这样做,请记住你所做的更改! 是的,在这时你已经拥有了一切并且可以按照示例代码进行操作了。
BPF 学习系列之 - BPF 实验环境配置 | 糖醋鱼的小破站

1 Hello world 程序分析

1.1 文件结构

整个 Hello world 例程包含以下三个文件,其中 bpf_program.c 是与 bpf 程序相关的文件,loader.c 用来加载上面编写的 bpf 程序, Makefile 用来快速构建。下面我们就把各个文件中的内容展示出来、对各个文件都进行分析了解一下。

1.2 bpf_program.c

这是一个很简单的 BPF hello world 程序,但是却包含着 BPF 运行所需的必要条件。
  1. SEC 属性
    1. 我们使用 SEC 属性告知 BPF 虚拟 机何时运行此程序。在本例中,当检测到 execve 系统调用跟踪点被执行时, BPF 程序将运行 。
  1. 跟踪点
    1. 跟踪点是内核二进制代码中的静态标记,允许开发人员 注入代码来检查内核的执行。这里,只需知道 execve 是执行其他程序的指令。当内核检测到 execve 执行时, BPF 程序被执行,我们会看到消息输出 Hello,BPF World !
  1. 程序许可证
    1. 在示例的最后,指定了程序许可证。因为 Linux 内核采用 GPL 许可证,所以它只能加载 GPL 许可证的程序。如果将程序设置为其他许可证,内核将拒绝加载该程序。

1.3 loader.c

这个文件是用来将编译完成的 BPF 程序加载至内核中运行的,使用内核提供的 load_bpf_file 辅助函数,它将获取一个二进制文件将它加载到内核中,对编译和加载的程序按模板抽象进行处理。

1.4 Makefile

程序编译脚本,解放双手。
如果上面的 Makefile 看不明白的话、可以看看下面的这个 Makefile 文档。

2 运行测试

好的、上面我们已经把 Hello world 例程里面涉及到的所有代码已经分析完毕,接下来我们就应该开始实际的测试,看一下这个代码最终运行起来的效果如何。

2.1 编译代码

  1. 清理工作空间
  1. 运行编译命令
可以看到编译完成的时候、生成了 bpf_program.omonitor-exec 这两个文件、其中 .o 文件就是编译后的 BPF 二进制文件,而 monitor-exec 则是 BPF 代码加载程序。

2.2 运行测试

执行 sudo ./monitor-exec 命令将 BPF 程序加载至内核中去,这个时候再开启一个终端执行其它命令、查看程序的工作状态。
💡
如果你不使用 sudo 运行该程序,将会返回错误信息,因为对于大多数 BPF 程序而言,只能由 root 特权用户加载到内核中。
可以看到每次我们运行一个命令、程序都会给我们打印一条语句与期望中的程序运行状态一致。
程序停止后,消息将不在终端上显示。 一 旦程序终止,加载的 BPF 程序将从 BPF 虚拟机中卸载。

3 源代码

BPF 学习系列之 - BPF 实验环境配置高级 PDF 目录编辑工具 - pdf.tocgen