写点什么

kudmp 介绍和安装

用户头像
唯爱
关注
发布于: 2020 年 05 月 29 日

一、背景介绍

      linux内核发送崩溃时,kdump会生成一个内核转储文件vmcore。 可以通过分析vmcore分析出内核崩溃的原因。 

      crash是一个被广泛应用的内核奔溃转储文件分析工具。

      使用crash调试内核转储文件,需要安装crash工具和内核调试工具kernel-debuginfo。

二、安装kudmp、crash、kernel-debuginfo



(1)kudmp介绍

A、Kexec介绍

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

B、kdump介绍

Kdump 的概念出现在 2005 左右,是迄今为止最可靠的内核转存机制,已经被主要的 linux™ 厂商选用。kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。

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

C、如何使用kdump

构建系统和 dump-capture 内核,此操作有 2 种方式可选:

1)构建一个单独的自定义转储捕获内核以捕获内核转储;

2) 或者将系统内核本身作为转储捕获内核,这就不需要构建一个单独的转储捕获内核。

方法(2)只能用于可支持可重定位内核的体系结构上;目前 i386,x86_64,ppc64 和 ia64 体系结构支持可重定位内核。构建一个可重定位内核使得不需要构建第二个内核就可以捕获转储。但是可能有时想构建一个自定义转储捕获内核以满足特定要求。

D、如何访问捕获内存

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

在 i386 体系结构上,启动的时候需要使用物理内存开始的 640K,而不管操作系统内核转载在何处。因此,这个 640K 的区域在重新启动第二个内核的时候由 kexec 备份。

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

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

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

2. 通过 /proc/vmcore。

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

E、kdump的优势

高可靠性

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

多版本支持

LKCD(Linux Kernel Crash Dump),netdump,diskdump 已被纳入 LDPs(Linux Documen-tation Project) 内核。SUSE 和 RedHat 都对 kdump 有技术支持。

FKdump 实现流程

图 1. RHEL6.2 执行流程


F、配置 kdump

安装软件包和实用程序

Kdump 用到的各种工具都在 kexec-tools 中。kernel-debuginfo 则是用来分析 vmcore 文件。从 rhel5 开始,kexec-tools 已被默认安装在发行版。所以如果使用的是 rhel5 之后的发行版,那就省去了安装 kexec-tools 的步骤。而如果需要调试 kdump 生成的 vmcore 文件,则需要手动安装 kernel-debuginfo 包。检查安装包操作:

1、rpm -qa|grep kexec

2、rpm -qa 'kernel*debuginfo*'

如果没有安装的话,需要下载debuginfo的安装包

(1)下载地址:http://linuxsoft.cern.ch/centos-debuginfo/

(2)先查看自己服务器的版本号再下载

[root@ansible ~]# uname -a

Linux ansible 3.10.0-1127.el7.x8664 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x8664 x8664 x8664 GNU/Linux

(3)下载文件名为:kernel-debuginfo-3.10.0-1127.el7.x86_64.rpm

kernel-debuginfo-common-x8664-3.10.0-1127.el7.x8664

(4)下载完成后安装:

rpm -ivh kernel-debuginfo-common-x8664-3.10.0-1127.el7.x8664(先安装)

rpm -ivh kernel-debuginfo-3.10.0-1127.el7.x86_64.rpm

3、rpm -qa | grep crash

[root@ansible 127.0.0.1-2020-05-29-13:40:47]# rpm -qa | grep crash

crash-7.2.3-10.el7.x86_64

如果没有安装,执行yum install crash



G、参数相关设置

系统内核设置选项和转储捕获内核配置选择在《使用 Crash 工具分析 Linux dump 文件》一文中已有说明,在此不再赘述。仅列出内核引导参数设置以及配置文件设置。

(1)修改内核引导参数,为启动捕获内核预留内存

centos7

1、修改grub文件

vim /etc/defaule/gurb


  需要将GRUB_CMDLINE_LINUX="crashkernel=auto..."中的auto修改为128M。一般设为128M或256M。



2、更新grub配置

  只要更改了gurb文件,都需要更改grub配置。



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


