什么是kdump?

  kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。由于能够分析核心转储显著有助于确定系统故障的确切原因,强烈建议启用此功能。

  kdump 需要两个不同目的的内核,这两个内核被称为kdump kernel,生产内核和捕获内核。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的 ramdisk 一起组建一个微环境,用以对生产内核下的内存进行收集和转存。

如何配置kdump?

1、安装kexec-tool

使用kdump服务,就必须安装kexec-tools工具包。安装命令如下:

  1. yum update
  2. yum install kexec-tools

2、配置grub

需要配置为kdump kernel的内存区域。kdump要求操作系统正常使用的时候,不能使用kdump kernel所占用的内存,配置这个需要修改/etc/dedfault/grub文件。文件内容如下:

  1. GRUB_TIMEOUT=5
  2. GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
  3. GRUB_DEFAULT=saved
  4. GRUB_DISABLE_SUBMENU=true
  5. GRUB_TERMINAL_OUTPUT="console"
  6. GRUB_CMDLINE_LINUX="crashkernel=128M vconsole.font=latarcyrheb-sun16 vconsole.keymap=us biosdevname=0 rhgb quiet"
  7. GRUB_DISABLE_RECOVERY="true"

修改文件中GRUB_CMDLINE_LINUX这行,可以设置kdump kernel的大小,一般都是128M或者256M。修改完成以后运行下面的命令更新grub的配置

  1. #grub2-mkconfig -o /boot/grub2/grub.cfg

然后重启系统,使上面对系统的配置有效。

3、配置kdump类型

上面我们已经按照kdump的要求对系统进行了一系列的配置,下面就是配置kdump,配置文件是/etc/kdump.conf。默认的vmcore文件存储在/var/crash目录下。可以修改这个路径:

  1. path /usr/local/cores //这里必须要保证这个路径是存在的,否则启动kdump服务会失败

或者你直接把core dump文件写入一个设备中,把配置文件中的#raw /dev/vg/lv_kdump这一行的#符号去掉然后把后面的改成自己的设备路径,如下

  1. raw /dev/sdb1

如果要把dump文件存储在一个使用NFS协议的远程机器上,把配置文件中的#nfs my.server.com:/export/tmp这行前面的#符号删除,然后后面参数部分替换成自己的主机名和路径名。如下

  1. nfs penguin.example.com:/export/cores

4、配置core收集器

为了减少为vmcore转储文件的大小,内核转储允许你指定一个外部应用程序(一个core收集器)对数据进行压缩,和可选的删除所有不相关的信息。目前,唯一完全支持的core收集器是makedumpfile。

为了启用core收集器,在root权限下修改/etc/kdump.conf配置文件,删除#core_collector maledumpfile -l --message-level 1 -d 31 这行前面的#符号,然后修改为如下(启动dump文件的压缩,加上-c参数):

  1. core_collector makedumpfile -c

为了删除dump文件中的某些页(写0的或者空闲的页),加上-d参数,-d参数后面的数字表示你想要省略的页面总数。如下:

  1. core_collector makedumpfile -d 17 -c

5、配置kdump的默认操作

当kdump在指定的位置创建core文件失败,root文件系统会被挂在,kdump会试图把dump文件保存在本地。可以通过修改/etc/kdump.conf配置文件修改这个默认操作。修改#default shell这行,然后把shell替换为自己想要的默认动作。例如:

  1. default halt

如何启用kdump?

在系统boot时候启动kdump服务

  1. systemctl enable kdump.service

现在应该为多用户启用了kdump服务,相对的systemctl stop kdump可以禁用这个服务。在root权限下,使用下面的命令可以使kdump服务在当前会话可用:

  1. systemctl start kdump.service

这里要注意的是当kdump服务启动时候,前面定义为内核转储目标目录必须存在, 否则服务将失败。此时kdump服务已经开启成功了,可以使用下面命令来查看是否开启成功。

  1. systemctl status kdump.service

