eBPF开发指南从原理到应用

978-7-115-64360-5
作者: 丰生强李泊冰
译者:
编辑: 佘洁

图书目录:

第 1 章 eBPF 概述    1

1.1 eBPF 是什么    1

1.2 eBPF 发展历史    2

1.3 eBPF 应用领域    4

1.4 eBPF 如何运行    5

1.5 eBPF 相关工具与库    6

1.5.1 BCC     6

1.5.2 bpftrace    7

1.5.3 libbpf    8

1.6 初识 eBPF 程序     8

1.7 本章小结     9

第 2 章 eBPF 开发环境准备    10

2.1 Linux 发行版本的选择    10

2.2 编程语言的选择    12

2.3 安装和配置 Linux 操作系统环境    13

2.3.1 Windows 上安装和配置Linux     14

2.3.2 macOS 上安装和配置Linux     16

2.3.3 其他环境安装     17

2.4 以二进制方式安装 eBPF 开发工具与库     20

2.4.1 安装 BCC    20

2.4.2 安装 bpftrace    21

2.4.3 安装 libbpf     21

2.5 以源码方式安装 eBPF 开发工具与库     22

2.5.1 编译安装 BCC    22

2.5.2 编译安装 bpftrace    23

2.5.3 编译安装 libbpf    24

2.6 本章小结    24

第 3 章 Linux 动态追踪技术    25

3.1 Linux 动态追踪系统    25

3.2 前端工具和库    26

3.2.1 strace 与 ltrace     26

3.2.2 DTrace    29

3.2.3 SystemTap    30

3.2.4 LTTng     30

3.2.5 trace-cmd     31

3.2.6 perf    31

3.3 数据采集机制    35

3.3.1 ptrace 系统调用    36

3.3.2 perf_event_open 系统调用    36

3.3.3 BPF 系统调用     37

3.3.4 其他子系统与内核模块    37

3.4 跟踪文件系统    37

3.4.1 挂载位置     38

3.4.2 目录详情     38

3.4.3 跟踪器    43

3.4.4 跟踪选项     44

3.4.5 环形缓冲区    47

3.5 Linux 内核数据源     48

3.5.1 ftrace    49

3.5.2 kprobe/kretprobe     70

3.5.3 uprobe/uretprobe     74

3.5.4 tracepoint     77

3.6 eBPF 数据采集点     83

3.7 本章小结     84

第 4 章 eBPF 程序入门     85

4.1 第 一个 eBPF 程序     85

4.1.1 第 一个 BCC 程序    85

4.1.2 第 一个 C 语言版本的eBPF 程序    86

4.2 eBPF 程序功能解读    91

4.2.1 加载 eBPF 字节码     92

4.2.2 BPF 系统调用     93

4.2.3 attach_kprobe    96

4.2.4 perf_event_open 系统调用    96

4.3 eBPF 授权协议    102

4.4 eBPF 指令集    103

4.4.1 eBPF 寄存器     103

4.4.2 eBPF 指令编码     104

4.4.3 指令列表    105

4.4.4 eBPF 指令分析     109

4.4.5 BCC 中 eBPF 程序指令的生成     110

4.4.6 eBPF 指令反汇编    112

4.4.7 eBPF 验证机制     117

4.5 libbpf     126

4.5.1 libbpf 功能     126

4.5.2 libbpf 接口     127

4.6 libbpf 案例程序    128

4.7 重写 eBPF 程序    131

4.7.1 如何编译    132

4.7.2 编译内核态程序    135

4.7.3 编译生成 skel 头文件      136

4.7.4 编译用户态程序    141

4.8 本章小结    143

第 5 章 BCC     144

5.1 BCC 工具集     145

5.1.1 tools 工具集    146

5.1.2 libbpf-tools 工具集      146

5.2 BCC 常用的工具     147

5.2.1 opensnoop     147

5.2.2 exitsnoop    149

5.2.3 execsnoop     150

5.3 使用 Python 开发 eBPF 程序     152

5.3.1 BPF API     152

5.3.2 opensnoop 程序解读    157

5.4 使用 libbcc 开发 eBPF 程序    165

