系统/内核启动期间使用ftrace

本文介绍如何利用ftrace功能追踪Linux系统启动期间的进程活动,特别是如何捕捉可能改变路由设置的行为。通过设置特定的ftrace参数,在系统启动时记录sys_execve等关键函数的调用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


背景

最近有个小伙伴求助笔者,在系统启动完成进入bash,也就是systemd的某个服务或者某个定制进程改变了路由,他想要在系统完成启动的期间捕获这个行为。


1.思路

设置路由的内核接口为ipv6_route_ioctl ,跟踪内核调用可以使用bcc或者bpftrace来完成,在systemd启动服务的期间无非就是加个早点儿启动的service呗,但是无奈的是这个系统里面没有引入bcc的源,并且客户还不允许加脚本之类的进服务器,那办法就比较局限了,使用ftrace抓取调用ipv6_route_ioctl的进程,如果是route命令之类的,再获取一下在这之前执行sys_execve的进程就可以了。

2. 查找cmdline启动项

如果默认开启ftrace捕获启动期间事件,肯定需要某个cmdline传入参数进行支持,在不知道具体实现及哪个cmdline的情况下,有两个办法:
1.找到ftrace.c($KERN_ROOT/trace/ftrace.c),查找__setup宏;
2.查找内核启动参数文档,$KERN_ROOT/Documentation/admin-guide/kernel-parameters.txt;
这两个方式适合我们对某个子系统不熟悉的时候作为查找启动项入口,通过搜索找到了我们想要的启动项:
ftrace及ftrace_filter,与在/sys/kernel/debug/tracing下面使用一致,ftrace指定要使用的tracer,此处我们使用function就行,ftrace_filter为要设置的filter_functions列表,使用逗号隔开。

3.验证

修改grub.cfg,在启动参数添加ftrace=function ftrace_filter=__x64_sys_execve进行验证,重启系统,查看trace日志:

[root@localhost ~]# cat /sys/kernel/debug/tracing/trace
# tracer: function
#
# entries-in-buffer/entries-written: 19450/19450   #P:4
#
#                                _-----=> irqs-off
#                               / _----=> need-resched
#                              | / _---=> hardirq/softirq
#                              || / _--=> preempt-depth
#                              ||| /     delay
#           TASK-PID     CPU#  ||||   TIMESTAMP  FUNCTION
#              | |         |   ||||      |         |
            awk-1693    [000] ....   214.667040: __x64_sys_execve <-do_syscall_64
           <...>-1695    [001] ....   214.667687: __x64_sys_execve <-do_syscall_64
           <...>-1696    [003] ....   214.667762: __x64_sys_execve <-do_syscall_64
            bash-1699    [003] ....   214.669529: __x64_sys_execve <-do_syscall_64
             awk-1701    [002] ....   214.669613: __x64_sys_execve <-do_syscall_64
            bash-1702    [003] ....   214.669701: __x64_sys_execve <-do_syscall_64
             cat-1704    [002] ....   214.671459: __x64_sys_execve <-do_syscall_64
             awk-1705    [001] ....   214.671561: __x64_sys_execve <-do_syscall_64
            bash-1709    [001] ....   214.673221: __x64_sys_execve <-do_syscall_64
             cat-1710    [002] ....   214.673319: __x64_sys_execve <-do_syscall_64
             awk-1711    [001] ....   214.673407: __x64_sys_execve <-do_syscall_64
              df-1714    [002] ....   214.675070: __x64_sys_execve <-do_syscall_64

总结

ftrace功能强大,虽然使用起来不怎么方便,但是许多生产环境还是比较实用的,除了本文用到的function外,启动时也支持设置function_graph,后面有空再实践试试。

### 使用 ftrace 进行 WiFi 驱动程序的调试和性能分析 #### 启用 Ftrace 功能 为了使用 `ftrace` 对 WiFi 驱动进行调试,首先需要确认内核已经编译并启用了 `CONFIG_FUNCTION_TRACER` 和其他必要的跟踪选项。可以通过以下命令检查: ```bash zcat /proc/config.gz | grep CONFIG_FUNCTION_TRACER= ``` 如果返回值为 `=y` 则表示已启用。 #### 创建 Trace 文件系统挂载点 通常情况下 `/sys/kernel/debug/tracing/` 是默认路径,如果没有则需手动创建: ```bash mount -t debugfs nodev /sys/kernel/debug/ ``` #### 开始追踪特定事件 对于 WiFi 设备而言,可能感兴趣的事件包括但不限于网络设备操作、无线接口状态变化以及数据包传输过程中的关键节点。这些都可以通过定义自定义过滤器来实现更精确的数据收集[^1]。 #### 应用场景实例:捕获连接建立期间的行为模式 假设目标是在客户端尝试关联到某个接入点的过程中获取详细的日志信息,则可执行如下指令序列: 设置触发条件(当检测到新的 STA 加入时启动记录) ```bash echo 'wlan0:wiphy0 sta_state' > \ /sys/kernel/debug/tracing/events/mac80211/sta_state/filter ``` 激活跟踪功能并将输出重定向至文件保存起来便于后续审查 ```bash echo 1 > /sys/kernel/debug/tracing/tracing_on sleep 5 # 等待几秒钟让STA完成整个握手流程 echo 0 > /sys/kernel/debug/tracing/tracing_on cp /sys/kernel/debug/tracing/trace ./wifi_assoc_trace.txt ``` 上述方法能够有效地捕捉从扫描邻居AP直至最终形成稳定链路这一阶段内的所有重要活动轨迹。 #### 数据处理与可视化展示 原始 trace 日志往往较为冗长难以直观理解,因此建议利用专门设计用于解析此类结构化文本的应用程序如 `kernelshark` 或者编写简单的脚本来提取关注字段并绘制成图表形式辅助分析工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值