基于pstoreramoops实现在非易失性内存中保存panic日志



具体步骤如下


0.确定地址范围

需求提前知道用来保存panic日志的非易失性内存的起始地址和长度。比如笔者用到的那部分内存的起始地址是0x11ff000000,长度是16M


2.修改内核


保证内核配置选项中选上了ramoops驱动支持:

wKioL1gpthDCVFJKAABpX8oyDlw237.png生成驱动加载过程中,如果发现对独立的非易失性存储加载驱动失败,检查是否需要修改内核驱动,特别是fs/pstore/ram_core.c中的request_mem_region()函数,然后确定到底是选用persistent_ram_vmap()还是persistent_ram_iomap()来映射物理地址到内核线性地址空间。



3.在命令行中指定相关启动参数


对于ramoops模块buildin的内核,直接在内核命令行加上上面的启动参数:

ramoops.mem_address=0x11ff000000 ramoops.mem_size=0x1000000 pstore.backend=ramoops


对于ramoops模块buildout的内核,内核命令行上需要加下面的参数:

pstore.backend=ramoops

并且在内核启动之后,还需要参考下面的命令加载ramoops驱动:

modprobe ramoops.ko ramoops.mem_address=0x11ff000000 ramoops.mem_size=0x1000000


注意ramoops.ko依赖于模块reed_solomon.ko,需要提前安装好,reed_solomon.ko可以参考下面命令生成:

cd lib/reed_solomon  && make -C /lib/modules/`uname -r`/build modules

&& modprobe reed_solomon

再加载ramoops驱动,通过dmesg可以看到它成功了:

[ 301.921706] console [pstore-1] enabled

[ 301.921841] pstore: Registered ramoops as persistent store backend

[ 301.921862] ramoops: attached 0x1000000@0x11ff000000, ecc: 0/0



4.运行测试


reboot机器,重新起来之后可以看到oops message details:

[root@localhost pstore]# pwd

/sys/fs/pstore

[root@localhost pstore]# ls -alrt

total 0

drwxr-xr-x. 5 root root    0 Nov  7 01:04 ..

drwxr-xr-x. 2 root root    0 Nov  7 01:04 .

-r--r--r--. 1 root root 4084 Nov  7 01:17 dmesg-ramoops-0

-r--r--r--. 1 root root 4084 Nov  7 01:17 console-ramoops



5.参考文档:

[root@localhost lsd-linux-kernel]# ls Documentation/ramoops.txt

Documentation/ramoops.txt

[root@localhost lsd-linux-kernel]# ls Documentation/ABI/testing/pstore

Documentation/ABI/testing/pstore