5.4.1 libbcc 的编译与安装    166

5.4.2 重写 eBPF 程序      167

5.4.3 编译与测试    175

5.5 本章小结     181

第 6 章 bpftrace    182

6.1 bpftrace 的功能和特性     182

6.1.1 工程结构    182

6.1.2 探针类型    184

6.1.3 特性     185

6.1.4 主程序     185

6.2 bpftrace 的脚本语法     191

6.3 探针类型     198

6.3.1 kprobe 和 kretprobe      198

6.3.2 uprobe 和 uretprobe      200

6.3.3 跟踪点     202

6.3.4 USDT    204

6.3.5 定时器事件    208

6.3.6 软件与硬件事件    209

6.3.7 内存监视点    211

6.3.8 kfunc 和 kretfunc    214

6.3.9 迭代器     215

6.3.10 开始块与结束块    217

6.4 bpftrace 变量    217

6.4.1 内置变量    217

6.4.2 基础变量    218

6.4.3 关联数组    221

6.5 bpftrace 函数    221

6.5.1 基础函数    221

6.5.2 映射表相关函数    225

6.6 bpftrace 的工作原理    226

6.7 bpftrace 工具集    231

6.8 本章小结    236

第 7 章 使用 Golang 开发 eBPF 程序      238

7.1 Go 语言开发环境介绍     238

7.2 使用 libbpfgo 开发 eBPF程序    239

7.2.1 搭建 libbpfgo 开发环境     239

7.2.2 开发 eBPF 程序      241

7.3 Cilium 与 ebpf-go    244

7.3.1 搭建 ebpf-go 开发环境     244

7.3.2 使用 ebpf-go 开发 eBPF 程序     245

7.3.3 bpf2go 和 bpftool     249

7.4 本章小结    255

第 8 章 BTF 与 CO-RE    256

8.1 什么是 CO-RE     257

8.2 BTF 详解    258

8.2.1 BTF 数据结构    258

8.2.2 BTF 内核 API     261

8.2.3 生成 BTF 信息     262

8.2.4 二进制中的 BTF     264

8.2.5 BTF 相关辅助函数     265

8.3 对 BTF 的处理     266

8.3.1 编译器对 BTF 的处理     266

8.3.2 libbpf 对 BTF 的处理     268

8.4 读取内核结构体字段     269

8.4.1 案例一:直接访问结构体     269

8.4.2 案例二:使用 bpf_get_ current_task_btf     270

8.4.3 案例三:使用 BPF_CORE_READ     271

8.4.4 BTF 相关的其他宏      273

8.5 低版本系统如何支持 BTF     274

8.5.1 什么是 BTFHub      275

8.5.2 生成最小化的 BTF 信息     279

8.5.3 编译运行 BTF-App     280

8.6 本章小结     285

第 9 章 eBPF 程序的数据交换     286

9.1 eBPF 程序的数据结构     286

9.1.1 什么是 eBPF map    286

9.1.2 map 支持的数据类型     291

9.2 map 操作接口     294

9.2.1 eBPF map 相关的 API      294

9.2.2 创建 map    299

9.2.3 添加数据    300

9.2.4 查询     301

9.2.5 遍历数据    301

9.2.6 删除数据    302

9.2.7 使用 bpftool 操作 map      302

9.3 map 在内核中的实现     306

9.3.1 创建 map 对象    307

9.3.2 map 对象的生命周期     314

9.3.3 eBPF 对象持久化    315

9.4 ftrace 的 eBPF 数据交换接口      317

9.4.1 bpf_trace_printk      317

9.4.2 封装的 bpf_printk 宏    320

9.4.3 trace 日志的输出格式      321

9.5 perf 事件     322

9.5.1 perf 事件的 map 类型      323

9.5.2 内核态程序写入 perf 事件     324

9.5.3 用户态程序读取 perf 事件     327

9.5.4 BCC 中 perf 事件处理     330

9.6 环形缓冲区     333

9.6.1 eBPF ringbuf 的 map 类型     334

9.6.2 内核态程序如何使用ringbuf     335

9.6.3 用户态程序如何使用ringbuf     344

