本書介紹了eBPF核心技術(shù)及其應(yīng)用。全書可分為eBPF基礎(chǔ)知識(shí)、進(jìn)階應(yīng)用和實(shí)際案例三大部分,覆蓋了eBPF的編程接口、架構(gòu)及其在性能分析、安全監(jiān)控和網(wǎng)絡(luò)協(xié)議等方面的應(yīng)用。
第 1 章 eBPF 概述 1
1.1 eBPF 是什么 1
1.2 eBPF 發(fā)展歷史 2
1.3 eBPF 應(yīng)用領(lǐng)域 4
1.4 eBPF 如何運(yùn)行 5
1.5 eBPF 相關(guān)工具與庫(kù) 6
1.5.1 BCC 6
1.5.2 bpftrace 7
1.5.3 libbpf 8
1.6 初識(shí) eBPF 程序 8
1.7 本章小結(jié) 9
第 2 章 eBPF 開發(fā)環(huán)境準(zhǔn)備 10
2.1 Linux 發(fā)行版本的選擇 10
2.2 編程語(yǔ)言的選擇 12
2.3 安裝和配置 Linux 操作系統(tǒng)
環(huán)境 13
2.3.1 Windows 上安裝和配置
Linux 14
2.3.2 macOS 上安裝和配置
Linux 16
2.3.3 其他環(huán)境安裝 17
2.4 以二進(jìn)制方式安裝 eBPF 開發(fā)
工具與庫(kù) 20
2.4.1 安裝 BCC 20
2.4.2 安裝 bpftrace 21
2.4.3 安裝 libbpf 21
2.5 以源碼方式安裝 eBPF 開發(fā)
工具與庫(kù) 22
2.5.1 編譯安裝 BCC 22
2.5.2 編譯安裝 bpftrace 23
2.5.3 編譯安裝 libbpf 24
2.6 本章小結(jié) 24
第 3 章 Linux 動(dòng)態(tài)追蹤技術(shù) 25
3.1 Linux 動(dòng)態(tài)追蹤系統(tǒng) 25
3.2 前端工具和庫(kù) 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 數(shù)據(jù)采集機(jī)制 35
3.3.1 ptrace 系統(tǒng)調(diào)用 36
3.3.2 perf_event_open 系統(tǒng)
調(diào)用 36
3.3.3 BPF 系統(tǒng)調(diào)用 37
3.3.4 其他子系統(tǒng)與內(nèi)核
模塊 37
3.4 跟蹤文件系統(tǒng) 37
3.4.1 掛載位置 38
3.4.2 目錄詳情 38
3.4.3 跟蹤器 43
3.4.4 跟蹤選項(xiàng) 44
3.4.5 環(huán)形緩沖區(qū) 47
3.5 Linux 內(nèi)核數(shù)據(jù)源 48
3.5.1 ftrace 49
3.5.2 kprobe/kretprobe 70
目錄
- 2 -
3.5.3 uprobe/uretprobe 74
3.5.4 tracepoint 77
3.6 eBPF 數(shù)據(jù)采集點(diǎn) 83
3.7 本章小結(jié) 84
第 4 章 eBPF 程序入門 85
4.1 第 一個(gè) eBPF 程序 85
4.1.1 第 一個(gè) BCC 程序 85
4.1.2 第 一個(gè) C 語(yǔ)言版本的
eBPF 程序 86
4.2 eBPF 程序功能解讀 91
4.2.1 加載 eBPF 字節(jié)碼 92
4.2.2 BPF 系統(tǒng)調(diào)用 93
4.2.3 attach_kprobe 96
4.2.4 perf_event_open 系統(tǒng)
調(diào)用 96
4.3 eBPF 授權(quán)協(xié)議 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 驗(yàn)證機(jī)制 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 編譯內(nèi)核態(tài)程序 135
4.7.3 編譯生成 skel 頭文件 136
4.7.4 編譯用戶態(tài)程序 141
4.8 本章小結(jié) 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 開發(fā) eBPF 程序 152
5.3.1 BPF API 152
5.3.2 opensnoop 程序解讀 157
5.4 使用 libbcc 開發(fā) eBPF 程序 165
5.4.1 libbcc 的編譯與安裝 166
5.4.2 重寫 eBPF 程序 167
5.4.3 編譯與測(cè)試 175
5.5 本章小結(jié) 181
第 6 章 bpftrace 182
6.1 bpftrace 的功能和特性 182
6.1.1 工程結(jié)構(gòu) 182
6.1.2 探針類型 184
6.1.3 特性 185
6.1.4 主程序 185
6.2 bpftrace 的腳本語(yǔ)法 191
6.3 探針類型 198
6.3.1 kprobe 和 kretprobe 198
6.3.2 uprobe 和 uretprobe 200
6.3.3 跟蹤點(diǎn) 202
6.3.4 USDT 204
6.3.5 定時(shí)器事件 208
6.3.6 軟件與硬件事件 209
6.3.7 內(nèi)存監(jiān)視點(diǎn) 211
6.3.8 kfunc 和 kretfunc 214
6.3.9 迭代器 215
6.3.10 開始?jí)K與結(jié)束塊 217
目錄
- 3 -
6.4 bpftrace 變量 217
6.4.1 內(nèi)置變量 217
6.4.2 基礎(chǔ)變量 218
6.4.3 關(guān)聯(lián)數(shù)組 221
6.5 bpftrace 函數(shù) 221
6.5.1 基礎(chǔ)函數(shù) 221
6.5.2 映射表相關(guān)函數(shù) 225
6.6 bpftrace 的工作原理 226
6.7 bpftrace 工具集 231
6.8 本章小結(jié) 236
第 7 章 使用 Golang 開發(fā) eBPF 程序 238
7.1 Go 語(yǔ)言開發(fā)環(huán)境介紹 238
7.2 使用 libbpfgo 開發(fā) eBPF
程序 239
7.2.1 搭建 libbpfgo 開發(fā)
環(huán)境 239
7.2.2 開發(fā) eBPF 程序 241
7.3 Cilium 與 ebpf-go 244
7.3.1 搭建 ebpf-go 開發(fā)
環(huán)境 244
7.3.2 使用 ebpf-go 開發(fā) eBPF
程序 245
7.3.3 bpf2go 和 bpftool 249
7.4 本章小結(jié) 255
第 8 章 BTF 與 CO-RE 256
8.1 什么是 CO-RE 257
8.2 BTF 詳解 258
8.2.1 BTF 數(shù)據(jù)結(jié)構(gòu) 258
8.2.2 BTF 內(nèi)核 API 261
8.2.3 生成 BTF 信息 262
8.2.4 二進(jìn)制中的 BTF 264
8.2.5 BTF 相關(guān)輔助函數(shù) 265
8.3 對(duì) BTF 的處理 266
8.3.1 編譯器對(duì) BTF 的處理 266
8.3.2 libbpf 對(duì) BTF 的處理 268
8.4 讀取內(nèi)核結(jié)構(gòu)體字段 269
8.4.1 案例一:直接訪問(wèn)
結(jié)構(gòu)體 269
8.4.2 案例二:使用 bpf_get_
current_task_btf 270
8.4.3 案例三:使用 BPF_
CORE_READ 271
8.4.4 BTF 相關(guān)的其他宏 273
8.5 低版本系統(tǒng)如何支持 BTF 274
8.5.1 什么是 BTFHub 275
8.5.2 生成最小化的 BTF
信息 279
8.5.3 編譯運(yùn)行 BTF-App 280
8.6 本章小結(jié) 285
第 9 章 eBPF 程序的數(shù)據(jù)交換 286
9.1 eBPF 程序的數(shù)據(jù)結(jié)構(gòu) 286
9.1.1 什么是 eBPF map 286
9.1.2 map 支持的數(shù)據(jù)類型 291
9.2 map 操作接口 294
9.2.1 eBPF map 相關(guān)的 API 294
9.2.2 創(chuàng)建 map 299
9.2.3 添加數(shù)據(jù) 300
9.2.4 查詢 301
9.2.5 遍歷數(shù)據(jù) 301
9.2.6 刪除數(shù)據(jù) 302
9.2.7 使用 bpftool 操作 map 302
9.3 map 在內(nèi)核中的實(shí)現(xiàn) 306
9.3.1 創(chuàng)建 map 對(duì)象 307
9.3.2 map 對(duì)象的生命周期 314
9.3.3 eBPF 對(duì)象持久化 315
9.4 ftrace 的 eBPF 數(shù)據(jù)交換接口 317
9.4.1 bpf_trace_printk 317
9.4.2 封裝的 bpf_printk 宏 320
9.4.3 trace 日志的輸出格式 321
目錄
- 4 -
9.5 perf 事件 322
9.5.1 perf 事件的 map 類型 323
9.5.2 內(nèi)核態(tài)程序?qū)懭?perf
事件 324
9.5.3 用戶態(tài)程序讀取 perf
事件 327
9.5.4 BCC 中 perf 事件處理 330
9.6 環(huán)形緩沖區(qū) 333
9.6.1 eBPF ringbuf 的 map
類型 334
9.6.2 內(nèi)核態(tài)程序如何使用
ringbuf 335
9.6.3 用戶態(tài)程序如何使用
ringbuf 344
9.6.4 完整的數(shù)據(jù)交換實(shí)例 346
9.7 本章小結(jié) 351
第 10 章 eBPF 程序類型與掛載點(diǎn) 353
10.1 常見(jiàn)的 eBPF 程序類型 353
10.1.1 跟蹤和分析類 355
10.1.2 網(wǎng)絡(luò)類 356
10.2 eBPF 程序掛載點(diǎn) 357
10.3 函數(shù)跟蹤技術(shù) 358
10.3.1 內(nèi)核態(tài)程序跟蹤 358
10.3.2 用戶態(tài)程序跟蹤 360
10.4 kprobe 361
10.4.1 內(nèi)核中使用 kprobe
探針 361
10.4.2 kretprobe 365
10.4.3 eBPF 中創(chuàng)建 kprobe
跟蹤 368
10.5 uprobe 372
10.5.1 創(chuàng)建單行程序測(cè)試
uprobe 372
10.5.2 eBPF 中創(chuàng)建 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 本章小結(jié) 387
第 11 章 eBPF 內(nèi)核輔助方法 388
11.1 如何查閱內(nèi)核輔助方法 388
11.2 輔助方法的實(shí)現(xiàn)原理 389
11.3 eBPF 內(nèi)核輔助方法分類 392
11.3.1 網(wǎng)絡(luò)相關(guān)的輔助
方法 392
11.3.2 數(shù)據(jù)處理類輔助
方法 396
11.3.3 跟蹤相關(guān)的輔助
方法 398
11.3.4 系統(tǒng)功能性輔助
方法 399
11.4 常用的 eBPF 內(nèi)核輔助方法 401
11.5 本章小結(jié) 404
第 12 章 Linux 性能分析 405
12.1 CPU 406
12.1.1 CPU 基礎(chǔ)知識(shí) 406
12.1.2 傳統(tǒng) CPU 分析工具 409
12.1.3 eBPF 相關(guān)分析工具 412
12.1.4 CPU 分析策略 413
12.2 內(nèi)存 414
12.2.1 內(nèi)存基礎(chǔ)知識(shí) 414
12.2.2 傳統(tǒng)內(nèi)存分析工具 419
12.2.3 eBPF 內(nèi)存分析工具 419
12.2.4 內(nèi)存分析方法 420
12.3 磁盤 I/O 420
12.3.1 磁盤 I/O 基礎(chǔ)知識(shí) 420
目錄
- 5 -
12.3.2 傳統(tǒng)分析工具 423
12.3.3 BCC 中的分析工具 423
12.3.4 磁盤性能分析方法 423
12.4 網(wǎng)絡(luò) 424
12.4.1 網(wǎng)絡(luò)基礎(chǔ)知識(shí) 424
12.4.2 傳統(tǒng)網(wǎng)絡(luò)分析工具 426
12.4.3 eBPF 網(wǎng)絡(luò)分析
工具 426
12.5 常用分析方法和案例 427
12.6 本章小結(jié) 428
第 13 章 eBPF 實(shí)戰(zhàn)應(yīng)用 429
13.1 在網(wǎng)絡(luò)安全中的應(yīng)用 429
13.2 在軟件動(dòng)態(tài)分析中的應(yīng)用 432
13.3 在安全環(huán)境增強(qiáng)中的應(yīng)用 439
13.4 在網(wǎng)絡(luò)數(shù)據(jù)處理中的應(yīng)用 443
13.5 在系統(tǒng)與云原生安全中的
應(yīng)用 446
13.6 本章小結(jié) 448