Skip to content

kdump/crash

1. 简介

kdump作为linux系统关键的问题定位调测技术,默认安装并激活(Anaconda安装时也已默认勾选kdump)。

2. kdump安装

查看确认kdump状态:

systemctl status kdump.service

如果显示active,则说明kdump服务处于激活状态:

● kdump.service - Crash recovery kernel arming
     Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
     Active: active (exited) 

如果在安装时禁用了kdump,则可以通过以下步骤安装、激活kdump服务:

sudo dnf install kexec-tools
sudo systemctl start kdump.service
sudo systemctl status kdump.service

3. kdump配置

kdump的配置主要有3部分。

配置预留内存
预留内存是为了在系统crash时crashkernel能正常工作而预留的内存,与物理内存大小以及系统实际使用的物理内存大小都有关系。一般的,物理内存越大、被使用的物理内存越多,需要为crashkernel预留更多的内存。 如果kdump服务状态正常,但发生crash时没成功生成crash core,则就要考虑预留是否内存不足导致kdump工作异常。

kexec-tools软件包的kdump安装脚本根据不同的架构给出不同的配置,可以看到不同的物理内存大小设置不同的预留内存值:

if [[ $_arch == "x86_64" ]] || [[ $_arch == "s390x" ]]; then
        _ck_cmdline="1G-4G:192M,4G-64G:256M,64G-:512M"
    elif [[ $_arch == "aarch64" ]]; then
        _ck_cmdline="2G-:448M"

修改该配置,可以通过kdumpctl estimate命令估算crashkernel预留内存值,可能不准确,可作为设置适当的crashkernel预留内存值的参考。

sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX="i8042.noaux quiet console=ttyS0,115200 console=tty0 crashkernel=512M-64G:256M,64G-128G:512M,128G-:768M biosdevname=0 net.ifnames=    0 intel_idle.max_cstate=1 intel_pstate=disable"
重新生成grub配置文件:
sudo grub2-mkconfig -o /boot/efi/EFI/opencloudos/grub.cfg
或者使用grubby来设置:
sudo grubby --update-kernel ALL --args "crashkernel=自定义值”
设置后,需要reboot来使配置生效。

配置转储目标
crashkernel将已经发生crash的内核的内存等信息转储出来,以供后续的分析定位,转储相关的设置在配置文件/etc/kdump.conf中。

默认以文件形式转储在本地文件系统目录/var/crash中,并进行了内存过滤、压缩存储:

path /var/crash
core_collector makedumpfile -l --message-level 7 -d 31
内存过滤、压缩存储的详细信息可以通过man makedumpfile查看。

kdump内核配置
crashkernel启动时的命令行参数在配置文件/etc/sysconfig/kdump中。 设置后,通过如下命令来配置生效:

sudo systemctl restart kdump.service

4. 测试kdump配置

通过如下命令触发内核crash确认kdump配置正常:

su - root
echo c > /proc/sysrq-trigger
系统重启后,在配置的转储目录(/var/crash)下可以看到生成的vmcore文件以及vmcore-dmesg.txt等日志文件。

5. crash

vmcore生成后,可以通过crash工具进行解析、定位问题。

5.1 安装

安装crash工具:

sudo dnf install crash

解析vmcore文件,需要有调试符号表文件,系统安装的内核一般都去除了调试符号,因此需要安装调试符号表文件。

sudo dnf debuginfo-install kernel
file /usr/lib/debug/lib/modules/$(uname -r)/vmlinux
/usr/lib/debug/lib/modules/6.1.26-2303.1.0.ocs23.x86_64/vmlinux: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=cc33cfbef9122f72d0ebbec283ebf6ffcfe9c06e, with debug_info, not stripped

5.2 运行crash工具

运行crash工具需要2个参数:带调试符号表的内核和vmcore文件。

sudo crash /usr/lib/debug/lib/modules/$(uname -r)/vmlinux vmcore
进入crash后,可以执行help命令查看crash支持的命令:
crash> help

*              files          mod            sbitmapq       union          
alias          foreach        mount          search         vm             
ascii          fuser          net            set            vtop           
bpf            gdb            p              sig            waitq          
bt             help           ps             struct         whatis         
btop           ipcs           pte            swap           wr             
dev            irq            ptob           sym            q              
dis            kmem           ptov           sys            
eval           list           rd             task           
exit           log            repeat         timer          
extend         mach           runq           tree           

crash version: 8.0.2-3.ocs23   gdb version: 10.2
For help on any command above, enter "help <command>".
For help on input options, enter "help input".
For help on output options, enter "help output".
通过man crash了解更多信息。