[已解决]有什么好的办法可以保存 kernel panic 信息?
时间:2010-05-31
来源:互联网
往往 kernel panic 后,信息无法记录到 syslog 中,甚至连 keyboard 也无效了
虽然可以通过 netconsole 将数据输出到其他机器上,但毕竟不方便
有什么办法可以将数据保存在硬盘上,哪怕是单独分出一个分区也好?
解决办法:
当系统有问题时,fs 的系统调用是无法正常运行的,因此在 OOPS 代码中嵌入 save to file 代码从逻辑上是讲不通的
用 kexec 去启动一个 capture 内核,导出 /proc/vmcore,利用 crash 根据 vmlinux 去分析 vmcore 是个不错的办法
目前利用此方法已能解决我的问题,谢谢各位
作者: platinum 发布时间: 2010-05-31
作者: Godbach 发布时间: 2010-05-31
Godbach 发表于 2010-05-31 09:40
哦?Godbach 兄,是不是需要一起用到 “内核写文件” 技术?
找到 OOPS 打印或 netconsole 发送 UDP 数据的前端位置,插入一个自己的 save to file 功能即可?
是否验证过此方法是否可行?
作者: platinum 发布时间: 2010-05-31
是的。
是否验证过此方法是否可行?
开一个内核线程,来做这个工作应该就成。
作者: Godbach 发布时间: 2010-05-31
如果找到了产生 OOPS 信息的位置,直接在他前面加一个 function 实现 save to file 会有什么问题吗?
作者: platinum 发布时间: 2010-05-31
如果找到了产生 OOPS 信息的位置,直接在他前面加一个 function 实 ...
platinum 发表于 2010-05-31 10:11
对,那样也可以。
也可以考虑做成一个内核模块。
作者: Godbach 发布时间: 2010-05-31
也可以考虑做成一个内核模块。
Godbach 发表于 2010-05-31 10:36
有办法实现在不 recompile 现有内核的情况下通过注册的方法挂载一个内核模块,实现功能嵌入,实现我的需求吗?
作者: platinum 发布时间: 2010-05-31
作者: Godbach 发布时间: 2010-05-31
作者: platinum 发布时间: 2010-05-31
作者: qtdszws 发布时间: 2010-05-31
qtdszws 发表于 2010-05-31 11:34
qtdszws 兄可否多给一些提示,为什么说其他方法都有问题呢?它们可能存在哪些问题?
作者: platinum 发布时间: 2010-05-31
结合lcrash工具, 相当完美.
作者: Arthur_ 发布时间: 2010-05-31
这样可能导致panic无限循环 呵呵
作者: Arthur_ 发布时间: 2010-05-31
结合lcrash工具, 相当完美.
Arthur_ 发表于 2010-05-31 12:17
Arthur_ 兄可否与我们共同分享一下你的成功经验呀!
作者: platinum 发布时间: 2010-05-31
platinum 发表于 2010-05-31 12:20
我也是照着kdump.txt这个文档一步步做的.
这个方法有个局限性:
1. 官方版本适合x86 ppc64
2. 产生的core很大 压缩后40M左右
不知道你能接受不.
PS: arm似乎要打补丁(没用过).
作者: Arthur_ 发布时间: 2010-05-31
这个方法有个局限性:
1. 官方版本适合x86 ppc64
2. ...
Arthur_ 发表于 2010-05-31 12:30
我看了一下文档,遇到了几个问题
1、文档中明确说明了要 SMP=N,那么是不是说我的内核在工作时不能跑 SMP 多 CPU 了?
2、文档中指出新编译一个内核,但是不要在 boot loader 中启动他,那么他的工作原理是怎么回事?启动的物理地址又是否必须是 0x100000(16MB)
3、从 LKCD 官方下载的 lkcdutils-6.x 编译无法通过,其中 lr.c 提示与 stdio.h 中的 getline 冲突,难道我还要改代码?
作者: platinum 发布时间: 2010-05-31
这样可能导致panic无限循环 呵呵
Arthur_ 发表于 2010-05-31 12:18
截获完之后,直接重启系统,可以解决这个问题么、
作者: Godbach 发布时间: 2010-05-31
1、文档中明确说明了要 SMP=N,那么是不是说我的内核在工作时不能跑 SMP 多 CPU 了?
====
做这个东西需要两个内核, 一个是你现在使用的内核(工作内核), 一个是捕获内核。 捕获内核要求CPU=1。
2、文档中指出新编译一个内核,但是不要在 boot loader 中启动他,那么他的工作原理是怎么回事?启动的物理地址又是否必须是 0x100000(16MB)
====
如果捕获内核选择了RELOC 那么地址默认, 选择这个有个好处是捕获内核可以是bzimage(压缩的)。
当工作内核挂掉后, 系统从这个地址启动捕获内核。 (具体咋个加载不是很了解,目前正在研究VM)
3、从 LKCD 官方下载的 lkcdutils-6.x 编译无法通过,其中 lr.c 提示与 stdio.h 中的 getline 冲突,难道我还要改代码?
==
没有遇到这个问题哦, 郁闷呵呵。
我记得我安装的是kexec-tools-2.0.0/
作者: Arthur_ 发布时间: 2010-05-31
捕获内核可以与工作内核完全不同吗,比如工作内核是 2.6.31,而捕获内核是标准的 2.6.18?
还是有什么其他限制条件吗?
作者: platinum 发布时间: 2010-05-31

