转自:http://www.cnblogs.com/wwang/archive/2010/11/19/1881304.html

在我的上一篇博文《Linux内核的Oops》的最后介绍到一个Linux内核转储工具Kdump,这个工具可以在发生kernel panic时把现场dump到一个文件里,以供后续分析之用。本文主要介绍在Ubuntu下如何使用kdump。

Kdump是一个通用的Linux内核转储工具,详细的用法说明可以参考这篇Kdump Tutorial。这篇教程洋洋洒洒几十页(链接里有pdf文件可以下载),详细介绍了内核配置的参数,以及实现内核崩溃转储的一系列工具的用法以及可能出现的问题,过程看上去有点繁琐。是不是每台需要调试的机器都要这么设置呢?其实是没有必要的。Linux发行版已经帮我们做了很大一部分工作,我们需要做的只是安装几个包,启动一下Kdump服务就可以了。很多发行版比如Ubuntu默认在内核里已经支持了Kdump,我们并不需要重新配置内核,kdump的一系列工具也做成了service可以直接启用。接下来,我们就会看到在Ubuntu上使用kdump真的非常简单。但是,我还是建议大家在完成这个简单的流程后,再回过头来仔细阅读上面提到的教程,毕竟,知道真正的细节才能有助于我们更好的理解这个系统。

Kdump简介

Kdump是一个Linux内核崩溃转储机制,这个机制的原理是在内存中保留一块区域,这块区域用来存放capture kernel,当前的内核发生crash后,通过kexec把保留区域的capture kernel运行起来,由capture kernel负责把crash kernel的完整信息--包括CPU寄存器、堆栈数据等--转储到文件中,文件的存放位置可以是本地磁盘,也可以是网络。

安装Ubuntu的crashdump工具包

在Ubuntu下实现Kdump只需要安装linux-crashdump这个包就可以了,可以在新立得下搜索linux-crashdump或者用命令:

sudo apt-get install linux-crashdump

linux-crashdump实际上安装了三个工具,分别是:crash,kexec-tools,以及makedumpfile。

安装完毕以后,我们检查一下grub2的启动选项,会发现在引导内核的命令linux后面多了一个参数:

crashkernel=384M-2G:64M,2G-:128M

crashkernel用来指定保留内存的大小,语法定义如下:

crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]

range=start-[end]

其中,start包含在指定范围内,而end不包含在指定范围内。

参考这个语法定义,我们就可以知道linux-crashkernel帮我们设定的保留区域的大小是:如果内存小于384M,不保留内存;如果内存大于等于384M但小于2G,保留64M;如果内存大于2G,保留128M。

在/etc/init.d中还会有一个kdump的service脚本,我们可以打开这个脚本看一看,内容很简单,主要是用kexec把/boot下的linux内核镜像当作capture kernel放入保留内存里。

试用Kdump

在下面的实例中,所有的操作都需要root权限,所以请先用sudo su切换到root。

我们需要首先启动kdump service,命令如下:

service kdump start

下面是启动成功的画面:

写一个让内核崩溃的模块还是比较麻烦的,我们可以通过SysRq来实现这个目的。注意,在进行下面的操作前,请保存好自己的数据。

echo c > /proc/sysrq-trigger

或者按这个组合按键: Alt+SysRq+c

通过上面的操作,你的系统会立刻崩溃。不出意外的话,系统很快就会重启,然后在/var/crash这个目录下我们就可以找到转储的crash镜像。

到这里,利用kdump进行Linux内核转储的实验就结束了,比起Kdump Tutorial里的步骤简单很多,这都是Ubuntu的功劳。

使用Crash分析转储文件

接下来我们要面对的是如何分析这个crash文件。这里还有一个教程,为了叙述方便,我把它叫做Crash Tutorial。Crash Tutorial主要介绍在Open SUSE和CentOS下如何利用crash工具来分析转储文件,这与Ubuntu还是有点差别的。在上述两个发行版里,kdump生成的crash镜像文件是vmcore,这个文件可以用直接拿来用crash工具分析。Ubuntu提供了一个叫做Apport的工具,Apport用于收集崩溃时所有OS认为有用的信息,并把它们打成一个包,就是上面看到的linux-image-2.6.32-25-generic.0.crash,我们需要的vmcore就在这个包里。下面这个命令用于解包:

apport-unpack /var/crash/linux-image-2.6.32-25-generic.0.crash ~/tmp

我们把crash压缩包解到~/tmp中:

得到vmcore之后,我们还不能立刻进行分析,crash工具需要内核调试信息dbgsym才可以工作。我们可以先看看/usr/lib下有没有debug目录,如果没有,则需要下载安装,下载的地址在这里。注意,下载前先用uname -r命令确定当前内核的确切版本号,dbgsym的版本一定要和内核版本完全匹配才可以。

