背景:
     Linux嵌入式设备内核挂死后,无法自动重启,需要手动重启。而且如果当时没有连串口的话,就无法记录内核挂死时的堆栈,所以需要添加一种方式来记录内核挂死信息方便以后调试使用。设备中增加kdump功能,可以将内核挂死的堆栈信息记录下来,供后期分析。

操作步骤:
        1、添加kdump所需的程序及配置文件
        方法:目前所分析得知需要如下文件/sbin/kdump /sbin/kexec /bin/kdumpctl /etc/kdump.conf /etc/sysconfig/kdump,然后编辑etc目录下的两个配置文件;修改kdump中KDUMP_BOOTDIR="/mnt",KDUMP_COMMANDLINE_APPEND="1 irqpoll maxcpus=1",KDUMP_IMG="kernel.img";修改kdump.conf内容为path /mnt/workdir/log;还需要修改kdumpctl中有关kdump和kexec的路径;将这些文件放到设备的mnt目录下然后重启,重启后执行kexec -l /mnt/kernel.img --initrd=/mnt/rootfs.img --command-line="`cat /proc/cmdline`  1 irqpoll maxcpus=1";kexec -e 查看是否添加成功。
        
        2、问题:各种工具、配置文件均添加成功,但是执行kdumpctl start命令时,依然报错 BUG: unable to handle kernel paging request at ffff880001497000,或者不打印堆栈信息直接提示killed。
        解决方法:经过测试,将添加到grub.cfg中的crashkernel=128M@16M改成crashkernel=128M,完全省略“@Y”这一部分,这样,kernel 会为我们自动选择一个起始地址。这样就不会出现起始地址错误等问题了。在测试kexec时,最好加上-d选项,将debug信息打印出来。

        3、问题:经测试,按照第二步中的操作方法,kexec -e执行完成后,内核打完堆栈之后并未重启,而是直接卡死了。
        解决方法:分析之后才发现,因为在/etc/sysconfig/kdump配置文件KDUMP_COMMANDLINE_APPEND字段添加了reset_devices,所以导致kdump内核无法重启。将KDUMP_COMMANDLINE_APPEND选项内容中reset_devices这个值删掉就可以了。
        
        4、问题:内核panic错误发生后,内核重启,但是只进入到了新解压后的rootfs中,而系统的inittab根本就未被执行,导致后续的脚本没有执行。
        解决方法:经过查找相关资料发现,linux在内核加载完成后,会解压initrd成rootfs根文件系统,随后执行根文件系统中的linuxrc或者init来初始化inittab配置文件,然后进行一系列的脚本初始化操作。根据现象发现,inittab确实没有被执行过,所以就开始查找inittab未被执行的原因。然后修改/etc/sysconfig/kdump文件中的KDUMP_COMMANDLINE_APPEND的值为"1 irqpoll maxcpus=1 init=/linuxrc",然后就可以执行成功了。

        5、问题:由于采用原有的rootfs会造成设备启动许多不必要的程序、服务,所以应该重新定制一个kdump专用的rootfs。
        解决方法:下载新版的busybox,然后编译、安装生成_install目录,该目录下就是部分文件系统,然后在创建dev,etc,lib,lib64,var,proc,tmp,mnt,sys这些系统所需的目录以及设备所需的workdir,mnt目录。由于编译busybox时,采用静态编译出错,所以没有采用静态编译的方式,因而需要用ldd busybox查看busybox所需的动态库,然后将这些动态库拷贝到创建好的/lib64目录中。由于linuxrc需要初始化系统,因而需要在/etc目录下添加fstab、inittab以及init.d/rcS这三个必备文件,由于fstab和inittab只跟系统有关,所以可以借用原来rootfs的对应文件,rcS系统程序的初始化脚本,可以将自己所需要实现的命令添加到rcS中,还需要在dev目录中添加相关设备节点,用mknod命令添加console, null等设备以及shm,pts目录作为挂载点。由于kdump重启后的系统中生成的vmcore过大,CF卡存储不下,只能用vmcore-dmesg /proc/vmcore命令提取内核崩溃日志,所以rcS就简单实现了挂载文件系统、CF卡、提取内核崩溃信息,然后重启系统的功能。由于新的rootfs是在kdump过程中使用,与原有的rootfs独立,所以提取内核崩溃日志的相关程序就需要预先添加到新的rootfs相关的目录中。整个rootfs目录文件添加完成之后,就在_install目录下执行find . | cpio -H newc --quiet -o | gzip -9 >~/rootfs.img,将这些文件夹打包并压缩生成rootfs.img放到当前用户的home目录。

        6、问题:kdumpctl启动kdump服务时,要求内核以及initrd的名称格式,而且需要修改boot.cfg启动配置文件。
        解决方案:最开始向采用修改安装包的方式,向安装包中添加kdump需要的内核以及initrd文件,但是经过尝试无法将这些文件打到vsos.bin中,后来发现是package.ini文件的配置,修改package.ini的配置后,可以将对应的文件添加到vsos.bin中了。但是在设备安装的时候,依然没有安装新添加的文件。由于对设备解包安装的过程不太熟悉,所以就采取折衷的方式:将新的initrd(即kdump需要的rootfs文件)添加到/mnt/system目录下,然后在开机启动脚本start.sh中,添加修改boot.cfg的功能,并将新的rootfs文件移至/mnt目录下,同时新建一个对原有内核文件的软连接供kdump使用,由于kdumpctl会检查内核文件、initrd文件、以及kdump的配置文件的时间戳,如果initrd文件的时间戳早于其他文件,kdumpctl尝试重新生成initrd文件,这个过程中很有可能报错,所以在移动文件结束后,就会用touch命令更新initrd文件的时间到最新。

        7、问题:CF卡的磁盘编号有时不是/dev/sda1,导致kdump重启后按照/dev/sda1挂载失败
        解决方法:用这个命令fdisk -l | grep "83" | grep "\*" | grep dev | awk '{print $1}'来获取CF卡的设备号。

