4.6.1. pstore & ramoops

4.6.1.1. pstore 介绍

  • pstore 即 persistent storage(持久性存储),是一种内核特性,通常用于在 Linux 内核实现持久存储机制,允许保存调试信息、崩溃日志其他重要内核状态数据,即使系统重启后,这些信息可以保留下来。

  • 主要目的提供一种机制,在系统崩溃重启能够保留一些关键信息,帮助开发人员调试分析问题。

4.6.1.2. pstore 原理

  • pstore 是实时将 log 写入 uncache 内存,所以 pstore 存储数据能够完整显示重启的 kernel log,pstore 经常我们分析异常重启重要调试信息。

  • 在 X5 平台上,当系统出现异常重启(panic/wdog 等),此时系统将会进行一次 WarmReset,意味着内存不会电,在下次重启后,用户能够通过指定节点获取出现异常 log。

4.6.1.3. pstore 类型

pstore 支持下面几种 log 信息:

  • console

pstore 注册一个 console,输出串口 console 的 log 都同步写入 pstore 指定地址中,所以 log 是串口输出内容一样的(受 log level 的管控),该段内存通过 ringbuffer 管理。

异常重启后,可以/sys/fs/pstore/console-ramoops-\* 获取。

  • ramoops

ramoops 指采用 ram 保存 oops 信息一个功能,通过系统异常重启(panic/oops)的关键路径中 dump kmsg,实现 log 保存,相于 console,ramoops 是受 log level 控制的,可以作为 console log 的补充。

异常重启后,可以/sys/fs/pstore/dmesg-ramoops-\* 获取。

  • sched

sched log 是用于分析系统重启调度问题的 log 机制,能够保存重启各个 CPU 上调度信息,对于分析 wdog 等问题非常帮助,该功能需要开启 CONFIG_SCHED_LOGGER

异常重启后,可以通过 /sys/fs/pstore/sched-ramoops-\* 获取。

  • ftrace

pstore ftrace 功能可以用来追踪一些重启出现软/硬件 hang 的问题,能够获取函数调用的 trace。

功能默认关闭,对系统负载影响较大,不建议使用,推荐使用 sched 功能。

4.6.1.4. ramoops 介绍

  • ramoops 属于 pstore 系统一部分。

  • ramoops 将内核崩溃信息、日志数据其他关键数据保存预留内存区域。并且这个内存区域不会系统重启清除(或至少可以重启过程读取)。

4.6.1.5. ramoops 使用方法

内核开启 ramoops

  • 内核开启如下选项

CONFIG_PSTORE=y
CONFIG_PSTORE_RAM=y

设置 ramoops 预留内存

  • 通过修改 dts 设置 ramoops 使用内存地址空间内存大小,ramoops 内存被 Linux 内核管理,所以需要这部分内存 reserve。

  • ramoops 的相关设置在 reserved_memory 节点下。

    以下是X5系统默认的dts的配置。

    ramoops@d5000000 {
        compatible = "ramoops";
        reg = <0x0 0xd5000000 0x0 0x40000>;
        console-size = <0x8000>;
        pmg-size = <0x8000>;
        ftrace-size = <0x8000>;
        sched-size  = <0x8000>;
        record-size = <0x4000>;
        ecc-size = <0x0>;
    };
    

内核触发 kernel panic

  • 内核通过 sysrq 主动触发 kernel panic,检查 pstore 机制是否生效

echo c > /proc/sysrq-trigger

检查 ramoops 生效

  • 发生异常重启后,X5平台通过 pstore 获取到 kernel log 后,转存了 /userdata/log/pstore/

root@buildroot:~# ls -al /userdata/log/pstore/X5_Pstore-0017-1970_01_01_00_00_03/
total 76
drwxr-xr-x 2 root root  4096 Oct 15  2024 .
drwxr-xr-x 3 root root  4096 Jan  1 00:00 ..
-r--r--r-- 1 root root  1391 Jan  1 00:00 console-ramoops-0
-r--r--r-- 1 root root 27248 Jan  1 00:00 dmesg-ramoops-0
-r--r--r-- 1 root root 33922 Jan  1 00:00 sched-ramoops-0