安装好dbgsym之后,我们就可以使用crash来分析vmcore了,命令如下:

crash /usr/lib/debug/boot/vmlinux-2.6.32-25-generic ~/tmp/VmCore

在crash里,我们可以用bt查看内核崩溃时的call trace:

详细的crash用法大家可以参考Crash Tutorial,或者用Google搜索一下相关资料。

注:

1. 本文采用的操作系统环境是 Kubuntu 10.04,在Ubuntu 10.04下实验应该同样是没有问题的。

2. 我有用过Ubuntu 10.10来实验kdump,但是很不幸,capture kernel没有跑起来,如果大家有在Ubuntu 10.10下的成功经验,麻烦告诉我。

Ubuntu的内核转储工具【转】的更多相关文章

  1. 内核探测工具systemtap简介

    systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工具,后续将会有系列文章介绍systemtap的用法. 什么是systemtap 假如现在有这么一个需求:需要获取正在运行的 ...

  2. linux 解决Ubuntu编译内核uImage出现问题“mkimage” command not found - U-Boot images will not be built问题

    解决Ubuntu编译内核uImage出现问题“mkimage” command not found - U-Boot images will not be built问题 http://www.lin ...

  3. 内核探测工具systemtap简介【转】

    转自:http://www.cnblogs.com/hazir/p/systemtap_introduction.html systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工 ...

  4. linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等

    << System语言详解 >> 关于 SystemTap 的书. 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tc ...

  5. 只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs

    只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs [ide is evil] (http://i.cnblogs.com/EditP ...

  6. 24小时学通Linux内核--内核探索工具类

    寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间里还是希望能够补充一下Linux内核相关知识,接下来继续 ...

  7. 删除ubuntu旧内核

    ubuntu的内核经常升级,而老内核并不自动卸载.时间长了,就有一大堆内核垃圾,需要我们手动去清理. 先用uname -a 查看当前内核版本: xzc@xzc-HP-ProBook-4446s:~$ ...

  8. 十天学Linux内核之第一天---内核探索工具类

    原文:十天学Linux内核之第一天---内核探索工具类 寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间 ...

  9. 关于内核转储(core dump)的设置方法

    原作者:http://blog.csdn.net/wj_j2ee/article/details/7161586 1. 内核转储作用 (1) 内核转储的最大好处是能够保存问题发生时的状态. (2) 只 ...

随机推荐

  1. jmeter5.0 while controller使用总结

    while controller 配合sql使用的方式 在while控制器条件中填空,这样当里面的请求断言失败后就会跳出循环 在while控制器条件中填LAST,当里面的请求断言失败后就会跳出循环,如 ...

  2. -bash: /tyrone/jdk/jdk1.8.0_91/bin/java: cannot execute binary file

    问题描述:今天在linux环境下安装了一下JDK,安装成功后,打算输入java -version去测试一下,结果却出错了. 错误信息:-bash: /tyrone/jdk/jdk1.8.0_91/bi ...

  3. 信用评分卡Credit Scorecards (1-7)

      欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 python风控评分卡建模和风控常识 https://study.163.com/course/introductio ...

  4. Servlet_问题总结

    1.Servlet转发到JSP后页面的CSS样式丢失,页面布局混乱,原来能点的链接现在失效 原因:原来前台页面(JSP|HTML)在引用静态资源(CSS|JS|JSP页面)时使用的是相对路径, 导致由 ...

  5. Kubernetes之POD

    什么是Pod Pod是可以创建和管理Kubernetes计算的最小可部署单元.一个Pod代表着集群中运行的一个进程. Pod就像是豌豆荚一样,它由一个或者多个容器组成(例如Docker容器),它们共享 ...

  6. Java使用POI导入Excel异常Cannot get a text value from a numeric cell 解决

    异常原因:Excel数据Cell有不同的类型,当我们试图从一个数字类型的Cell读取出一个字符串并写入数据库时,就会出现Cannot get a text value from a numeric c ...

  7. [NIO-2]通道和FileChannel

    通道是什么 通道式(Channel)是java.nio的第二个主要创新.通道既不是一个扩展也不是一项增强,而是全新的.极好的Java I/O示例,提供与I/O服务的直接连接.Channel用于在字节缓 ...

  8. ES学习之分片路由

    本文主要内容: 1.路由一个文档到一个分片 2.新建.索引和删除请求 3.取回单个文档 4.局部单个文档 5.多文档模式 6.理解一下ES深度分页(from-size)的劣势 路由一个文档到一个分片 ...

  9. for each循环(增强for循环)

    底层实现是使用了迭代器,简化了迭代器的书写 格式: for(集合/数组的数据类型 变量名: 数组名/集合名) { // body } char[] chars = {'c', 'd', 'd', 'e ...

  10. Mybatis中#{}和${}传参的区别及#和$的区别小结

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"&quo ...