
大家好,我是情报小哥~
今天介绍一下pstore来转存Linux内核奔溃中的panic或oops异常。
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功能,需要以下步骤:
首先配置内核启用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)在设备树中添加pstore内存区域:
// 在保留内存区域中添加/reserved-memory { #address-cells = <1>; #size-cells = <1>; ranges; pstore_reserved: pstore@C0000000 { reg = <0xC0000000 0x00100000>; // 1MB at 0xC0000000 no-map; };};// 添加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 };};如果需要使用eMMC存储panic信息:
pstore: pstore { compatible = "ramoops"; memory-region = <&pstore_reserved>; record-size = <0x20000>; console-size = <0x40000>; pmsg-size = <0x20000>; ecc-size = <16>; status = "okay";};在U-Boot启动参数中添加:
setenv bootargs "console=ttySTM0,115200 root=/dev/mmcblk0p5 rootwait rw pstore.backend=ramoops"创建启动脚本自动挂载:
# /etc/init.d/pstore-mount#!/bin/shmkdir -p /sys/fs/pstoremount -t pstore pstore /sys/fs/pstore或手动挂载:
mount -t pstore pstore /sys/fs/pstore编译并烧写内核和设备树后,验证pstore功能:
# 检查pstore是否启用cat /proc/config.gz | gunzip | grep PSTORE# 查看pstore内容ls -la /sys/fs/pstore/# 测试触发panic(谨慎使用)echo c > /proc/sysrq-trigger确保保留的内存区域不与其他驱动程序冲突。
检查max-reason参数,确保配置为记录panic。
确保内核配置中启用了PSTORE_FS。
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进阶专辑
☞ 经验分享