配置 kdump
从您的 GUI 控制台运行以下命令
注意:在运行以下命令之前,请确保您处于运行级别 5,否则它会抛出错误。
# system-config-kdump
运行它后,将出现如下所示的 GUI 控制台
基本设置选项卡
Basic Settings 选项卡使我们能够配置为 kdump 内核保留的内存量。
为此,请选择 bananaal kdump memory settings 单选按钮,然后单击 New kdump Memory 字段旁边的向上和向下箭头按钮以增加或者减少该值。
请注意,Usable Memory 字段会相应更改,显示系统可用的剩余内存。
目标设置选项卡
目标设置选项卡允许我们指定 vmcore 转储的目标位置。
它可以作为文件存储在本地文件系统中,直接写入设备,或者使用 NFS(网络文件系统)或者 SSH(安全shell)协议通过网络发送。
注意:通过 SSH 将核心文件传输到远程目标时,需要对核心文件进行序列化以进行传输。
这会在目标系统的 /var/crash/目录中创建一个 vmcore.flat 文件,崩溃实用程序无法读取该文件。
要将 vmcore.flat 转换为崩溃时可读的转储文件,请在目标系统上以 root 身份运行以下命令
# /usr/sbin/makedumpfile -R "/tmp/vmcore-`date`" < "vmcore.flat"
过滤设置选项卡
Filtering Settings 选项卡使我们能够为 vmcore 转储选择过滤级别。
专家设置选项卡
Expert Settings 选项卡使我们可以选择要使用的内核和初始 内存 磁盘,以及自定义传递给内核和核心收集器程序的选项。
为了减小 vmcore 转储文件的大小,kdump 允许我们指定一个外部应用程序(即核心收集器)来压缩数据,并可选择忽略所有不相关的信息。
要启用转储文件压缩,请添加 -c 参数。
core_collector makedumpfile -c
要从转储中删除某些页面,请添加 -d value 参数,其中 value 是要省略的页面值的总和,如下表所述
例如,要同时删除零页和空闲页,请使用以下命令:
core_collector makedumpfile -d 17 -c
选项 | 描述 |
---|---|
1 | 零页 |
2 | 缓存页面 |
4 | 缓存私密页 |
8 | 用户页面 |
16 | 空闲页面 |
完成后保存并退出控制台。接下来确保 kdump 服务已启动并启用它在每次重新启动时启动
[root@localhost ~]# /etc/init.d/kdump status Kdump is operational [root@localhost ~]# chkconfig kdump --list kdump 0:off 1:off 2:off 3:on 4:on 5:on 6:off
使用 CLI 配置 kdump
用于定义 kdump 设置的配置文件是 /etc/kdump.conf。
我们可以在与我们的案例相同的文件中添加或者更改相同的参数,因为我们已经使用了 GUI 控制台中的默认设置,文件将自动更新,如下所示
# less /etc/kdump.conf #raw /dev/sda5 #ext4 /dev/sda3 #ext4 LABEL=/boot #ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937 #net my.server.com:/export/tmp #net user@my.server.com #core_collector scp #core_collector cp --sparse=always #extra_bins /bin/cp #link_delay 60 #kdump_post /var/crash/scripts/kdump-post.sh #extra_bins /usr/bin/lftp #disk_timeout 30 #extra_modules gfs2 #options modulename options #default shell #debug_mem_level 0 #force_rebuild 1 #sshkey /root/.ssh/kdump_id_rsa path /var/crash core_collector makedumpfile -c -d 17
grub.conf 文件示例
# less /etc/grub.conf default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-358.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-358.el6.x86_64 root=UUID=c7c70914-09c8-475a-b990-07eb728fcbd5 ro rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-358.el6.x86_64.img
分析 kdump
要创建一个测试场景,我们可以使用以下命令手动使内核崩溃
echo 1 > /proc/sys/kernel/sysrq echo c > /proc/sysrq-trigger
这会强制Linux内核崩溃,地址-YYYY-MM-DD-HH:MM:SS/vmcore 文件会被复制到你在配置中选择的位置(也就是默认的 /var/crash/))。
要分析 vmcore 转储文件,我们必须安装 crash 和 kernel-debuginfo 包。
# yum install crash
要安装 kernel-debuginfo 包,请确保已安装 yum-utils 包并以 root 身份运行以下命令:
# debuginfo-install kernel
注意:要安装内核调试,您需要访问包含所有调试 rpm 的存储库。 对于 Red Hat,您需要适当的订阅,对于 CentOS,您需要在 /etc/yum.repos.d/CentOS-Debuginfo.repo 中启用存储库
CentOS-Debuginfo.repo 示例
[debug] name=CentOS-6 - Debuginfo baseurl=http://debuginfo.centos.org/6/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-6 enabled=1
将上面文件中的 enable 0 设为 1。
运行crash实用程序
[root@localhost ~]# crash /usr/lib/debug/lib/modules/2.6.32-358.el6.x86_64/vmlinux /var/crash/127.0.0.1-2014-02-08-07:55:25/vmcore crash 6.1.0-5.el6 Copyright (C) 2002-2012 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.3.1 Copyright (C) 2011 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"... KERNEL: /usr/lib/debug/lib/modules/2.6.32-358.el6.x86_64/vmlinux DUMPFILE: /var/crash/127.0.0.1-2014-02-08-07:55:25/vmcore [PARTIAL DUMP] CPUS: 1 DATE: Sun Nov 8 02:25:21 2014 UPTIME: 00:12:43 LOAD AVERAGE: 0.00, 0.01, 0.01 TASKS: 183 NODENAME: localhost.localdomain RELEASE: 2.6.32-358.el6.x86_64 VERSION: #1 SMP Fri Nov 22 00:31:26 UTC 2013 MACHINE: x86_64 (2594 Mhz) MEMORY: 2 GB PANIC: "Oops: 0002 [#1] SMP " (check log for details) PID: 2482 COMMAND: "bash" TASK: ffff8800377a7500 [THREAD_INFO: ffff88007ae3c000] CPU: 0 STATE: TASK_RUNNING (PANIC)
显示消息缓冲区
要显示内核消息缓冲区,请在交互式提示符下键入 log 命令。
crash> log Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.32-358.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Nov 22 00:31:26 UTC 2013 Command line: ro root=UUID=c7c70914-09c8-475a-b990-07eb728fcbd5 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet KERNEL supported cpus: Intel GenuineIntel AMD AuthenticAMD Centaur CentaurHauls Disabled fast string operations BIOS-provided physical 内存 map: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved) BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved) BIOS-e820: 0000000000100000 - 000000007fee0000 (usable) BIOS-e820: 000000007fee0000 - 000000007feff000 (ACPI data) BIOS-e820: 000000007feff000 - 000000007ff00000 (ACPI NVS) BIOS-e820: 000000007ff00000 - 0000000080000000 (usable)
KDUMP 的内存要求
为了让 kdump 能够捕获内核崩溃转储并将其保存以供进一步分析,必须为捕获内核永久保留一部分系统内存。
在某些系统上,可以通过使用引导加载程序配置文件中的 crashkernel=auto 参数或者通过在图形配置实用程序中启用此选项来自动为 kdump 分配内存。
保留的内存量由用户决定或者使用,默认为 128 MB 加上每 TB 物理内存的 64 MB(即,对于具有 1 TB 物理内存的系统,总共 192 MB)。
架构 | 需要内存 |
---|---|
AMD64 and Intel 64 (x86_64) | 2 GB. |
IBM POWER (ppc64) | 2 GB. |
IBM System z (s390x) | 4GB |
为了在系统上使用 kdump 服务,请确保我们安装了 kexec-tools 包。
为此,请以 root 身份在 shell 提示符下键入以下内容:
# yum install kexec-tools
我们可以使用 GUI 控制台进行配置,但请确保安装了以下软件包
# yum install system-config-kdump
显示回溯
要显示内核堆栈跟踪,请在交互式提示符下键入bt命令。您可以使用bt pid显示所选进程的回溯。
crash> bt PID: 2482 TASK: ffff8800377a7500 CPU: 0 COMMAND: "bash" #0 [ffff88007ae3d9e0] machine_kexec at ffffffff81035b7b #1 [ffff88007ae3da40] crash_kexec at ffffffff810c0db2 #2 [ffff88007ae3db10] oops_end at ffffffff815111d0 #3 [ffff88007ae3db40] no_context at ffffffff81046bfb #4 [ffff88007ae3db90] __bad_area_nosemaphore at ffffffff81046e85 #5 [ffff88007ae3dbe0] bad_area at ffffffff81046fae #6 [ffff88007ae3dc10] __do_page_fault at ffffffff81047760 #7 [ffff88007ae3dd30] do_page_fault at ffffffff8151311e #8 [ffff88007ae3dd60] page_fault at ffffffff815104d5 [exception RIP: sysrq_handle_crash+22] RIP: ffffffff8133d626 RSP: ffff88007ae3de18 RFLAGS: 00010096 RAX: 0000000000000010 RBX: 0000000000000063 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000063 RBP: ffff88007ae3de18 R8: 0000000000000000 R9: 203a207152737953 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: ffffffff81affea0 R14: 0000000000000286 R15: 0000000000000004 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #9 [ffff88007ae3de20] __handle_sysrq at ffffffff8133d8e2 #10 [ffff88007ae3de70] write_sysrq_trigger at ffffffff8133d99e #11 [ffff88007ae3dea0] proc_reg_write at ffffffff811e95ae #12 [ffff88007ae3def0] vfs_write at ffffffff81180f98
现在,这些故障转储主要包含十六进制十进制值,我们可以将这些值发送给操作系统支持团队,因为如果与硬件/内核问题有关,他们可以进一步指导我们。
什么是kdump?
Kdump 是一种内核崩溃转储机制,它允许我们保存系统内存中的内容以供以后分析。
它依赖于 kexec,它可用于从另一个内核的上下文启动 Linux 内核,绕过 BIOS,并保留第一个内核的内存内容,否则会丢失。
在系统崩溃的情况下,kdump 使用 kexec 引导到第二个内核(捕获内核)。
第二个内核驻留在第一个内核无法访问的系统内存的保留部分中。
然后,第二个内核捕获崩溃内核内存的内容(崩溃转储)并保存它。