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)。
对于 ftrace 调试,建议将核心跟踪功能编译进内核(Y),而不是模块。

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 配置在其中的位置:

内核编译与 ftrace 配置流程 阶段 1 安装工具链 阶段 2 下载内核源码 阶段 3 menuconfig 配置 阶段 4 make -j$(nproc) 阶段 5 make modules_install 阶段 6 make install ftrace 关键配置项(在阶段 3 中完成) • Kernel hacking → Tracers → Kernel Function Tracer [*] • Kernel hacking → Tracers → Kernel Function Graph Tracer [*] • Kernel hacking → Tracers → Trace syscalls [*] • Kernel hacking → Tracers → Enable trace events [*] • General setup → BPF system call [*] 提示:使用 / 键搜索 FUNCTION_TRACER 可快速定位选项

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 所需的跟踪选项。