内容汇总
kexec -l选项是直接加载内核,然后配置kexec -e命令启动新内核;而kexec -p选项则是指明当前内核遇到panic时,要启用的内核。需要echo c>/proc/sysrq-trigger,手动触发内核panic。
其实完全可以用kexec取代kdumpctl,这样就可以直接用老的内核名称,而且也不用考虑对kernel、initrd及配置文件的时间戳问题,而且由于采用的是新的rootfs系统,通过修改rcS脚本自己手动实现的内核崩溃信息保存,完全可以脱离对kdump相关配置文件的依赖,这样做是最简单的。但是考虑到标准linux中启动kdump的方式兼容,方便后续人员维护,就采用了kdumpctl的方式启动kdump服务。
由于在svn上提交的是一个封装好的img文件,所以要想对修改img文件中的内容,则需要先将img文件拷贝到一个新的文件夹下,然后执行:mv rootfs.img rootfs.img.gz; gzip -d rootfs.img.gz; cpio -id 还原出整个文件系统,然后按照需求进行修改,随后执行find . | cpio -H newc --quiet -o | gzip -9 >~/rootfs.img重新生成img文件。上述重新生成img文件的命令中,最后img文件的位置不能在当前目录。
得失分析:
由于对内核相关内容不太熟悉,所以前期只能通过从网上找相关资料,一点点尝试。虽然这个过程难了点儿,但是自己从中还是学到了很多东西,诸如Linux启动过程的详细过程之类的,学会了裁剪内核以及busybox,可以搭建一个小的迷你linux。
由于时间限制,并未进一步实现提取vmcore的功能。不过在现在有工作的基础之上应该很容易添加获取vmcore的功能。

手动添加kdump的更多相关文章

  1. IOS手动添加CoreData

    手动添加coreData: 1.在target-build phrase-Link binary with libraries里增加CoreData Framework 2.加入数据模型:comman ...

  2. 如何手动添加Windows服务和如何把一个服务删除

    windows 手动添加服务方法一:修改注册表 在注册表编辑器,展开分支"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services" ...

  3. Windows服务的手动添加和删除方法

    Windows服务的手动添加和删除方法 服务,是指执行指定系统功能的程序.例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序.其实,服务就是一种特殊的应用程序,它从服务启动开始就一直处于运行状态 ...

  4. 解决 Cocos2d-x 中 Android.mk 手动添加源文件

    转自:http://blog.csdn.net/ypfsoul/article/details/8909178 Makefile Android.mk 引发的思索 在我们编写 Android 平台 c ...

  5. 仅仅需手动添加一行代码就可以让Laravel4执行在SAE (v. 1.0.0)

    Github:https://github.com/chariothy/laravel4-sae (已更新至v1.1.0) laravel4-sae (v. 1.0.0) 仅仅需手动添加一行代码就可以 ...

  6. elasticsearch中国字(mmseg)——手动添加字典

    elasticsearch中国文字本身并不是一个理想的插件效果.手动添加字典可以补偿在一定程度上. 后发现了几个实验,mmseg分段机制采用正向最长匹配算法.例如,抵抗"小时报"这 ...

  7. 将下载的本地的jar手动添加到maven仓库

    将下载到本地的JAR包手动添加到Maven仓库 常用Maven仓库网址:http://mvnrepository.com/http://search.maven.org/http://reposito ...

  8. Maven 手动添加selenium JAR 包到本地仓库

    安装Maven后我们会在用户目录下发现.m2 文件夹.默认情况下,该文件夹下放置了Maven本地仓库.m2/repository. 在intellij中创建maven项目时,添加 selenium 依 ...

  9. Maven手动添加jar包

    有的jar在Maven中找不到则需要手动添加(如ojdbc14.jar) 方法如下: 一.将你要添加的jar包放到指定目录(在该目录下打开命令窗口) 二.输入指令:mvn install:instal ...

随机推荐

  1. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  2. 前端框架 EasyUI (2)页面布局 Layout

    在 Web 程序中,页面布局对应用程序的用户体验至关重要. 在一般的信息管理类的 Web 应用程序中,页面结构通常有一个主工作区,然后在工作区上下左右靠近边界的区域设置一些边栏,用于显示信息或放置一些 ...

  3. HTML5 Boilerplate - 让页面有个好的开始

    最近看到了HTML5 Boilerplate模版,系统的学习与了解了一下.在各种CSS库.JS框架层出不穷的今天,能看到这么好的HTML模版,感觉甚爽.写篇博客,推荐给大家使用.   一:HTML5 ...

  4. SSH实战 · 用spring框架下的hibernatetemplate的get方法出现的问题

    用get方法查询:      return this.getHibernateTemplate().get(Product.class, pid); 出现错误为:id to load is requi ...

  5. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  6. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  7. [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Wen. ...

  8. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  9. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  10. 【开发软件】 在Mac下配置php开发环境:Apache+php+MySql

    本文地址 原文地址   本文提纲: 1. 启动Apache 2. 运行PHP 3. 配置Mysql 4. 使用PHPMyAdmin 5. 附录   有问题请先 看最后的附录   摘要: 系统OS X ...