如何使用 kdump 服务来分析内核崩溃,系统挂起,系统重启

环境

  • Red Hat Enterprise Linux (RHEL) 5
  • Red Hat Enterprise Linux (RHEL) 6

问题

  • 如何在 RHEL 上配置 kexec/kdump 服务?
  • 如何分析系统崩溃和系统重启?
  • 如何分析系统重启的原因?
  • 如何收集系统的 vmcore?
  • 如何解决在收集 vmcore 过程中遇到问题?

决议

系统版本为 RHEL 3 和 RHEL 4 的时候,由于不支持 kdump 功能,必须使用 netdump 功能。关于如何使用 netdump
请参照 How do I configure netdump on Red Hat Enterprise Linux 3 and 4?

系统是 xen 虚拟机的时候,必须使用 xendump 功能。关于如何使用 xendump,请参照 How do I configure Xendump on Red Hat Enterprise Linux 5?

系统是 KVM 和 RHEV 虚拟机的时候,请参照 How to capture vmcore dump from a KVM guest?

注意: 对于KVM 和 RHEV 虚拟机,上面的方法是在虚拟机不响应的时候的另一种收取 vmcore 的手段,这并不是强制使用的。

目录

  1. 背景 / 概述
  2. 前提条件
  3. 安装 kdump
  4. 添加启动参数
  5. 指定转储目的地
  6. 直接转储到磁盘
  7. 转储到文件系统上的一个文件
  8. 转储到网络存储设备 NFS
  9. 通过 SSH 转储到网络存储设备
  10. 转储到 SAN 设备 (For RHEL5)
  11. 转储到 SAN 设备 ( For RHEL6 with blacklist of multipath)
  12. 转储到 SAN 设备 ( For RHEL6 with multipath device)
  13. 转储目的地的大小
  14. 指定页过滤和压缩
  15. 集群系统
  16. 测试
  17. kdump被触发的条件
  18. 评论
背景 / 概述

kexec 利用了 fastboot 机制,使得系统可以在已经运行内核的上下文中,在不通过 BIOS 的情况下,重新启动另一个内核。因为在正常启动过程中,BIOS 的硬件检查很耗时间(尤其是对于有很多硬件外设的大型服务器),kexec 可以为开发人员节省很多重启系统的时间。使用 kexec 来重启系统进入普通内核是可以实现的,不过,这并不是这篇文章所要讲的内容,请参考 kexec(1) 的 man 手册来获取更多信息。

kdump 是一个用 kexec 实现的值得信赖的内核转储机制。转储信息是由新启动的内核收集的,而不是由已经崩溃的内核收集。当系统崩溃的时候,kdump利用 kexec 机制启动第二个内核。这个第二个内核,也就是转储内核,可以用很小的一部分内存启动,并且完成转储
vmcore 的任务。

第一个内核需要预留一些内存来保证第二个内核成功启动。请注意,这部分预留的内存是无法给第一个内核使用的,这也同时改变了 RHEL 所需要的最小内存的限制。关于如何计算 RHEL 使用的最小内存限制,请参照Red Hat Enterprise Linux 6 technology capabilities and limit。如果预留了第二个内核所需要的内存,那么最小内存限制必须加上这一部分的大小。

使用 kdump 功能允许不经过 BIOS 的情况下,启动转储内核,因此第一个内核的上下文可以被保留。被保留的这部分上下文,也就是收取到的 vmcore 的核心内容。

为了收取 vmcore,需要执行下面的指令。

前提条件
  • 如果要将 vmcore 转储到网络存储,需要通过 NFS 或者 ssh 访问外部服务器。

  • 无论是转储到本地,还是远端,转储目的地的空闲空间一定要足够大,否则不会正常收取到 vmcore。详见"转储目的地大小"章节,来确定需要多大的空闲空间。

  • 对于在 Xen 内核中配置kdump的情况,需要安装一个跟当前 Xen 内核版本相同的普通内核。(如果这个系统是 32 位的,并且拥有多于 4G 的内存,需要安装跟当前 Xen 内核版本相同的kernel-pae内核,而不是普通内核。)

  • 注意,内核只需要被安装即可,你仍可以继续使用 Xen 启动,安装内核之后,无需重启。

安装 KDUMP

检查是否已经安装了 kexec-tools 包:

Raw
# rpm -q kexec-tools

如果没有安装,请用 yum 安装 kexec-tools:

