2. 内核编译环境搭建:安装编译工具链与下载配置内核源码
搭建一个可靠的内核编译环境是进行 ftrace 调试的前提。本章节将引导你完成从安装基础工具链、下载内核源码到使用 menuconfig 进行内核选项配置的完整流程。每一步都经过验证,确保你能够顺利编译出一个支持 ftrace 的内核镜像。
2.1 安装编译工具链
内核编译依赖于一系列 GNU 工具和库。以下是在 Ubuntu/Debian 系发行版上安装完整工具链的命令。请使用 sudo 权限执行。
sudo apt-get update
sudo apt-get install -y \
gcc \
make \
flex \
bison \
libncurses-dev \
libssl-dev \
libelf-dev \
bc \
dwarves \
git \
wget \
xz-utils
工具链说明:
- gcc / make:核心编译器和构建工具。
- flex / bison:词法分析和语法分析器,用于解析内核配置文件和设备树。
- libncurses-dev:提供
menuconfig所需的文本图形界面库。 - libssl-dev / libelf-dev:编译内核模块和签名功能所需。
- bc:内核构建脚本中使用的计算器语言。
- dwarves:提供
pahole工具,用于 BTF(BPF Type Format)生成,ftrace 和 BPF 调试强烈依赖此工具。
2.1.1 验证工具链版本
安装完成后,建议验证关键工具的版本,确保兼容性。以下是一个快速验证脚本:
echo "=== Toolchain Versions ==="
gcc --version | head -n 1
make --version | head -n 1
flex --version | head -n 1
bison --version | head -n 1
pahole --version 2>/dev/null || echo "pahole not found, BTF may be disabled"
版本兼容性建议: 推荐使用 GCC 10.x 或更高版本,Make 4.3+,Flex 2.6+,Bison 3.7+。对于 Linux 6.x 内核,GCC 12.x 是首选。
2.2 下载内核源码
内核源码可以从 kernel.org 获取,也可以使用 Git 克隆主线仓库。推荐使用 Git 方式,便于后续切换分支和打补丁。
2.2.1 方法一:从 kernel.org 下载稳定版 tarball
# 下载 Linux 6.6 LTS 版本(推荐用于 ftrace 学习)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.8.tar.xz
# 解压
tar -xf linux-6.6.8.tar.xz
cd linux-6.6.8
2.2.2 方法二:使用 Git 克隆主线仓库
# 克隆 Linus Torvalds 的主线仓库(体积较大,约 3GB)
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# 查看当前版本
make kernelversion
磁盘空间提示: 完整的内核源码树加上编译产物,通常需要 10-20GB 的磁盘空间。请确保工作分区有足够的剩余空间。
2.3 配置内核选项:make menuconfig
make menuconfig 是基于 ncurses 的文本图形化配置界面,是内核配置中最常用、最直观的方式。它允许你逐层浏览和修改内核功能选项。
2.3.1 启动 menuconfig
在内核源码根目录下执行:
make menuconfig
你将看到一个蓝底灰字的层级菜单界面。使用方向键导航,Enter 进入子菜单,Space 或 Y/N/M 切换选项状态。
选项状态含义:
- [ ]:该功能被禁用(N)。
- [*]:该功能被编译进内核(Y)。
- [M]:该功能被编译为可加载模块(M)。
2.3.2 为 ftrace 配置关键选项
ftrace 依赖于内核的跟踪基础设施。以下是在 menuconfig 中必须启用的选项路径:
| 菜单路径 | 选项名称 | 推荐状态 | 说明 |
|---|---|---|---|
| Kernel hacking → Tracers | Kernel Function Tracer | [*] | 启用函数级跟踪,ftrace 核心功能 |
| Kernel hacking → Tracers | Kernel Function Graph Tracer | [*] | 启用函数调用图跟踪,显示调用层级 |
| Kernel hacking → Tracers | Trace syscalls | [*] | 跟踪系统调用入口和退出 |
| Kernel hacking → Tracers | Enable trace events | [*] | 启用静态 tracepoint 事件 |
| Kernel hacking → Tracers | Stack tracer | [*] | 跟踪内核栈使用情况 |
| General setup | BPF system call | [*] | BPF 系统调用,增强 ftrace 能力 |
| General setup | Enable bpf() system call | [*] | 同上,确保 BPF 可用 |
快速配置技巧: 在
menuconfig 界面中按 / 键可以搜索选项名称。例如输入 FUNCTION_TRACER 可以直接定位到函数跟踪器选项,无需逐层浏览。
2.3.3 保存配置并生成 .config 文件
完成配置后,选择 Save 并退出。配置会被写入源码根目录下的 .config 文件。你也可以使用以下命令直接基于默认配置修改:
# 使用 x86_64 默认配置作为起点
make defconfig
# 然后通过 menuconfig 进行微调
make menuconfig
2.4 内核编译流程与关键步骤 SVG 图
下图展示了从工具链安装到内核镜像生成的完整编译流程,以及 ftrace 配置在其中的位置:
2.5 常见问题与避坑指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
menuconfig 无法启动,报错 ncurses 相关 |
libncurses-dev 未安装或版本不匹配 |
执行 sudo apt-get install libncurses-dev 并确保安装了 pkg-config |
编译时出现 BTF: .tmp_vmlinux.btf: pahole (pahole) is not available |
缺少 dwarves 包,BTF 生成失败 |
安装 sudo apt-get install dwarves,或在 menuconfig 中禁用 BTF(不推荐) |
编译过程中断,提示 No rule to make target 'debian/certs/signing_key.pem' |
内核签名证书缺失 | 在 menuconfig 中搜索 SYSTEM_TRUSTED_KEYS 并清空该选项 |
编译后内核无法启动,卡在 Loading initial ramdisk |
initramfs 未正确生成或内核配置缺少关键驱动 | 确保 CONFIG_BLK_DEV_INITRD 和 CONFIG_DEVTMPFS 已启用 |
重要提醒: 在配置内核时,不要随意禁用你不熟悉的选项。许多看似无关的选项(如
CONFIG_SYSFS、CONFIG_DEBUG_FS)是 ftrace 和调试文件系统的基础依赖。建议在 defconfig 基础上仅添加 ftrace 相关选项,而非从零开始配置。
2.6 本章小结
至此,你已经完成了内核编译环境的搭建:
- 安装了完整的编译工具链(gcc、make、flex、bison、libncurses-dev 等)。
- 通过 tarball 或 Git 获取了内核源码。
- 使用
make menuconfig配置了内核,并特别启用了 ftrace 所需的跟踪选项。