[root@ansible ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

Generating grub configuration file ...

Found linux image: /boot/vmlinuz-3.10.0-1127.el7.x86_64

Found initrd image: /boot/initramfs-3.10.0-1127.el7.x86_64.img

Found linux image: /boot/vmlinuz-0-rescue-f4f7c26690924d9a8c11e09ce7fe54d2

Found initrd image: /boot/initramfs-0-rescue-f4f7c26690924d9a8c11e09ce7fe54d2.img

done

3.重启系统

reboot



(2)修改kdump默认配置
vim /etc/kdump.conf


  其中,需要注意的三行内容是

path /var/crash #指定coredump文件放在/var/crash文件夹中
core_collector makedumpfile -c -l -message-level 1 -d 31 #加上-c表示压缩,原文件中没有
default reboot #生成coredump后,重启系统



H、启动 kdump 服务

在设置了预留内存后,需要重启机器,否则 kdump 是不可使用的。启动 kdump 服务:

centos7

systemctl start kdump.service //启动kdump
systemctl enable kdump.service //设置开机启动



检查kdump开启成功



service kdump status





三、测试配置是否有效

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

#echo 1 > /proc/sys/kernel/sysrq
#echo c > /proc/sysrq-trigger

这造成内核崩溃,如配置有效,系统将重启进入 kdump 内核,当系统进程进入到启动 kdump 服务的点时,vmcore 将会拷贝到你在 kdump 配置文件中设置的位置。RHEL 的缺省目录是 : /var/crash;然后系统重启进入到正常的内核。一旦回复到正常的内核,就可以在上述的目录下发现 vmcore 文件,即内存转储文件。可以使用之前安装的 kernel-debuginfo 中的 crash 工具来进行分析。



四、启动crash

(1)介绍命令

使用 crash 调试转储文件,需要在命令行输入两个参数:debug kernel 和 dump file,其中 dump file 是内核转储文件的名称,debug kernel 是由内核调试信息包安装的,不同的发行版名称略有不同,以 RHEL 为例:

1、centos7:/usr/lib/debug/lib/modules/3.10.0-1127.el7.x86_64/vmlinux



使用 crash -h 或 man crash 可以查看 crash 支持的一系列选项,这里仅以常用的选项为例说明如下:

-h:打印帮助信息

-d:设置调试级别

-S:使用 /boot/System.map 作为默认的映射文件

-s:不显示版本、初始调试信息等,直接进入命令行

-i file:启动之后自动运行 file 中的命令,再接受用户输入

(2)执行crash命令

KERNEL: 系统崩溃时运行的 kernel 文件

DUMPFILE: 内核转储文件

CPUS: 所在机器的 CPU 数量

DATE: 系统崩溃的时间

TASKS: 系统崩溃时内存中的任务数

NODENAME: 崩溃的系统主机名

RELEASE: 和 VERSION: 内核版本号

MACHINE: CPU 架构

MEMORY: 崩溃主机的物理内存

PANIC: 崩溃类型,常见的崩溃类型包括:

SysRq (System Request):通过魔法组合键导致的系统崩溃,通常是测试使用。通过 echo c > /proc/sysrq-trigger,就可以触发系统崩溃。

oops:可以看成是内核级的 Segmentation Fault。应用程序如果进行了非法内存访问或执行了非法指令,会得到 Segfault 信号,一般行为是 coredump,应用程序也可以自己截获 Segfault 信号,自行处理。如果内核自己犯了这样的错误,则会弹出 oops 信息。





(3)查看vmcore信息

[root@ansible 127.0.0.1-2020-05-29-13:40:47]# crash /usr/lib/debug/lib/modules/3.10.0-1127.el7.x86_64/vmlinux vmcore

crash 7.2.3-10.el7

Copyright (C) 2002-2017 Red Hat, Inc.

Copyright (C) 2004, 2005, 2006, 2010 IBM Corporation

Copyright (C) 1999-2006 Hewlett-Packard Co

Copyright (C) 2005, 2006, 2011, 2012 Fujitsu Limited

Copyright (C) 2006, 2007 VA Linux Systems Japan K.K.

Copyright (C) 2005, 2011 NEC Corporation

Copyright (C) 1999, 2002, 2007 Silicon Graphics, Inc.

Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.

This program is free software, covered by the GNU General Public License,

and you are welcome to change it and/or distribute copies of it under

certain conditions. Enter "help copying" to see the conditions.

This program has absolutely no warranty. Enter "help warranty" for details.

GNU gdb (GDB) 7.6

Copyright (C) 2013 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-unknown-linux-gnu"...

WARNING: kernel relocated [382MB]: patching 87167 gdb minimal_symbol values

KERNEL: /usr/lib/debug/lib/modules/3.10.0-1127.el7.x86_64/vmlinux

DUMPFILE: vmcore [PARTIAL DUMP]

CPUS: 4

DATE: Fri May 29 13:40:43 2020

UPTIME: 00:05:22

LOAD AVERAGE: 0.01, 0.15, 0.10

TASKS: 139

NODENAME: ansible

RELEASE: 3.10.0-1127.el7.x86_64

VERSION: #1 SMP Tue Mar 31 23:36:51 UTC 2020

MACHINE: x86_64 (2501 Mhz)

MEMORY: 2 GB

PANIC: "SysRq : Trigger a crash"

PID: 9328

COMMAND: "bash"

TASK: ffffa145b7671070 [THREAD_INFO: ffffa145b92a8000]

CPU: 0

STATE: TASK_RUNNING (SYSRQ)

crash>

(4)crash 内置命令简介

crash 命令行启动后,可以通过一些内置命令来打印系统崩溃前的信息。



1、bt - backtrace

bt 命令用于查看系统崩溃前的堆栈等信息,这是系统调试中非常常用和好用的一个命令。



如上输出中,以“# 数字”开头的行为调用堆栈,即系统崩溃前内核依次调用的一系列函数,通过这个可以迅速推断内核在何处崩溃。

2、log - dump system message buffer

log 命令可以打印系统消息缓冲区,从而可能找到系统崩溃的线索。log 命令的截图如下(为节省篇幅,已将部分行省略):



3、ps - display process status information

ps 命令用于显示进程的状态,(如图)带 > 标识代表是活跃的进程。ps 命令的截图如下(省略部分行):



4、dis - disassembling instruction

dis 命令用于对给定地址的内容进行反汇编。dis 命令的截图如下:



参考文章:https://www.ibm.com/developerworks/cn/linux/l-cn-dumpanalyse/index.html

https://www.ibm.com/developerworks/cn/linux/l-cn-kdump4/index.html?ca=drs



用户头像

唯爱

关注

天行健,君子以自强不息~ 2018.03.22 加入

梦想还是要有的,万一实现了呢!

评论

发布
暂无评论
kudmp介绍和安装