Raw
# yum install kexec-tools

对于 IBM Power 架构的机器(ppc64)和 IBM System z(s390x),kdump 内核是由一个单独的包 kernel-kdump 提供的
, 所以在这种架构的机器上,需要额外安装 kernel-kdump 包。

Raw
# yum install kernel-kdump

在其它架构上无需安装该包。

添加启动参数

必须在 kernel 那一行加入 crashkernel 参数,用来保存 kdump 内核所使用的内存。在 i386 和 x86_64 架构下的 RHEL5上,需要更改 /etc/grub.conf 文件,将 crashkernel=128M@16M 加入 kernel 那一行。 在 i386 和 x86_64 架构下的 RHEL6上,将 crashkernel=128M 加入 kernel 那一行。

也可以保留少于 128M 的内存,但是经过测试的最小值是 64M。

关于如何在 RHEL6 上设置 crashkernel 参数,请参照知识库文章 How should the crashkernel parameter be configured for using kdump on RHEL6?

下面是 RHEL5 上包含 crashkernel 的 /etc/grub.conf 例子:

Raw
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/hda1
#          initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Client (2.6.17-1.2519.4.21.el5)
        root (hd0,0)
        kernel /boot/vmlinuz-2.6.17-1.2519.4.21.el5 ro root=LABEL=/ rhgb quiet crashkernel=128M@16M
        initrd /boot/initrd-2.6.17-1.2519.4.21.el5.img

RHEL6 上 grub.conf 的例子:

Raw
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/mapper/vg_jrummy-lv_root
#          initrd /initrd-[generic-]version.img
# boot=/dev/vda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.32-71.7.1.el6.x86\_64)
       root (hd0,0)
       kernel /vmlinuz-2.6.32-71.7.1.el6.x86_64 ro root=/dev/mapper/vg_example-lv_root rd_LVM_LV=vg_example/lv_root rd_LVM_LV=vg_example/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=128M rhgb quiet
       initrd /initramfs-2.6.32-71.7.1.el6.x86_64.img

如果使用 RHEL5 的 Xen 内核,需要将crashkernel参数追加到 kernel 那一行,而不是 module 那一行,即便 module
那一行指定了 vmlinuz。

使用 Xen 内核的RHEL5 上 grub.conf 的例评论子:

Raw
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You do not have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /, eg.
#          root (hd0,0)
#          kernel /boot/vmlinuz-version ro root=/dev/hda1
#          initrd /boot/initrd-version.img
# boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-194.17.1.el5xen)
       root (hd0,0)
       kernel /xen.gz-2.6.18-194.17.1.el5 crashkernel=128M@16M
       module /vmlinuz-2.6.18-194.17.1.el5xen ro root=/dev/myvg/rootvol
       module /initrd-2.6.18-194.17.1.el5xen.img

指定完 crashkernel 之后,为了使系统预留 kdump 所使用的内存,必须重启系统。可以指定完 crashkernel 之后立即重启,也可以完全配置完 kdump 服务之后重启。

指定转储目的地

vmcore 存放的位置可以由 /etc/kdump.conf 配置文件指定。你可以选择直接转储到一个磁盘,一个文件,或者通过 NFS 和 SSH 的一些网络存储设备。如果没有在 /etc/kdump.conf 文件中指定转储目的地,那么默认 vmcore 会存放在根文件系统上的/var/crash 目录下。关于我们支持哪些类型的转储目的地,请参照支持库文章What targets are supported for use with kdump?

直接转储到磁盘

通过配置 kdump.conf 文件,指定转储目的地为一个裸设备。配置方法如下:

Raw
raw *<设备全路径>*

例如:

Raw
raw /dev/sda1

注意: 这种设置会丢失 /dev/sda1 中之前的所有数据。

转储到文件系统上的一个文件

kdump 可以转储到一个分区上的一个文件中。在 /etc/kdump.conf 配置文件中,指定文件系统的类型(ext3,ext4 等等),同时指定
文件系统的路径,或者文件系统 label 或者文件系统的 UUID(类似 /etc/fstab).例如:

Raw
ext3 /dev/sda1

通过上面的设置,将会以 ext3 的类型挂载 /dev/sda1, 并转储 vmcore 文件到 /dev/sda1 下的 /var/crash 目录

Raw
ext3 LABEL=/boot

