下载安装和使用kdump的经历(一)

来源:互联网 发布:串口通信编程 编辑:程序博客网 时间:2024/05/18 07:09

      最近两个星期都在折腾这件事情。 之前在写一个内核网络模块。模块加载之后,会引起内核panic,panic分三种类型,我现在碰到的panic应该属于最严重的那种,导致内核crash,而且crash的时候内核打印出来的错误,并不能完全的显示在屏幕上面,因为一屏幕打印不满,会刷频,所以看不到crash时候dump_stack的消息看不到,这样调试就很困难,真心非常非常的郁闷。

     后来经过咨询,有哥们提示说用kdump,可以记录内核崩溃时候的堆栈,相当于是可以记录内核崩溃时候整个内存中的信息。 因此,我开始了为期两周的郁闷惆怅的kdump的安装之旅。有同志有碰到和我相似的问题,请给我留言。

      首先,我是在虚拟机vmware上面进行的实验。出现的各种问题,我觉得也有可能是因为vmware虚拟机的原因,毕竟它只是一个软件,与真实的计算机是有区别的,特别是涉及到内核这个部分的时候。这是我自己的猜测,没有被证实。目前我已经开始打算把linux安装在自己的笔记本上,装成双系统,或者干脆笔记本不要windows了,只留Linux。这是后话。

1. fedora core 10。

   首先,我在fedora core10上面,开始安装kdump。fc10上面是2.6.27的内核。这个是我最常用的系统。按照这个帖子中所述,http://fedoraproject.org/wiki/How_to_use_kdump_to_debug_kernel_crashes,首先安装kexec-tools\kernel-debuginfo。其中我不明白的是这条指令:

yum install --enablerepo=fedora-debuginfo --enablerepo=updates-debuginfo kexec-tools crash kernel-debuginfo
其中,参数--enablerepo=fedora-debuginfo 是什么意思?通常我们yum install 时候并不会带着参数的。这个参数是不是指定了一个更新源?是不是yum的更新源是有类别的区分的。这条指令主要安装了 kexec-tools、crash、以及kernel-debuginfo。其中kernel-debuginfo按照我自己的观察,是在/usr/lib/debug 目录下面,添加了多的文件,包括我们后面会用到的 debug/lib/modules/`uname-r`/vmlinux 文件。这个过程很慢,因为下载的数据较多,基本需要三四个小时。
这样安装完成之后,然后修改/etc/grub.conf文件,在启动参数后面添加crashkernel=128M@16M。然后重启计算机,启动kdump服务,修改/etc/sysrq-trigger参数为1。这样就完成了所有的设置。然后 echo c > /proc/sysrq-trigger 之后,按照帖子中所诉,这时内核就会crash,而kdump就会接管内核,然后开始将内存中信息记录到文件vmcore。

但是,我没有进行到这一步,卡在了 waiting for required block device discovery.  waitint for sda...上面。也就是说,kdump就没有启动成功,因为它始终不能正确的加载sda。

 

后来,经过重装fedora系统多次,依然有这个问题。在网上的苦苦搜索,发现也有人报告了类似的错误,这个是fedora自身的一个bug,这个bug应该在后期的fc12, fc14中应该是修复了的。 不过我没有试验,因此,在fecora系统上面,我的试验结果就是 kdump无法启动,更不能生成vmcore文件。

 

2. 关于内核编译的方法和initrd.img文件

 

      除了上面那个问题之外,此前,我一直都使用的是虚拟机上面的fedora系统,这个系统还有另外一个问题,我手动下载新的内核并更新内核之后,系统在启动时候进入新的2.6.28的内核,经常会不能启动,显示的问题也是找不到sda硬盘。 错误信息如下:

      Unable to access resume device (UUID=96......)

      mount: error mounting /dev/root on  sysroot as ext3: No such file or directory。

这个问题更令人郁闷的一方面是,它只是偶尔出现,这个就更让我怀疑是否是vmware的原因导致的。刚开始 经过网上搜索我以为是initrd.img文件的原因导致的。 initrd.img 是一个小的文件系统,在系统启动的时候,会先将initrd.img 文件系统全部载入到内存中,然后在加载真正的存储在硬盘上面的根文件系统。具体为什么这样做,原因我还不清楚。

      我编译内核时候的方法时这样的:先把系统自己的config文件:/boot/.config拷贝到新的内核中,然后make menuconfig;  make;  make install。据我观察make install 时候应该就会生成新的initrd.img文件,并放到/boot目录下面,但是网上许多人说编译内核时候 需要手动的生成initrd.img文件,否则就会导致 找不到硬盘的问题。为此,我用下面的指令,手动生成了新的initrd.img文件:

                 mkinitrd /boot/initrd.img 2.6.28
 
  但是,我更新了initrd.img文件之后,系统启动时,依然显示找不到/dev/root 硬盘的问题。
  
    后来有人说fedora就是redhat的试验田,用redhat就可以解决这个问题,于是我安装了redhat。

 

 

3.  在redhat上面编译内核的问题。

 

我安装的redhat是 RHEL server 6.3版本的。这个系统感觉和fedora是一样的,据说比fedora要更加稳定。它自带的内核是2.6.28版本的。由于开发的需要,我觉得要用一个自己的内核。为此,在安装kdump之前,我想现在redhat上面安装一个内核。 这个工作之前 我在fedora上面是做过的。为此,我按照上面第二节提到的方法,编译了内核。结果make install 时候出现了下面的错误:

 

也就是找不到某些module。不知这个是为什么,在网上搜索了一下, 好像也是vmware的原因导致的,也和redhat有关系,为此,我放弃了rhel。

 

4. 之后我选择了 ubuntu。

ubuntu号称是使用最多的桌面linux操作系统,我觉得应该解决了这个 kdump的问题,为此,我安装了ubuntu。之前也使用过挺长时间的ubuntu。ubuntu和fedora就不是一个系列的,许多配置文件的写法以及 路径都不一样,而且 grub的配置方式也不一样,并且ubuntu使用的是grub2,它是目前唯一使用grub2的操作系统。下面说一下,我使用ubuntu碰到的问题。

 

在ubuntu上面,我也先尝试了第一步,即手动更新内核。与redhat不相同的是,make install之后,我尝试进入新的内核,但是启动时 显示找不到硬盘。ubuntu的grub菜单我也是防着网上的方法进行修改的,结果却提示 找不到硬盘。我怀疑这个也和vmware软件有关系,也许换到真实的机器上面这个问题就不存在了。后来我放弃手动编译内核,试图在ubuntu自带的内核上面工作。

 

在ubuntu上面安装kdump的方法在帖子中:http://www.cnblogs.com/wwang/archive/2010/11/19/1881304.html  有详细的介绍。ubuntu的kdump与fedora又有些区别,它对kdump的消息进行了打包。我按照它这个方法进行了实践,可以生成dump时候的vmcore文件。但是在crash指令中需要/usr/lib/debug路径下一个vmlinux文件,而这个文件是需要安装dbgsym的。在帖子中给定了一个dgbsym的下载地址,但是并没有与我的内核相同的版本,我下载并安装了一个非常接近的版本,结果在"crash  vmlinux  vmcore" 指令执行时,提示说vmlinux 和 vmcore的版本不一致。这就是dbgsym的版本带来的问题

 

其实我认为想解决上面这个问题,是有办法的,因为dgbsym其实也就是提供一个vmlinx文件,因为如果我可以手动编译内核,并成功启动的话,也是可以的。但是在ubuntu上面,无法实现 启动手动编译的内核。

 

为此,我放弃了难用的ubuntu。后面,我又用centos 进行了实验。

 

 

原创粉丝点击