树莓派3B+ arm64 Linux 6.6.x内核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

