基于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 [email protected], ecc: 0/0
4.运行测试
reboot机器,重新起来之后可以看到oops
message details:
[[email protected]
pstore]# pwd
/sys/fs/pstore
[[email protected]
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.参考文档:
[[email protected]
lsd-linux-kernel]# ls Documentation/ramoops.txt
Documentation/ramoops.txt
[[email protected]
lsd-linux-kernel]# ls Documentation/ABI/testing/pstore
Documentation/ABI/testing/pstore