转自: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. Java Web之Servlet的三大作用域对象

    Servlet的作用域是干嘛的?答案就是共享数据而存在的,如图: 下面通过代码演示来具体讲解一下三大作用域 我们新建两个类 package main.com.vae.scope; import jav ...

  2. Kafka技术内幕 读书笔记之(四) 新消费者——心跳任务

    消费者拉取数据是在拉取器中完成的,发送心跳是在消费者的协调者上完成的,但并不是说拉取器和消费者的协调者就没有关联关系 . “消费者的协调者”的作用是确保客户端的消费者和服务端的协调者之间的正常通信,如 ...

  3. 使用eclipse粗略统计代码代数【原】

  4. c++中sizeof的理解

    1. 例题 #include <iostream> class A {}; class B { char m_data; }; class C { ]; }; class D { char ...

  5. 3.1HashMap源码分析

    在前篇博文中(HashMap原理及实现学习总结)详细总结了HashMap的原理及实现过程,这一篇是对HashMap的源码分析. package dataStructure.hash; import j ...

  6. Spring IoC 依赖注入的方法大全 XML配置方式

    Spring 依赖注入 构造方法注入 ①   根据索引注入 <bean name="student" class="cn.bdqn.SpringDI.Student ...

  7. ASP.NET MVC利用PagedList分页(一)

    前几天看见博客园上有人写ASP.NET MVC的分页思想,这让我不禁想起了PagedList.PagedList是NuGet上提供的一个分页的类库,能对任何IEnumerable<T>进行 ...

  8. mysql数据库允许远程连接

    1.验证初始是否允许远程连接 由于本次虚拟机IP为192.168.2.120,因此我们执行 mysql -h 192.168.20.120 -P 3306 -u root -proot(备注:-pro ...

  9. Xshell 无法连接虚拟机中的ubuntu的问题

     转自:http://blog.csdn.net/qq_26941173/article/details/51173320 版权声明:本文为博主原创文章,未经博主允许不得转载. 昨天在VMware P ...

  10. xgboost安装 win10 64位 annaconda

    重点参考三个网站: https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_For_Anacon ...