Linux kernel 之ramoops

概念

ramoops 是 Linux 内核中的日志存储机制,将内核日志写入RAM 中,以便在系统崩溃或意外重启后能够保留日志信息供后续分析。

Panic捕获原理

在系统运行中,如果内核发生了panic,那么开发人员需要通过内核报错日志来进行定位问题。但是很多时候出现问题的时候没有接调试串口,而报错日志是在内存里面的,重启后就丢失了。所以需要一种方法,可以在系统发生crash时,将crash info保存于非易失存储器中。

内核使用kmsg_dump_register()函数来注册捕获panic或者oops,如今内核已经有多种捕获panic的方式,最新的是pstore方式。

代码流程:

Kernel/panic.c

发生内核错误是会运行

void panic(const char *fmt, ...);

       àkmsg_dump(KMSG_DUMP_PANIC);

                     à list_for_each_entry_rcu(dumper_list);

                            à dumper->dump(dumper,reason) ;      ///运行kmsg_dump_register注册的回调函数

fs/pstore/ram.c

驱动和设备匹配后执行:

ramoops_probe();

       à pstore_register

              à pstore_register_kmsg

                     àkmsg_dump_register

  • list_add_tail_rcu(dump_list) ; //插入链表中用于panic函数的回调,panic函数最后会执行pstore_dump();其链表插入方式为:dumper->dump = pstore_dump

                                                                     

              à pstore_register_console

              à pstore_register_pmsg

设备树配置

设备树属性有:

Unbufferd

不是用缓冲

No-dump-oops

不记录oops错误

Record-size

记录错误的大小

Console-size

终端dmesg的大小

Ftrace-size

用于内核追踪框架的大小

Pmsg-size

一般是内核打印的大小

Ecc-size

记录错误的校验。

compatible

hi-target-ramoops

由于ramoops是存储在非易失存储中,故设备树中需要给出一定的存储位置用于存放panic、ops、console的日志。大小最好大于16k

首先规划系统内存:

例如OMAP内存总共有256Mbit

248MiB

0MiB

8MiB

运行Linux

用于外部

运行rtos

这样配置,只能通过运行linux的248MiB内存中拿出100K以上的。可使用linux自带的reserves预留内存:那么设备树配置为:

reserved-memory {

       #address-cells = <1>;

       #size-cells = <1>;

       ranges;

       ramoops: ramoops@f600000 {

              compatible = "hi-target-ramoops";

              reg = <0xf600000 0x100000>;

              record-size = <0x10000>;

              console-size = <0x10000>;

       };

};

或者:

246MiB

2MiB

8MiB

运行Linux

用于外部

运行rtos

直接使用外部的内存;设备树配置

/{

       ramoops: ramoops {

               compatible = "hi-target-ramoops";

               reg = <0xf600000  0x200000>;

               record-size = <0x4000>;

               console-size = <0x4000>;

        };

}

内核配置

启动文件系统的pstore即可

CONFIG_PSTORE=y

CONFIG_PSTORE_CONSOLE=y

CONFIG_PSTORE_PMSG=y

CONFIG_PSTORE_RAM=y

CONFIG_REED_SOLOMON=y

CONFIG_REED_SOLOMON_ENC8=y

CONFIG_REED_SOLOMON_DEC8=y

编译

编译内核和设备树

### Linux Kernel Pstore 功能详解 Pstore 是 Linux 内核中的一个功能模块,用于存储持久化的崩溃数据和其他重要信息。它允许系统在发生严重错误或崩溃时保存关键日志和调试信息到非易失性存储设备上,以便后续分析。 #### 工作原理 Pstore 的核心机制在于利用非易失性内存(NVRAM),例如闪存或其他类型的永久存储介质来记录系统崩溃前的状态信息。当系统重新启动后,这些信息可以从 pstore 中读取并传递给用户空间工具进行进一步处理[^3]。 具体来说,pstore 将以下几类数据写入非易失性存储器: - **内核 oops 和 panic 日志**:捕获系统异常终止时的关键信息。 - **console 输出缓冲区的内容**:保留控制台打印的日志消息。 - **其他特定硬件支持的数据**:如某些平台上的 ECC 错误报告等。 为了实现这一目标,pstore 需要依赖底层驱动程序的支持,比如 efivarfs 或者 ramoops 等子组件。其中 `ramoops` 提供了一种基于 RAM 的简单实现方式,在测试环境中非常有用;而生产环境通常会采用更可靠的解决方案,例如 UEFI 变量存储区域 (efivars)[^4]。 #### 使用场景 以下是几个典型的使用案例: 1. **故障诊断与恢复** 当服务器遭遇不可预期的宕机事件之后,管理员可以通过检查由 pstore 记录下来的最后时刻状态来进行根本原因分析。这对于提高服务可用性和稳定性至关重要[^5]。 2. **嵌入式系统开发** 在资源受限但可靠性要求极高的场合下(例如汽车电子控制系统),即使只有少量额外的空间可用于保持事故现场证据链也显得尤为重要。因此很多厂商会在其产品设计阶段就考虑加入此类特性以满足售后维护需求。 3. **自动化运维流程集成** 结合 crashdump 报告生成功能以及 bugzilla 自动提交插件等功能模块一起部署,则可以在无人值守的情况下快速定位问题所在位置,并触发相应的补救措施或者通知相关人员介入解决。 ```bash # 查看当前系统的 pstore 文件内容 cat /sys/fs/pstore/dmesg ``` 上述命令展示了如何访问已有的 pstore 数据文件实例。实际应用过程中可能还需要配置具体的挂载选项或者其他初始化脚本逻辑才能正常使用该特性[^6]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值