基于pstore和 ramoops实现在非易失性内存中保存panic日志
具体步骤如下
0.确定地址范围
需求提前知道用来保存panic日志的非易失性内存的起始地址和长度。比如笔者用到的那部分内存的起始地址是0x11ff000000,长度是16M。
2.修改内核
保证内核配置选项中选上了ramoops驱动支持:
生成驱动加载过程中,如果发现对独立的非易失性存储加载驱动失败,检查是否需要修改内核驱动,特别是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
本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1872790 ,如需转载请自行联系原作者