通过上面的设置,将会以 ext3 的类型挂载 LABEL 为 /boot 的文件系统,并转储 vmcore 文件到该文件系统下的指定目录。
LABEL 需要手动为分区设置。例如,用下面的方法为 /dev/sdd1 加一个名为 crash 的 LABEL:

Raw
# e2label /dev/sdd1 crash

请用下面的命令查看一个磁盘的 LABEL:

Raw
# e2label /dev/sdd1

一个更为简便地确定如何指定转储目的地的方法是,查看 /etc/fstab 中是如何指定一个分区的(转储目的地没有必要通过/etc/fstab永久的挂载到挂载点上)。默认转储地点是 <filesystem>/var/crash/*<date>*/*<date>*是 vmcore 收取的时间。转储的目录可以由 /etc/kdump.conf 更改。例如:

Raw
ext3 UUID=f15759be-89d4-46c4-9e1d-1b67e5b5da82 
path /usr/local/cores

将会转储 vmcore 到 <filesystem>/usr/local/cores/ 而不是默认的<filesystem>/var/crash/

转储到网络存储设备 NFS

为了转储到 NFS 端,需要在 /etc/kdump.conf 中,指定如下的一行:

Raw
net *<nfs server>:</nfs/mount>*

例如:

Raw
net nfs.example.com:/export/vmcores

这会将 vmcore 转储到 NFS 服务器nfs.example.com/export/vmcores/*<hostname>*-*<date>*/ 目录下。
客户端(也就是收取 kdump 这一端)必须有访问该 NFS 共享目录的权限。

注意,NFSv4 是 RHEL6.3 之后开始支持的。RHEL-6.3 onwards

如果是用网卡绑定的方式访问网络存储设备的情况,有必要在 /etc/kdump.conf 中指定 bonding 模块。请参考下面的知识库文章kdump doesn't accept module options from ifcfg-* files

通过 SSH 转储到网络存储设备

通过 SSH 转储 vmcore 的时候,网络传输是加密的。由于这个优点,通过公网传输 vmcore 到一个网络存储的时候,ssh 是最佳的方式。

Raw
net *<user>@<ssh server>*

例如:

Raw
net kdump@crash.example.com

这种情况下,kdump 会通过 scp 命令以 kdump 用户的身份连接到crash.example.com服务器,同时复制 vmcore 到 /var/crash/*<hostname>*-*<date>*``*/* 目录下。kdump 用户需要取得该目录的写权限。并且,第一次配置 ssh 方式的 kdump 的时候,kdump 程序会尝试在目标机器上用 mktemp 命令创建一个临时目录以确保在目标目录上有写权限。如果所使用的目标机器上没有 mktemp 这个命令,那么 ssh 这种方式是不可用的,请采取其他方式收取 vmcore.

为了使以上的配置生效,请执行service kdump propagate命令,命令的输出如下:

Raw
# service kdump propagate
Generating new ssh keys... done,
kdump@crash.example.com's password:
/root/.ssh/kdump_id_rsa.pub has been added to
~kdump/.ssh/authorized_keys2 on crash.example.com

为了 vmcore 的正常收集,请确保转储目的地的空闲空间(本地或者远程)大于系统物理内存的大小。

转储到 SAN 设备 (For RHEL5)

取得 SAN 设备的 wwid:

Raw
# /sbin/scsi_id -g -u -s /block/sd<x>

通过更改 /etc/multipath.conf 文件,将这个 lun 加入到 multipath 的黑名单中。

Raw
blacklist {
  wwid "3600601f0d057000019fc7845f46fe011"  
}

重载 multipath 的配置

Raw
# /etc/init.d/multipathd reload  

在此 lun 上创建一个分区

Raw
# fdisk -l  
# /sbin/scsi_id -g -u -s /block/sd<x>
# fdisk /dev/sd<x>

将分区信息读入内核

Raw
# partprobe /dev/sd<x>

验证是否成功分区

Raw
# fdisk -l 

在分区上创建一个 ext3 文件系统(也可能是 ext4)

Raw
# mkfs.ext3 /dev/sd<x>1

创建一条 udev 规则

Raw
# cat 99-crashlun.rules
KERNEL=="sd*", BUS=="scsi", ENV{ID_SERIAL}=="3600601f0d057000019fc7845f46fe011", SYMLINK+="crashsan%n"

触发 udev 规则,同时避免影响到其他设备。

Raw
# echo change > /sys/block/sd<x>/sd<x>1/uevent

