昇腾故障案例详情页

Atlas 800-3000 SLES12.5 Kdump 问题

更新时间: 2021/09/06

暂无评分

问题信息

问题来源产品大类产品子类关键字
版本测试安装部署驱动固件 kdump、makedumpfile、crash kernel

问题现象描述

硬件配置:

◆【版本信息】:

BIOS版本:1.29 (U75)

iBMC版本:5.62 (U68)

CPLD版本:3.13 (U6076)

OS版本:SLES12.5

OS内核:4.12.14-120.default

MEZZ卡:/

HUAWEI Kunpeng 920 5220

Hynix 32768 MB 2400 MHz * 2

问题现象:

  1. 确认OS安装过程中已经使能kdump。
  2. 通过echo c > /proc/sysrq-trigger触发NMI,此时查看串口是否显示进入第二内核,kdump正在收集数据的过程,数据100%后,单板自动复位。

  3. 再次登陆OS查看/var/crash下是否生成了vmcore,dmesg信息中是否有异常信息,未产生address-YYYY-MM-DD-HH:MM:SS/vmcore文件,且生产的文件时间也不对。

关键过程、根本原因分析

根本原因分析:
  1. vmcore 未生成问题为 makedumpfile 代码问题。
  2. crash kernel启动参数添加了noefi,导致rtc驱动没有起来,crash kernel从rtc 读取时间,然后更新到系统,所以生成的目录时间不对。

结论、解决方案及效果

解决方案:
  1. vmcore 未生成问题可以通过从官网下载 makedumpfile-1.6.5-3.3.1.aarch64.rpm 补丁解决解决。
  2. 生成文件夹时间不对问题临时解决方案:升级kdump到 kdump-0.8.16-11.5.1.19602.0.PTF.1170336.aarch64.rpm 或更新的版本。

    kdump 下载链接:https://ptf.suse.com/b27a428a0750dc195e58933ba4411674/sles12-sp5/19602/aarch64/20200504/

经验总结、预防措施和规范建议

备注

在/etc/sysconfig/kdump设置 KDUMP_PRESCRIPT="/bin/bash",让crash kernel进入shell

在shell中查看date,发现时间确实不正确,和crash生成时间一致。

查看crash kernel启动log,发现内核在更新时间时没有找到rtc设备,说明rtc驱动没有正常加载

[ 2.416817] hctosys: unable to open rtc device (rtc0)

对比正常启动的log,内核时先读取rtc时间,然后更新到系统时间

[ 1.551780] rtc-efi rtc-efi: rtc core: registered rtc-efi as rtc0

[ 1.581932] rtc-efi rtc-efi: setting system clock to 2020-04-13 05:56:46 UTC (1586757406)

查看rtc驱动代码(drivers/rtc/rtc-efi.c),发现在注册rtc设备前,会调用efi.get_time()读取时间。

进一步跟踪,发现efi.get_time()最终是调用efi的runtime service,获取RTC时间。

说明efi的runtime service出现异常了。

查看crash kernel的内核启动参数,发现比正常启动多了一个noefi

bash-4.3# cat /proc/cmdline

mitigations=auto quiet console=tty0 console=ttyS0,115200n8 modprobe.blacklist=hibmc_drm elevator=deadline sysrq=yes reset_devices acpi_no_memhotplug cgroup_disable=memory nokaslr numa=off irqpoll nr_cpus=1 root=kdump rootflags=bind rd.udev.children-max=8 noefi acpi_rsdp=0x20570000

noefi参数说明如下:

noefi Disable EFI runtime services support.

crash kernel启动参数是在 /lib/kdump/load.sh 中生成的,当/sys/firmware/efi/systab文件存在时,会增加noefi参数。

function build_kdump_commandline()

{

local kdump_kernel="$1"

local commandline="$KDUMP_COMMANDLINE"

if [ -z "$commandline" ] ; then

……

if [ -f /sys/firmware/efi/systab ] ; then

……

commandline="$commandline noefi acpi_rsdp=$acpi_addr"

fi

fi

commandline="$commandline $KDUMP_COMMANDLINE_APPEND"

……

}

将这一行的noefi删除,问题解决;

这只是临时解决方案,需要提单到后台,确认是不是kdump bug,提供正式补丁。

commandline="$commandline noefi acpi_rsdp=$acpi_addr"

commandline="$commandline acpi_rsdp=$acpi_addr"

x86和arm的区别:

x86使用的是 rtc-cmos,内核直接从硬件读取rtc时间。

CONFIG_RTC_DRV_CMOS=y

而arm使用的是rtc-efi,内核通过efi runtime service读取rtc时间

CONFIG_RTC_DRV_EFI=y

CONFIG_RTC_HCTOSYS=y

本页内容

该页面对您有帮助吗?
我要评分