3. ftrace 环境准备:内核配置选项与 tracefs 挂载

在开始使用 ftrace 之前,必须确保内核在编译时开启了必要的配置选项,并且 tracefs 文件系统已正确挂载。本章将系统性地介绍如何检查与配置 ftrace 运行环境,包括内核配置项、文件系统挂载方法以及快速验证当前系统是否支持 ftrace。

3.1 内核配置选项(CONFIG_FTRACE 等)

ftrace 依赖于内核编译时的一组配置宏。以下表格列出了核心配置选项及其作用:

配置宏 说明 推荐值
CONFIG_FTRACE ftrace 主开关,必须开启 y
CONFIG_FUNCTION_TRACER 启用函数跟踪(function tracer) y
CONFIG_FUNCTION_GRAPH_TRACER 启用函数调用图跟踪(function_graph tracer) y
CONFIG_STACKTRACE 支持堆栈回溯,用于 stack tracer y
CONFIG_DYNAMIC_FTRACE 动态 ftrace,允许运行时修改跟踪点,减少性能开销 y
CONFIG_FTRACE_SYSCALLS 跟踪系统调用入口和退出 y
CONFIG_HIST_TRIGGERS 启用触发器和直方图功能 y
CONFIG_TRACING_EVENTS 跟踪事件框架,tracepoint 的基础 y
检查当前内核配置: 使用 zcat /proc/config.gz | grep CONFIG_FTRACE 或 grep CONFIG_FTRACE /boot/config-$(uname -r) 快速查看当前内核是否已开启 ftrace 相关选项。

3.2 挂载 tracefs 文件系统

ftrace 通过 tracefs 虚拟文件系统与用户空间交互。默认挂载点为 /sys/kernel/tracing。如果该目录为空或不存在,则需要手动挂载。

挂载步骤:

  1. 检查是否已挂载:mount | grep tracefs
  2. 若未挂载,执行:sudo mount -t tracefs tracefs /sys/kernel/tracing
  3. 如需开机自动挂载,在 /etc/fstab 中添加:tracefs /sys/kernel/tracing tracefs defaults 0 0
注意: 某些发行版(如 Ubuntu 较早版本)可能使用 /sys/kernel/debug/tracing 作为挂载点,这是通过 debugfs 挂载的旧路径。建议优先使用 tracefs 独立挂载,以获得更好的性能和功能支持。

3.3 检查当前系统是否支持 ftrace

完成配置检查和挂载后,可以通过以下步骤快速验证 ftrace 是否可用:

  • 步骤 1: 确认 /sys/kernel/tracing 目录存在且非空。
  • 步骤 2: 查看 available_tracers 文件,确认包含 function 和 function_graph:
    cat /sys/kernel/tracing/available_tracers
  • 步骤 3: 查看 available_events 文件,确认事件列表非空:
    cat /sys/kernel/tracing/available_events | head -20
  • 步骤 4: 简单测试:写入 function 到 current_tracer,然后读取 trace 文件:
    echo function > /sys/kernel/tracing/current_tracer
    cat /sys/kernel/tracing/trace

如果上述步骤均成功,说明 ftrace 环境已准备就绪。

3.4 ftrace 环境架构总览

下图展示了 ftrace 环境的核心组件及其交互关系:

ftrace 环境架构图 ftrace 环境架构总览 Linux 内核(ftrace 核心) 函数跟踪器 事件跟踪 动态 ftrace 堆栈跟踪 tracefs 虚拟文件系统 /sys/kernel/tracing/ 用户空间工具(cat / echo / trace-cmd / perf) 说明:内核通过 tracefs 暴露控制接口,用户空间通过读写文件与 ftrace 交互

3.5 常见问题与排查

现象 可能原因 解决方法
/sys/kernel/tracing 不存在 内核未开启 CONFIG_FTRACE 或 tracefs 未挂载 重新编译内核或挂载 tracefs
available_tracers 为空 未开启 CONFIG_FUNCTION_TRACER 检查内核配置并重新编译
写入 current_tracer 失败 权限不足或内核被锁定 使用 root 权限或检查 trace_clock 设置
读取 trace 文件无输出 未开启跟踪或缓冲区为空 先写入 function 到 current_tracer,再执行一些系统调用
快速验证脚本: 以下脚本可一键检查 ftrace 环境是否就绪:
#!/bin/bash
echo "=== ftrace 环境检查 ==="
mount | grep tracefs && echo "[OK] tracefs 已挂载" || echo "[FAIL] tracefs 未挂载"
cat /sys/kernel/tracing/available_tracers | grep -q function && echo "[OK] function tracer 可用" || echo "[FAIL] function tracer 不可用"
cat /sys/kernel/tracing/available_events | head -1 && echo "[OK] 跟踪事件可用" || echo "[FAIL] 跟踪事件不可用"
echo "=== 检查完成 ==="

完成以上步骤后,ftrace 环境即准备就绪,可以进入下一阶段的学习与实践。