如果开启失败的话,会有如下输出:



会有很多的红字输出,第一个红字是表示开启失败了。在最后一行红字的上两行提示了是什么原因导致开启失败,上图开启失败是因为存储dump 文件的路径不存在。修改以后就成功了。

kdump内核的更多相关文章

  1. kdump内核转储

    目录 CentOS 7.5 配置Kdump 安装Kdump 安装Kdump图形化 配置保留内存 配置kdump类型 核心转储到本地 核心转储到设备 使用NFS指定核心转储 使用SSH指定核心转储 配置 ...

  2. 使用kdump内核调试工具遇到的问题及解决

    修改linux内核代码或者内核模块的时候,搞不好就会造成linux死机崩溃,crash死机后/var/log/kern.log里面不会有任何异常信息记录.这时候kdump就会派上用场了,网上kdump ...

  3. 手动添加kdump

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

  4. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  5. 【转】Linux内核调试方法总结

    目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_sta ...

  6. Centos7/RHEL7 开启kdump

    Kdump是一种基于kexec的Linux内核崩溃捕获机制,简单来说系统启动时会预留一块内存,当系统崩溃调用命令kexec(kdump kernel)在预留的内存中启动kdump内核, 该内核会将此时 ...

  7. kdump简单的介绍

    kdump是2.6.16之后,内核引入的一种新的内核崩溃现场信息收集工具.当一个内核崩溃后(我们称之为panic),内核会使用kexec(类似于进程的exec,把当前内核换掉)进入到一个干净的备份内核 ...

  8. CentOS 6.4中升级编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 以及Kdump配置

    在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 今天在isocpp上看到"GCC 4.8.1 released, C++11 feature ...

  9. Linux内核调试方法总结

    Linux内核调试方法总结 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2   ...

随机推荐

  1. Django的httprequest对象和httpresponse对象

    请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象,然后Django加载合适的view方法,把这个HttpRequest 对象作为第一个参数传给view方法. ...

  2. ES6入门声明

    let.var区别点 1.let只在命令所在的代码块中有效. 2.变量一定要先声明在使用,否则会报错,不存在Es5的变量提升(暂时性死区,不存在重复使用). 3.块级作用域中存在let命令,所声明的变 ...

  3. Application failed to start because it could not find or load the QT platform plugin “windows”

    只需要在.exe所在的目录下创建一个目录platforms添加进去缺失的dll即可如图: 参考链接:https://stackoverflow.com/questions/21268558/appli ...

  4. Ruby学习笔记1 -- 基本语法和数据类型, Class

    Ruby 有4种数据类型:String, Boolen, Array, Hashes Ruby 有3种操作方法:Method, attribute, ?? Ruby 有xxx: Classes, Ob ...

  5. <转载> bat 脚本基本语法 http://blog.csdn.net/bluedusk/article/details/1500629

        bat 脚本基本语法 2007-01-25 10:31 常用命令 echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起. = ...

  6. winform 之MDI容器

    MDI是指将多控件窗体在同一窗体中打开 1.设置:属性中IsMDIContainer:true; 窗体变为灰色成为MDI窗体容器 2.MDI中一般采用菜单作为打开方式 3.子级窗体在MDI中打开,需先 ...

  7. 在集群上运行Spark

    Spark 可以在各种各样的集群管理器(Hadoop YARN.Apache Mesos,还有Spark 自带的独立集群管理器)上运行,所以Spark 应用既能够适应专用集群,又能用于共享的云计算环境 ...

  8. 转载:老生常谈C++中实参形参的传递问题

    以下文章转载自:http://www.jb51.net/article/108390.htm 函数中参数的传递 这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这 ...

  9. kubernets之endpoints

    注:本文整理自网络 endpoint endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址.service配置selector,endp ...

  10. poi excel文件名或者内容中文乱码

    1.文件名乱码处理 // excel文件名 String fileName="我报表"; final SimpleDateFormat formatter = new Simple ...