验证 udev 规则是否生效,查找 /dev/crashsan1 文件。

Raw
# ls /dev/

更新 /etc/fstab,加入下面的一行。

Raw
/dev/crashsan1         /var/crash       ext3    defaults    0 0

验证配置是否正确。

Raw
# mount -a 
# mount

相应地,编辑 /etc/kdump.conf 文件。

Raw
ext3 /dev/crashsan1

重新启动 kdump 服务。

Raw
# service kdump restart

触发 sysrq,并测试 kdump 功能。 这个命令会使服务器崩溃,所以如果是生产环境,请选择合适的时间做测试。

Raw
# echo 'c' > /proc/sysrq-trigger

当系统重启完成之后,查看 vmcore 是否存在。

Raw
# tree /var/crash/
/var/crash/
|-- 2012-08-03-13:57
|   `-- vmcore
`-- lost+found

这种方式是在 RHEL5 上验证过的。

Raw
# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.8 (Tikanga)

# uname -a
Linux somecoolserver.redhat.com 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
转储到 SAN 设备 ( For RHEL6 with blacklist of multipath)

Note: 这只是一个 workaround,并不是 Red Hat 所支持的方法。下面的内容仅作参考。

取得 SAN 设备的 wwid:

Raw
#/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sd<X>

通过更改 /etc/multipath.conf 文件,将这个 lun 加入到 multipath 的黑名单中。

Raw
blacklist {
  wwid "3600601f0d057000019fc7845f46fe011"  
}

重载 multipath 配置

Raw
# /etc/init.d/multipathd reload  

在此 lun 上创建一个分区

Raw
# fdisk -l  
# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sd<X>
# fdisk /dev/sd<x>

将分区信息读入内核

Raw
# partprobe /dev/sd<x>

验证是否成功分区

Raw
# fdisk -l 

在分区上创建一个 ext3 文件系统(也可能是 ext4)

Raw
# mkfs.ext3 /dev/sd<x>1

在不必要的 wwid 前添加 # 用于注释

Raw
#  cd /etc/multipath

#  vi wwids

    ex:
         # /3600144f08c3d8b000000511256f00001/
#  vi bindings

     ex: 
        # mpathc 3600144f08c3d8b000000511256f00001

重新创建 initramfs 并加入 multipath 设置。

Raw
# dracut --force --add multipath --include /etc/multipath /etc/multipath

用 UUID 的方式在 /etc/fstab 文件追加下面的行。

Raw
用 blkid 命令查看磁盘的 UUID.
# blkid

/etc/fstab 中追加的内容:

Raw
UUID=4262c8fc-23ad-42b2-9c5d-af9c64d5bb92    /var/crash    ext3    defaults        0 0

验证是否成功。

Raw
# mount -a 
# mount

相应地,更改 /etc/kdump.conf 中的内容。

Raw
ext3 UUID=4262c8fc-23ad-42b2-9c5d-af9c64d5bb92

重启 kdump 服务,并设为开机自动启动。

Raw
# service kdump restart

# chkconfig kdump on

触发 sysrq,并测试 kdump 功能。 这个命令会使服务器崩溃,所以如果是生产环境,请选择合适的时间做测试。

Raw
# echo 'c' > /proc/sysrq-trigger

当系统重启完成之后,查看 vmcore 是否存在。

Raw
# tree /var/crash/
/var/crash/
├── 127.0.0.1-2013-02-12-21:11:03
│   └── vmcore
└── lost+found

注意: 下面是系统信息.

Raw
# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.3 (Santiago)

# uname -a
Linux xxxxx 2.6.32-279.22.1.el6.x86_64 #1 SMP Sun Jan 13 09:21:40 EST 2013 x86_64 x86_64 x86_64 GNU/Linux

# rpm -qa | grep kexec
kexec-tools-2.0.0-245.el6.x86_64

# rpm -qa | grep multipath
device-mapper-multipath-0.4.9-56.el6_3.1.x86_64
device-mapper-multipath-libs-0.4.9-56.el6_3.1.x86_64
转储到 SAN 设备 ( For RHEL6 with multipath device)

注意: 这种方式是被 Red Hat 支持的,请参考下面的内容。

Raw
这种配置只能在 kexec-tools-2.0.0-245.el6.x86_64 之后的版本(包括这个版本)支持,如果使用比这个版本老的 kexec-tools,则无法为 kdump 使用多路径设备。
Raw
# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.3 (Santiago)

