linux内核崩溃之kdump机制

kdump相关概念html

standard(production) kernel   生产内核    ,是指咱们正在使用的kernel。linux

Crash(capture)kernel             捕获内核     ,linux系统崩溃后使用的内核。ios

Kdump须要配置两个不一样目的的kernel,其中一个咱们在这里称做standard(production) kernel;另一个称之为Crash(capture)kernel。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的 ramdisk (虚拟内存盘:将内存模拟成硬盘的技术)一块儿组建一个微环境,用以对生产内核下的内存进行收集和转存。nginx

 

什么是kdumpsql

Kdump 的概念出如今 2005 左右,是迄今为止最可靠的内核转存机制,主要是用来捕获kernel crash时候产生的crash dump。shell

kdump 的优点

高可靠性bash

崩溃转储数据可从一个新启动内核的上下文中获取,而不是从已经崩溃内核的上下文。工具

 

kdump的实现原理ui

kdump机制主要包括两个组件:kdump和kexec编码

kdump 使用 kexec 启动到捕获内核,以很小内存启动以捕获转储镜像。生产内核保留了内存的一部分给捕获内核启动用。因为 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,因此第一个内核的内存得以保留。这是内核崩溃转储的本质。

简单来讲,standard kernel会正运行时发生crash,而crash(capture) Kernel 会被用来捕获production kernel crash时候产生的crash dump。

 

 

什么时kexec

kexec 原来的目的是为了节省 kernel 开发人员重启系统的时间,谁能想到这个“偷懒”的技术却孕育了最成功的内存转存机制。

kexec 是一个快速启动kernel的机制,它运行在某一正在运行的kernel中,启动一个新的kernel(这里是crash kernel),并且不用从新通过BIOS 就能够完成启动。由于通常BIOS都会花费很长的时间,尤为是在大型而且同时链接许多外部设备的Server上的环境下,BIOS会花费更多的时间

它包括 2 个组成部分:一是内核空间的系统调用 kexec_load,负责在生产内核(production kernel 或 first kernel)启动时将捕获内核(capture kernel 或 sencond kernel)加载到指定地址。二是用户空间的工具 kexec-tools,他将捕获内核的地址传递给生产内核,从而在系统崩溃的时候可以找到捕获内核的地址并运行。没有 kexec 就没有 kdump。先有 kexec 实现了在一个内核中能够启动另外一个内核,才让 kdump 有了用武之地。

如何访问捕获内存

在内核崩溃以前全部关于核心映像的必要信息都用 ELF 格式编码并存储在保留的内存区域中。ELF 头所在的物理地址被做为命令行参数(fcorehdr=)传递给新启动的转储内核。

在 i386 体系结构上,启动的时候须要使用物理内存开始的 640K,而无论操做系统内核转载在何处。所以,这个 640K 的区域在从新启动第二个内核的时候由 kexec 备份。

在第二个内核中,“前一个系统的内存”能够经过两种方式访问:

1. 经过 /dev/oldmem 这个设备接口。

一个“捕捉”设备可使用“raw”(裸的)方式 “读”这个设备文件并写出到文件。这是关于内存的 “裸”的数据转储,同时这些分析 / 捕捉工具应该足够“智能”从而能够知道从哪里能够获得正确的信息。ELF 文件头(经过命令行参数传递过来的 elfcorehdr)可能会有帮助。

2. 经过 /proc/vmcore。

这个方式是将转储(生产内存)输出为一个 ELF 格式的文件,而且可使用一些文件拷贝命令(好比 cp,scp 等)将信息读出来。同时,gdb 能够在获得的转储文件上作一些调试(有限的)。这种方式保证了内存中的页面都以正确的途径被保存 ( 注意内存开始的 640K 被从新映射了 )。

kdump的实现流程

kdump的安装配置

rhel5,rhel7

目前RHEL 五、6和SLES 10  linux distribution都会默认安装kdump。

可是咱们仍是首先简单了解下安装kdump须要哪些条件:

首先,须要在编译standard(production) kernel 以前,须要指定kernel crash dumping 相关的一组compile 选项

其次,须要在编译好的standard kernel之上,安装kernel-kdump package,这个package包含了crash(capture)kernel,crash kernel在standard kernel crash的时候被启动,所以提供了环境用来capture正处于crash中的standard kernel的dump信息。

软件包说明

package name                              package info      

kdump            kdump软件包

kexec-tools                                   kexec 软件包,kdump用到的各类工具都在此包中

kernel-debuginfo                           crash analysis package  用来分析 vmcore 文件

配置Kdump:

1 肯定kdump相关的package已经安装好:

[root@bl25p-19 sysconfig]# rpm -qa | grep kdump (rhel7 中默认已安装)
system-config-kdump-1.0.14-4.el5

[root@bl25p-19 sysconfig]# rpm -qa | grep kexec
kexec-tools-1.102pre-126.el5
[root@bl25p-19 sysconfig]# rpm -qa | grep debuginfo (rhel7 中默认已安装)
kernel-debuginfo-common-2.6.18-238.el5
kernel-debuginfo-2.6.18-238.el5

配置grub,在启动时为内核传递参数,来告知内核如何为crash kernel预留内存

title Red Hat Enterprise Linux Server (2.6.18-238.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet crashkernel=128M@16M #(XXX@YYY, xxx为大小, yyy为offset)
        initrd /initrd-2.6.18-238.el5.img

配置/etc/kdump.conf,来设定crash dump最终为存在何处,具体参见man 5 kdump.conf。默认是存放在/var/crash/[crash generated date]/vmcore

4 设置kdump服务开机是自动启动

chkconfig kdump on #开机自启动

service kdump start # 启动kdump服务

5 能够经过 kexec 加载内核镜像,让系统准备好去捕获一个崩溃时产生的 vmcore。能够经过 sysrq 强制系统崩溃。

echo “c” > /proc/sysrq-trigger

这形成内核崩溃,如配置有效,系统将重启进入 kdump 内核,当系统进程进入到启动 kdump 服务的点时,vmcore 将会拷贝到你在 kdump 配置文件中设置的位置。RHEL 的缺省目录是 : /var/crash;SLES 的缺省目录是 : /var/log/dump。而后系统重启进入到正常的内核。一旦回复到正常的内核,就能够在上述的目录下发现 vmcore 文件,即内存转储文件。
 
 
rhel7

一、安装kexec-tool

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

yum update yum install kexec-tools

二、配置grub

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

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

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

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

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

三、配置kdump类型

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

path /usr/local/cores  //这里必需要保证这个路径是存在的,不然启动kdump服务会失败

或者你直接把core dump文件写入一个设备中,把配置文件中的#raw /dev/vg/lv_kdump这一行的#符号去掉而后把后面的改为本身的设备路径,以下

raw /dev/sdb1

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

nfs penguin.example.com:/export/cores

四、配置core收集器

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

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

core_collector makedumpfile -c

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

core_collector makedumpfile -d 17 -c

五、配置kdump的默认操做

当kdump在指定的位置建立core文件失败,root文件系统会被挂在,kdump会试图把dump文件保存在本地。能够经过修改/etc/kdump.conf配置文件修改这个默认操做。修改#default shell这行,而后把shell替换为本身想要的默认动做。例如:

default halt

如何启用kdump?

在系统boot时候启动kdump服务

systemctl enable kdump.service

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

systemctl start kdump.service

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

systemctl status kdump.service
 
可使用以前安装的 kernel-debuginfo 中的 crash 工具来进行分析
相关文章
相关标签/搜索