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。如果该目录为空或不存在,则需要手动挂载。
挂载步骤:
- 检查是否已挂载:
mount | grep tracefs - 若未挂载,执行:
sudo mount -t tracefs tracefs /sys/kernel/tracing - 如需开机自动挂载,在
/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 环境的核心组件及其交互关系:
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 环境即准备就绪,可以进入下一阶段的学习与实践。