You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派3B+ arm64 Linux 6.6.x内核crashkernel加载失败求助

树莓派3B+ kexec crashkernel无法启动问题

我为树莓派3B+(arm64架构)编译了基于rpi-6.6.y分支的6.6.x版本Linux内核,根文件系统来自buildroot-2025.05-arm64。运行时已确认:
[ 0.000000] crashkernel reserved: 0x0000000026000000 - 0x0000000036000000 (256 MB)
内核配置已开启:

CONFIG_KEXEC=y
CONFIG_KEXEC_FILE=y
CONFIG_KEXEC_CORE=y
CONFIG_CRASH_DUMP=y
CONFIG_PROC_VMCORE=y
CONFIG_RELOCATABLE=y

使用kexec加载crashkernel(镜像取自arch/arm64/boot/Image)时无报错,但触发sysrq崩溃或执行kexec -e时,crashkernel从未启动:

# kexec -p /Image --dtb /bcm2837-rpi-3-b.dtb --append="8250.nr_uarts=1 console=t
tyS0,115200n8 root=/dev/nfs nfsroot=10.0.0.1:/home/naveen/rootfs/main/,nolock,ve
rs=4,tcp ip=10.0.0.25 rootwait"
#
# kexec -e
Nothing has been loaded!
# 

触发sysrq崩溃时设备直接停机,未启动crashkernel,日志如下:

# echo c > /proc/sysrq-trigger
[   16.615504] sysrq: Trigger a crash
[   16.619009] Kernel panic - not syncing: sysrq triggered crash
[   16.624841] CPU: 2 PID: 123 Comm: sh Kdump: loaded Not tainted 6.6.78-v8+ #2
[   16.631999] Hardware name: Raspberry Pi 3 Model B Rev 1.2 (DT)
[   16.637915] Call trace:
[   16.640394]  dump_backtrace+0x9c/0x100
[   16.644221]  show_stack+0x20/0x38
[   16.647595]  dump_stack_lvl+0x48/0x60
[   16.651316]  dump_stack+0x18/0x28
[   16.654682]  panic+0x320/0x388
[   16.657788]  sysrq_handle_crash+0x24/0x30
[   16.661869]  __handle_sysrq+0xec/0x1e8
[   16.665676]  write_sysrq_trigger+0x7c/0xc0
[   16.669836]  proc_reg_write+0xa4/0x100
[   16.673649]  vfs_write+0xd0/0x330
[   16.677021]  ksys_write+0x7c/0x120
[   16.680480]  __arm64_sys_write+0x24/0x38
[   16.684466]  invoke_syscall+0x50/0x120
[   16.688268]  el0_svc_common.constprop.0+0x48/0xf0
[   16.693036]  do_el0_svc+0x24/0x38
[   16.696396]  el0_svc+0x38/0xc8
[   16.699490]  el0t_64_sync_handler+0x120/0x130
[   16.703904]  el0t_64_sync+0x190/0x198
[   16.707621] SMP: stopping secondary CPUs
[   16.711798] Starting crashdump kernel...
[   16.715769] ------------[ cut here ]------------
[   16.720443] Some CPUs may be stale, kdump will be unreliable.
[   16.726270] WARNING: CPU: 2 PID: 123 at arch/arm64/kernel/machine_kexec.c:188 machine_kexec+0x44/0x1d8
[   16.735711] Modules linked in:
[   16.738805] CPU: 2 PID: 123 Comm: sh Kdump: loaded Not tainted 6.6.78-v8+ #2
[   16.745950] Hardware name: Raspberry Pi 3 Model B Rev 1.2 (DT)
[   16.751858] pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   16.758915] pc : machine_kexec+0x44/0x1d8
[   16.762979] lr : machine_kexec+0x44/0x1d8
[   16.767041] sp : ffffffc08061b9e0
[   16.770395] x29: ffffffc08061b9e0 x28: ffffff8001a2dc40 x27: 0000000000000000
[   16.777634] x26: 0000000000000000 x25: ffffffe97f297dc8 x24: 0000000000000063
[   16.784873] x23: ffffffe97f9838a8 x22: ffffffc08061bbc8 x21: ffffffe97f9ab000
[   16.792113] x20: ffffff8000fa7c00 x19: ffffff8000fa7c00 x18: 0000000000000006
[   16.799352] x17: 0000000000000000 x16: 0000000000000000 x15: ffffffc08061b57f
[   16.806591] x14: 0000000000000000 x13: 2e656c6261696c65 x12: 726e75206562206c
[   16.813830] x11: ffffffe97f7a50a8 x10: 0000000000000000 x9 : ffffffe97e6bee1c
[   16.821069] x8 : 0000000000017fe8 x7 : 00000000fffff000 x6 : ffffffe97f7fd0a8
[   16.828307] x5 : ffffff80371b9bc8 x4 : 0000000000000000 x3 : 0000000000000027
[   16.835545] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffffff8001a2dc40
[   16.842784] Call trace:
[   16.845257]  machine_kexec+0x44/0x1d8
[   16.848967]  __crash_kexec+0x98/0x180
[   16.852681]  panic+0x290/0x388
[   16.855775]  sysrq_handle_crash+0x24/0x30
[   16.859841]  __handle_sysrq+0xec/0x1e8
[   16.863639]  write_sysrq_trigger+0x7c/0xc0
[   16.867788]  proc_reg_write+0xa4/0x100
[   16.871587]  vfs_write+0xd0/0x330
[   16.874946]  ksys_write+0x7c/0x120
[   16.878393]  __arm64_sys_write+0x24/0x38
[   16.882370]  invoke_syscall+0x50/0x120
[   16.886170]  el0_svc_common.constprop.0+0x48/0xf0
[   16.890940]  do_el0_svc+0x24/0x38
[   16.894300]  el0_svc+0x38/0xc8
[   16.897393]  el0t_64_sync_handler+0x120/0x130
[   16.901808]  el0t_64_sync+0x190/0x198
[   16.905518] ---[ end trace 0000000000000000 ]---
[   16.910195] Bye!