# uname -a
Linux xxxxx 2.6.32-279.22.1.el6.x86_64 #1 SMP Sun Jan 13 09:21:40 EST 2013 x86_64 x86_64 x86_64 GNU/Linux

# rpm -qa | grep kexec
kexec-tools-2.0.0-245.el6.x86_64

# rpm -qa | grep multipath
device-mapper-multipath-0.4.9-56.el6_3.1.x86_64
device-mapper-multipath-libs-0.4.9-56.el6_3.1.x86_64

检查多路径的状态

Raw
# multipath -ll
mpathf (3600144f08c3d8b000000511a51b10002) dm-7 
size=100G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
  |- 12:0:0:1 sdk 8:160 active ready running
  |- 13:0:0:1 sdm 8:192 active ready running
  |- 14:0:0:1 sdo 8:224 active ready running
  |- 15:0:0:1 sdq 65:0  active ready running
  `- 16:0:0:1 sds 65:32 active ready running

在 lun 上创建一个分区

Raw
# fdisk -l  
# fdisk /dev/mapper/mpath<x>

将分区信息读入内核

Raw
# partprobe /dev/mapper/mpath<x>
# multipath -r

验证是否创建成功

Raw
# fdisk -l 

在分区上创建一个 ext3 文件系统(也可以是 ext4)

Raw
# mkfs.ext3  /dev/mapper/mpath<x>p1

用 UUID 的方式在 /etc/fstab 文件追加下面的行。

用 blkid 命令查看磁盘的 UUID。

Raw

# blkid
Raw
# vi /etc/fstab
  Ex:
        UUID=b2d74f2e-2dbf-4714-9787-ba1c147c4386           /var/crash            ext4     defaults,_netdev 0 0    <---for iscsi multRestart kdump and chkconfig on.ipath
        UUID=b2d74f2e-2dbf-4714-9787-ba1c147c4386           /var/crash            ext4     defaults               0 0    <---for SAN Multipath

验证是否正确。

Raw
# mount -a 
# mount

相应地,更改 /etc/kdump.conf 文件。

Raw
ext3 UUID=b2d74f2e-2dbf-4714-9787-ba1c147c4386

重启 kdump 服务,并设为开机自动启动。

Raw
# service kdump restart

# chkconfig kdump on

触发 sysrq,并测试 kdump 功能。 这个命令会使服务器崩溃,所以如果是生产环境,请选择合适的时间做测试。

Raw
# echo 'c' > /proc/sysrq-trigger

当系统重启完成之后,查看 vmcore 是否存在。

Raw
# tree /var/crash/
/var/crash/
├── 127.0.0.1-2013-02-12-21:11:03
│   └── vmcore
└── lost+found
转储目的地的大小

vmcore 的大小是由物理内存的大小和内存的使用情况决定的。为了确保 vmcore 能被正常收集,我们需要保证磁盘有比物理内存大的空闲空间。然而,利用 core_collector 参数(请参照"Specifying Page Selection and Compression"章节),可以压缩 vmcore,也可以过滤掉一些内存页。这应该能够节省很大部分空间,但是仍然要看内存的使用情况(混乱程度)。压缩的程度是由内存的使用情况决定的,有可能压缩率较高,也有可能较低。

确定所要预留的空间大小的最好方式是用 sysrq 功能产生一个 vmcore.通过 NFS 或者 SSH 将 vmcore 存放到指定服务器中(详见上面的 "Dumping to a Network Device" 章节)可以减少不必要得本地空间预留。

指定页过滤和压缩

系统内存很大的时候,最好在使用页过滤的同时使用压缩方式。这些可以在 kdump.conf 中的 core_collector 命令中设置。目前为止,完全支持的收集 core 的工具是 makedumpfilecore_collector 的参数可以通过 makedumpfile --help 命令查看。-d 参数可以指定哪些类型的页被过滤掉。这是一种类似掩码的方式,例如:

Raw
zero pages   = 1
cache pages   = 2
cache private = 4
user  pages   = 8
free  pages   = 16

一般情况下,上面这些页都不会包含相关信息。如果想过滤掉所有的这些页,请指定 -d31。设置-c参数以后,makedumpfile会
将剩下的内存数据压缩后保存成 vmcore 文件。

Raw
# throw out zero pages (containing no data)
# core_collector makedumpfile -d 1 
# throw out all trival pages         
# core_collector makedumpfile -d 31         
# compress all pages, but leave them all
# core_collector makedumpfile -c            
# throw out trival pages and compress (recommended)
core_collector makedumpfile -d 31 -c       

注意: 改变kdump.conf文件爱你的内容以后,需要重新启动 kdump 服务 service kdump restart。如果稍后要重启整个系统的话,kdump 服务可以不用重启。

集群系统

在集群系统的环境下,在收集完成 vmcore 之前,节点可能被 fence 或 reboot,从而导致 vmcore 收集失败。所以在集群环境中,为了使 vmcore 正常收集,有必要为fence配置一个延迟时间。关于如何在集群环境中配置 kdump,请参照下面的知识库文章。How do I configure kdump for use with the RHEL High Availability Add-On?

测试

在经过上面的配置之后,需要重启系统。从16M开始的128M内存会被保留为 kdump 内核使用,普通内核无法利用。如果 free 命令查看到内存总大小少了 128M,那么证明 crashkernel 已经配置成功了。

内存预留完毕以后,启动 kdump 服务,并设为开机自动启动。

Raw
#  chkconfig kdump on
#  service kdump start

上面的命令会创建一个 /boot/initrd-kdump.img 文件。创建完成后,系统就可以正常使用 kdump 服务了。一般配置完 kdump
服务之后,我们需要对它进行测试,方法是用 sysrq 命令强制系统崩溃。

警告: 下面的命令会使系统崩溃。

Raw
# echo c > /proc/sysrq-trigger

(关于 sysrq 的详细信息,请参照 What is the SysRq facility and how do I use it?.)

上面的命令执行后,内核会 panic,然后系统重启进入 kdump 内核。当系统启动到 kdump 服务的时候,kdump 服务就会将内存信息拷贝到 /etc/kdump.conf 配置文件所指定的地点。

KDUMP被触发的条件

有很多参数可以控制 kdump 被激活的条件。kdump 可以在下面的条件下被触发。

  • 通过 NMI Watchdog 机制,检测到 System Hang 的时候。
    NMI Watchdog 机制由 nmi_watchdog=1 内核参数控制。详细内容请参照What is NMI and what can I use it for?

  • 当硬件 NMI 按钮被按下的时候。
    这个触发条件由 sysctl 的kernel.unknown_nmi_panic=1 参数指定。

  • 当发生了一个不可回收的 NMI 的时候。
    这个触发条件由 sysctl 的kernel.panic_on_unrecovered_nmi=1 参数指定。下面是有关不可回收的 NMI 的内核警告信息:

Raw
Uhhuh. NMI received for unknown reason *hexnumber* on CPU *CPUnumber*.
Do you have a strange power saving mode enabled?
Dazed and confused, but trying to continue
  • OOM-killer 也会触发内核 panic, 从而触发 kdump。
    这个触发条件由 sysctl 的vm.panic_on_oom=1 参数指定。

很多情况下,我们建议开启上面多数条件。比如,在 System Hang 发生的时候,我们建议开启kernel.unknown_nmi_panickernel.softlockup_panic, 和 nmi_watchdog=1。这会使得,在管理员不在监控系统时,系统发生故障的时候,更有可能产生
vmcore。

评论

Console 上的 frame-buffers 和 X 不能被正常支持。 所以当系统在内核参数中加入类似"vga=791"参数或者运行 X 的情况下,kexec 将 kdump 内核启动的时候,在 Console 上会出现乱码。但是kdump 内核仍然可以正常收取 vmcore,并且在收取完成之后,frame-buffers 和 X 仍然能够正常使用。

在 RHEL6.3 之后的版本中,/etc/kdump.conf 文件可以配置 debug_mem_level 参数。设置这个参数后,启动 kdump 内核时,会在 console 上打印出一些 free/used 的内存使用信息。更高的 level 意味着更详细的信息。

如果触发 kdump 之后,无法收取 vmcore ,但是能够正常重启,请参照下面的文章。checking the system's RAM

诊断步骤

    • 如果使用本地磁盘作为转储 vmcore 的目的地,并且本地磁盘的类型为 hpsa, 那么收集 vmcore 的时候,会遇到一些困难。在这种
      情况下,请保证系统上的 kexec-tools 包是最新版本。

转载于:https://www.cnblogs.com/kerneld/p/7195864.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值