2 min read

kdump调试

1-背景

kdump是linux用来分析crash问题的一种手段,在内核发生crash后,会主动启动第二内核,将当前内存中的所有状态转存至本地文件vmcore中。

但是有些服务器总是无法正常生产vmcore,我们这里总结一些简单的调试手段。

我们可以通过主动触发一个crash来验证机器是否可以生成kdump

echo c > /proc/sysrq-trigger

2-用户态服务

kdump存在一个用户态服务kdump.service,我们可以通过查看这个服务状态检查用户态是否已经住备好了正常捕获内核panic事件。

如下是一个正常的kdump.service状态

$ systemctl status kdump.service
● kdump.service - Crash recovery kernel arming
   Loaded: loaded (/usr/lib/systemd/system/kdump.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2024-04-29 11:43:40 CST; 1 weeks 0 days ago
  Process: 1308 ExecStart=/usr/bin/kdumpctl start (code=exited, status=0/SUCCESS)
 Main PID: 1308 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 410253)
   Memory: 0B
   CGroup: /system.slice/kdump.service

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

如果服务存在异常,则要通过具体的报错信息解决,正常来说kdump.service会在异常后打印log并转存,具体的路径可以在上述命令的返回中检查。

3-配置文件

kdump的配置文件位于 /etc/kdump.conf,例如如下内容

path /var/crash
core_collector makedumpfile -l --message-level 7 -d 31
extra_bins /bin/sort /bin/df /bin/wc /bin/find
keep_old_dumps 1
  • 第一行:指代存在dump位置
  • 第二行:使用makedumpfile命令来收集崩溃转储,-l选项表示使用lzo压缩,--message-level 7表示设置消息级别为7,-d 31表示过滤所有不必要的信息。
  • 第三行:定义了在初始化ramdisk中包含的额外的可执行文件
  • 第四行:这个字段定义了保留旧的kdump文件的数量

4-启动行命令

在启动行中,会在有定义kdump大小的命令,如果这里配置的不合理也可能会转存失败

crashkernel=1800M-64G:256M,64G-128G:512M,128G-:768M

这里的含义是前边大小表示服务器内存大小,后边表示此时kdump的大小

5-第二内核问题

由于转存vmcore需要启动第二内核进行捕获,遇到过第二内核在启动中存在故障,每次启动后都会在第二内核中再次crash的问题。

遇到这种问题就需要串口输出到控制台上,具体分析第二内核启动阶段的日志,所以这种问题使用可以控制的虚拟机或者物理机会比较好分析。