作者: missuniverse110 发布时间: 2010-05-31
作者: Godbach 发布时间: 2010-05-31

作者: duanjigang 发布时间: 2010-05-31
作者: buptldf 发布时间: 2010-05-31
作者: lmarsin 发布时间: 2010-05-31
1、文档中明确说明了要 SMP=N,那么是不是说我的内核在工作时不能跑 SMP ...
Arthur_ 发表于 2010-05-31 14:01
我现在能通过 kexec 载入 dump-capture 内核,获取到 /proc/vmcore,但是这个怎么用呢?
我只希望能够知道之前 printk 到屏幕的信息即可,通过 netconsole 输出到别的机器上的数据即可,这个怎么实现?
我的想法是参考 netconsole.c 的实现,在 send_udp 之前进行 save buf to file,不知是否可行?
作者: platinum 发布时间: 2010-05-31
buptldf 发表于 2010-05-31 17:46
多谢 buptldf 兄指点!
正在参考内核中 register_die_notifier 的例子,看系统是如何捕获信息并 printk 到屏幕上的
作者: platinum 发布时间: 2010-05-31
2. try kernel thread as what Godbach says.
作者: dzbjet 发布时间: 2010-05-31
产生的/proc/vmcore 保存到某个位子 cp /proc/vmcore .
然后用lcrash工具打开 lcrash vmlinux vmcore
lcrash是改装过的gdb, 通过lcrash可以看到系统panic时所有进程的堆栈信息, 任务状态信息.
具体方法google lcrash.(使用方法跟gdb一样 bt呀 where呀)
http://www.ibm.com/developerworks/cn/linux/l-cn-dumpanalyse/
我说点家常, 说错了别怪我哦:
register_die_notifier 这个我用过, 不过失败了. 呵呵, 如果你能成功教教我哦.
当然结合硬件自身特点使用 register_die_notifier也可以做到保存文件机制.
我google好多资料关于如何保存panic成文件, 结果在中国论坛没有几个人问过, 问过也不了了之.
但国外很多人问了,而且大部分也都给除了方法, 列出来也有好多. 但这些方式都没有收录内核中, 只有kexec+kdump被接受了. 其它啥也不说了.
啥都不说了.
作者: Arthur_ 发布时间: 2010-05-31
作者: Godbach 发布时间: 2010-05-31

作者: jerrymy 发布时间: 2010-05-31
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28