9.6.4 完整的数据交换实例     346

9.7 本章小结    351

第 10 章 eBPF 程序类型与挂载点      353

10.1 常见的 eBPF 程序类型     353

10.1.1 跟踪和分析类     355

10.1.2 网络类     356

10.2 eBPF 程序挂载点    357

10.3 函数跟踪技术    358

10.3.1 内核态程序跟踪     358

10.3.2 用户态程序跟踪     360

10.4 kprobe    361

10.4.1 内核中使用 kprobe 探针    361

10.4.2 kretprobe    365

10.4.3 eBPF 中创建 kprobe 跟踪    368

10.5 uprobe    372

10.5.1 创建单行程序测试uprobe    372

10.5.2 eBPF 中创建 uprobe 跟踪    373

10.5.3 bashreadline 程序     377

10.6 USDT     379

10.6.1 在 BCC 中使用USDT    379

10.6.2 在 libbpf 中使用USDT    384

10.7 本章小结    387

第 11 章 eBPF 内核辅助方法     388

11.1 如何查阅内核辅助方法    388

11.2 辅助方法的实现原理     389

11.3 eBPF 内核辅助方法分类      392

11.3.1 网络相关的辅助方法     392

11.3.2 数据处理类辅助方法     396

11.3.3 跟踪相关的辅助方法     398

11.3.4 系统功能性辅助方法     399

11.4 常用的 eBPF 内核辅助方法      401

11.5 本章小结    404

第 12 章 Linux 性能分析     405

12.1 CPU     406

12.1.1 CPU 基础知识     406

12.1.2 传统 CPU 分析工具      409

12.1.3 eBPF 相关分析工具      412

12.1.4 CPU 分析策略     413

12.2 内存     414

12.2.1 内存基础知识    414

12.2.2 传统内存分析工具     419

12.2.3 eBPF 内存分析工具      419

12.2.4 内存分析方法    420

12.3 磁盘 I/O    420

12.3.1 磁盘 I/O 基础知识     420

12.3.2 传统分析工具     423

12.3.3 BCC 中的分析工具     423

12.3.4 磁盘性能分析方法      423

12.4 网络     424

12.4.1 网络基础知识     424

12.4.2 传统网络分析工具      426

12.4.3 eBPF 网络分析工具    426

12.5 常用分析方法和案例      427

12.6 本章小结    428

第 13 章 eBPF 实战应用    429

13.1 在网络安全中的应用     429

13.2 在软件动态分析中的应用    432

13.3 在安全环境增强中的应用    439

13.4 在网络数据处理中的应用    443

13.5 在系统与云原生安全中的应用   446

13.6 本章小结    448

详情

本书详细介绍了 eBPF 核心技术及其应用。全书可分为 eBPF 基础知识、进阶应用和实际案例三大部分,覆盖了 eBPF 的编程接口、架构及其在性能分析、安全监控和网络协议等方面的应用。读者将通过 C、Go 和Python 等语言学习 eBPF 编程,并掌握其在系统监控、数据分析和性能提升方面的实际技巧。 本书适合不同层次的读者,包括对操作系统或应用程序监控感兴趣的学生和初学者、希望利用 eBPF 进行内核代码调试和优化的 Linux 内核开发人员、使用 eBPF 监控系统事件和分析恶意软件的安全工程师和逆向工程师、通过 eBPF 收集性能数据以优化软件和系统性能的性能分析师和应用程序开发者,以及希望优化虚拟化软件性能和管理的虚拟化开发人员。

图书摘要

相关图书

Linux常用命令自学手册
Linux常用命令自学手册
操作系统基础与实践——基于openEuler平台
操作系统基础与实践——基于openEuler平台
Linux后端开发工程实践
Linux后端开发工程实践
庖丁解牛Linux操作系统分析
庖丁解牛Linux操作系统分析
轻松学Linux:从Manjaro到Arch Linux
轻松学Linux:从Manjaro到Arch Linux
Linux高性能网络详解:从DPDK、RDMA到XDP
Linux高性能网络详解:从DPDK、RDMA到XDP

相关文章

相关课程