尝试使用 verbose 模式加载也无有效输出:

# kexec -p -v /Image --dtb /bcm2837-rpi-3-b.dtb --reuse-cmdline
kexec-tools 2.0.31
#

请问可能是什么原因导致的?


问题分析与排查方向

1. kexec工具与内核版本不兼容

你用的kexec-tools是2.0.31,而内核是较新的6.6.x版本。旧版工具可能无法正确解析新内核的镜像格式或参数,导致加载失败却无报错提示。建议升级kexec-tools到最新稳定版后重试。

2. Crashkernel预留内存存在冲突或不足

日志显示预留了256MB crashkernel内存,需要确认两点:

  • 内核镜像Image的大小是否超过预留区域?如果镜像过大,会无法正确加载到指定内存区间。
  • 预留地址0x26000000-0x36000000是否被其他设备或模块占用?可以查看/proc/iomem文件确认该区间的使用状态。

3. 二级CPU未彻底停机干扰启动

日志里出现Some CPUs may be stale, kdump will be unreliable警告,说明崩溃时二级CPU没有被完全停机。树莓派3B+是SMP架构,crashkernel启动要求所有非主CPU彻底进入停机状态,否则会干扰初始化流程。可以检查内核是否开启CONFIG_HOTPLUG_CPU,或者尝试调整内核machine_kexec函数中的CPU停机逻辑。

4. DTB文件配置不匹配

你使用的bcm2837-rpi-3-b.dtb可能不是编译当前内核时生成的版本,通用DTB可能缺少crashkernel所需的内存预留信息或硬件配置。建议替换为编译内核时生成的对应DTB文件。

5. 加载命令行参数错误

加载crashkernel的--append参数里,console=ttyS0是否符合树莓派3B+的串口配置?部分场景下需要指定console=serial0,先确认设备节点是否存在。另外,crashkernel的根文件系统参数如果有误,也会导致启动失败甚至直接停机。

6. 内核配置遗漏关键选项

除了你已开启的配置,还需要检查:

  • CONFIG_ARM64_CRASH_DUMP:arm64架构专属的crashdump支持选项,必须开启。
  • CONFIG_KEXEC_JUMP:如果需要直接跳转启动crashkernel,该选项需要开启。

内容的提问来源于stack exchange,提问作者InsaneCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:55:54