当前位置:首页>Linux>产品中嵌入式Linux内核崩了,如何捕获到日志信息?

产品中嵌入式Linux内核崩了,如何捕获到日志信息?

  • 2026-10-21 13:28:28
产品中嵌入式Linux内核崩了,如何捕获到日志信息?

大家好,我是情报小哥~

今天介绍一下pstore来转存Linux内核奔溃中的panic或oops异常。

1. 什么是pstore ?

pstore(Persistent Storage)是Linux内核中的一个功能,用于在系统崩溃(如panic或oops)时,将内核的日志(包括控制台日志、用户空间日志、函数跟踪信息等)保存到非易失性存储介质中。这样,在系统重启后,开发者可以检索这些日志,用于分析崩溃原因。

pstore支持多种后端存储,例如:

ramoops:将日志保存到一段保留的RAM区域中。系统重启后,这段RAM区域的内容不会丢失(前提是硬件支持RAM在重启时保持内容,或者通过某些方式保证,如某些嵌入式设备上通过备用电源保持RAM)。然后,内核在启动时会检测这段RAM区域,并将里面的日志导出到文件系统中。

flash:将日志保存到MTD(Memory Technology Device)设备上,如NOR Flash。

block设备:将日志保存到块设备(如eMMC、SD卡)的指定分区中。

efi:在UEFI系统中,利用UEFI固件提供的变量存储。

在嵌入式系统中,ramoops是最常用的一种方式,因为它不需要额外的存储设备,且速度较快。

pstore的主要子系统包括:

console:保存内核控制台日志。

pmsg:保存用户空间日志(通过pstore字符设备写入)。

ftrace:保存函数跟踪信息。

其他:如保存panic/oops信息等。

在Linux系统中,启用pstore后,通常会在/sys/fs/pstore目录下看到保存的日志文件。系统每次崩溃都会生成一组文件,重启后可以手动挂载pstore文件系统来查看。

对于STM32MP257这样的嵌入式平台,通常使用ramoops作为后端,因为它的RAM在系统重启时可能不会丢失(具体取决于硬件设计,如是否有备用电池维持RAM)。因此,需要在设备树中保留一段内存区域供ramoops使用,并配置ramoops节点。

在STM32MP257平台上为Linux 6.1.82开启pstore功能,需要以下步骤:

2. 内核配置

首先配置内核启用pstore功能:

cd linux-6.1.82make ARCH=arm multi_v7_defconfigmake menuconfig

需要启用的配置选项:

File systems  --->  [*] Miscellaneous filesystems  --->    <*> Persistent store support    <*>   Log kernel console messages    <*>   Log user space messages    <*>   Persistent function tracer    <*>   Log panic/oops to a RAM buffer    (1024) Maximum RAM buffer size (in KiB) for panic/oops log    (1024) Maximum RAM buffer size (in KiB) for general messages    [*]   Log panic/oops to a RAM buffer (in a region)Device Drivers  --->  [*] Block devices  --->    <*>   Block device for pstore backend (如果使用eMMC/SD卡)Memory Technology Devices (MTD)  --->  [*]   Caching block device access to MTD devices (如果使用NOR/NAND Flash)

3. 设备树配置

3.1 保留内存区域

在设备树中添加pstore内存区域:

// 在保留内存区域中添加/reserved-memory {    #address-cells = <1>;    #size-cells = <1>;    ranges;    pstore_reserved: pstore@C0000000 {        reg = <0xC0000000 0x00100000>; // 1MB at 0xC0000000        no-map;    };};

3.2 Ramoops配置

// 添加ramoops节点/ {    ramoops {        compatible = "ramoops";        memory-region = <&pstore_reserved>;        record-size = <0x20000>; // 128KB per record        console-size = <0x40000>; // 256KB for console        pmsg-size = <0x20000>; // 128KB for pmsg        ftrace-size = <0x20000>; // 128KB for ftrace        max-reason = <3>; // 记录panic和oops    };};

4. 使用eMMC作为后端(可选)

如果需要使用eMMC存储panic信息:

pstore: pstore {    compatible = "ramoops";    memory-region = <&pstore_reserved>;    record-size = <0x20000>;    console-size = <0x40000>;    pmsg-size = <0x20000>;    ecc-size = <16>;    status = "okay";};

5. 内核启动参数

在U-Boot启动参数中添加:

setenv bootargs "console=ttySTM0,115200 root=/dev/mmcblk0p5 rootwait rw pstore.backend=ramoops"

6. 挂载pstore文件系统

创建启动脚本自动挂载:

# /etc/init.d/pstore-mount#!/bin/shmkdir -p /sys/fs/pstoremount -t pstore pstore /sys/fs/pstore

或手动挂载:

mount -t pstore pstore /sys/fs/pstore

7. 验证配置

编译并烧写内核和设备树后,验证pstore功能:

# 检查pstore是否启用cat /proc/config.gz | gunzip | grep PSTORE# 查看pstore内容ls -la /sys/fs/pstore/# 测试触发panic(谨慎使用)echo c > /proc/sysrq-trigger

8. 常见问题解决

问题1:内存区域冲突

确保保留的内存区域不与其他驱动程序冲突。

问题2:记录不保存

检查max-reason参数,确保配置为记录panic。

问题3:文件系统挂载失败

确保内核配置中启用了PSTORE_FS。

9. 完整的内核配置示例

CONFIG_PSTORE=yCONFIG_PSTORE_CONSOLE=yCONFIG_PSTORE_PMSG=yCONFIG_PSTORE_FTRACE=yCONFIG_PSTORE_RAM=yCONFIG_PSTORE_BLK=yCONFIG_PSTORE_ZLIB_COMPRESS=yCONFIG_PSTORE_LZO_COMPRESS=yCONFIG_PSTORE_LZ4_COMPRESS=yCONFIG_PSTORE_ZSTD_COMPRESS=y

注意:根据你的具体硬件配置,可能需要调整内存地址和大小。确保保留的内存区域在Linux内核可用内存范围之外,并且不会与其他硬件资源冲突。

pstore是一个内核崩溃时保存日志的机制,对于嵌入式设备的问题调试非常有用。

最     后   

小哥搜集了一些嵌入式学习资料,公众号内回复【1024】即可找到下载链接!

推荐好文点击蓝色字体即可跳转

☞专辑|Linux应用程序编程大全
☞ 专辑|学点网络知识
☞ 专辑|手撕C语言
☞专辑|手撕C++语言
☞ 专辑|经验分享
☞ 专辑|从单片机到Linux
☞ 专辑|电能控制技术
☞ 专辑|嵌入式必备数学知识

☞  MCU进阶专辑

☞  嵌入式C语言进阶专辑

☞  经验分享 

最新文章

随机文章