Atlas 800-3000 SLES12.5 Kdump 问题
2024/11/13
68
问题信息
问题来源 | 产品大类 | 产品子类 | 关键字 |
---|---|---|---|
版本测试 | 安装部署 | 驱动固件 | 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
问题现象:
- 确认OS安装过程中已经使能kdump。
- 通过echo c > /proc/sysrq-trigger触发NMI,此时查看串口是否显示进入第二内核,kdump正在收集数据的过程,数据100%后,单板自动复位。
- 再次登陆OS查看/var/crash下是否生成了vmcore,dmesg信息中是否有异常信息,未产生address-YYYY-MM-DD-HH:MM:SS/vmcore文件,且生产的文件时间也不对。
原因分析
- vmcore 未生成问题为 makedumpfile 代码问题。
- crash kernel启动参数添加了noefi,导致rtc驱动没有起来,crash kernel从rtc 读取时间,然后更新到系统,所以生成的目录时间不对。
解决措施
- vmcore 未生成问题可以通过从官网下载 makedumpfile-1.6.5-3.3.1.aarch64.rpm 补丁解决解决。
- 生成文件夹时间不对问题临时解决方案:升级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 |
本页内容