linux内核调试之 kdump安装配置 小灰灰 2022-10-31 00:55 456阅读 0赞 [https://zhuanlan.zhihu.com/p/280737119][https_zhuanlan.zhihu.com_p_280737119] 【1】Kexec 机制 Kexec是实现 kdump 机制的关键,介绍kdump之前先介绍下linux kexec机制。kexec 是 Linux 内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。起初是方便系统可以极其快速地重新启动,后来在crash dump领域得到新的应用。 Kexec包括 2 个组成部分:一是内核空间的系统调用 kexec\_load,负责在生产内核(production kernel 或 first kernel)启动时将捕获内核(capture kernel 或 sencond kernel)加载到指定地址。二是用户空间的工具 kexec-tools,他将捕获内核的地址传递给生产内核,从而在系统崩溃的时候能够找到捕获内核的地址并运行。 【2】kdump原理 1、什么是kdump? Kdump 的概念出现在 2005 左右,是迄今为止最可靠的内核转存机制,已经被主要的 linux™ 厂商选用。kdump是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做**捕获内核**,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于 kdump 利用 kexec 启动捕获内核,**绕过了 BIOS**,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。 2、如何使用 kdump? kdump 需要两个不同目的的内核,生产内核和捕获内核。有两种方式: 1、构建一个单独的自定义转储捕获内核以捕获内核转储; 2、或者将系统内核本身作为转储捕获内核,这就不需要构建一个单独的转储捕获内核。 方法2 只能用于可支持可重定位内核的体系结构上;目前有 i386,x86\_64,ppc64 和 ia64 。 3、如何访问**捕获内存** 在内核崩溃之前所有关于核心映像的必要信息都用** ELF 格式编码并存储在保留的内存区域中**。ELF 头所在的物理地址被作为命令行参数(fcorehdr=)传递给新启动的转储内核。 在第二个内核中,“前一个系统的内存”可以通过两种方式访问: 1) 通过 /dev/oldmem 这个设备接口。 一个“捕捉”设备可以使用“raw”(裸的)方式 “读”这个设备文件并写出到文件(根据ELF头信息定位); 2)通过 /proc/vmcore。 这个方式是将转储输出为一个 ELF 格式的文件,并且可以使用一些文件拷贝命令(比如 cp,scp 等)将信息读出来。 【3】安装配置kdump (1)安装软件包 Kdump 用到的各种工具都在** kexec-tools** 中。**kernel-debuginfo** 则是用来分析 vmcore 文件。 1、很多发行版系统预装了kexec-tools,可以使用命令查看: <table> <tbody> <tr> <td>rpm -qa|grep kexec</td> </tr> <tr> <td>kexec-tools-2.0.3-0.18.17</td> </tr> </tbody> </table> 如果没有可以yum install 或者源码安装 2、kernel-debuginfo (2)配置系统内核和捕捉内核都需要的**内核选项** CONFIG\_KEXEC CONFIG\_SYSFS CONFIG\_DEBUG\_INFO CONFIG\_CRASH\_DUMP CONFIG\_PROC\_VMCORE 其他 (3)为kdump预留内存空间 如果是suse11 系统X86和X86\_64结构,参考以下配置预留表格 ![101bad8fdc3759f1ea62720ce406b305.png][] SUSE11 SP4上cmdline: root=/dev/sda2 resume=/dev/sda1 splash=silent crashkernel=256M-:128M vga=0x317 centos8上的 cmdline: BOOT\_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-193.19.1.el8\_2.x86\_64 root=/dev/mapper/cl-root ro crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet (4)检查kdump状态 SUSE11: <table> <tbody> <tr> <td>rckdump<br> status</td> </tr> </tbody> </table> redhat: <table> <tbody> <tr> <td>service<br> kdump status</td> </tr> </tbody> </table> (5)kdump配置文件 在redhat、centos上: /etc/kdump.conf SUSE11上: /etc/sysconfig/kdump 下面贴出一个centos8里的配置(可自己根据配置注释进行配置): <table> <tbody> <tr> <td>#raw<br> /dev/vg/lv_kdump<br> #ext4<br> /dev/vg/lv_kdump<br> #ext4 LABEL=/boot<br> #ext4<br> UUID=03138356-5e61-4ab3-b58e-27507ac41937<br> #nfs<br> my.server.com:/export/tmp<br> #ssh<br> user@my.server.com<br> #sshkey<br> /root/.ssh/kdump_id_rsa<br> path<br> /var/crash<br> core_collector<br> makedumpfile -l --message-level 1 -d 31<br> #core_collector<br> scp<br> #kdump_post<br> /var/crash/scripts/kdump-post.sh<br> #kdump_pre<br> /var/crash/scripts/kdump-pre.sh</td> </tr> </tbody> </table> 配置完成后使用mkdumprd -f 来创建kdump使用的initrd(SUSE11) (6)修改cmdline,加上crashkernel /boot/grub/menu.list 或者 /boot/grub/grub.conf 【4】参考: [CENTOS7 配置KDUMP和使用CRASH工具分析CRASH现场blog.csdn.net][CENTOS7 _KDUMP_CRASH_CRASH_blog.csdn.net] [Linux内核调试方法总结 - FGQ的开源人生 - OSCHINA - 中文开源技术交流社区my.oschina.net![图标][89fd8a48aa6693c407b55d50cdb1f0ed.png]][Linux_ - FGQ_ - OSCHINA - _my.oschina.net_89fd8a48aa6693c407b55d50cdb1f0ed.png] [https_zhuanlan.zhihu.com_p_280737119]: https://zhuanlan.zhihu.com/p/280737119 [101bad8fdc3759f1ea62720ce406b305.png]: /images/20221024/57568c6ac7f248e2b201f8e7711c4f99.png [CENTOS7 _KDUMP_CRASH_CRASH_blog.csdn.net]: https://link.zhihu.com/?target=https%3A//blog.csdn.net/u014361034/article/details/54916002 [89fd8a48aa6693c407b55d50cdb1f0ed.png]: https://img-blog.csdnimg.cn/img_convert/89fd8a48aa6693c407b55d50cdb1f0ed.png [Linux_ - FGQ_ - OSCHINA - _my.oschina.net_89fd8a48aa6693c407b55d50cdb1f0ed.png]: https://link.zhihu.com/?target=https%3A//my.oschina.net/fgq611/blog/113249%23OSC_h4_27
还没有评论,来说两句吧...