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