kexec重启比普通reboot快,因为它跳过BIOS/UEFI固件初始化、硬件重枚举和内存自检等阶段,直接在当前内核上下文中加载并跳转到新内核,实测可将60+秒的传统重启缩短至3–8秒恢复。

Kexec 本身不处理 kernel panic 自动触发重启,必须配合 kernel.panic 和 crash_kexec_post_notifiers 才能生效。 单独配置 kexec-load 不会让 panic 后自动跳转到新内核;默认 panic 仍走传统 reboot 流程,耗时长、IO 同步多、无法跳过 BIOS/UEFI 自检。
为什么 kexec 重启比普通 reboot 快
kexec 跳过固件初始化(BIOS/UEFI)、硬件重枚举、内存自检等阶段,直接在当前内核上下文中加载并跳转到新内核。实测典型服务器可从 60+ 秒缩短至 3–8 秒恢复,前提是:新内核已预加载、panic 触发路径能命中 kexec 执行点。
- 普通
reboot或init 6:触发完整硬件复位流程,依赖 firmware 行为,不可控 - kexec 重启:纯软件跳转,无硬件 reset,但要求 panic 发生时 kexec 已就绪且未被破坏
- 关键限制:kexec 加载的内核镜像和 initramfs 必须与当前运行环境兼容(如 CPU 微码、内存布局),否则跳转后立即 hang
启用 kexec 热重启需满足三个硬条件
缺一不可,否则 panic 后仍 fallback 到传统重启:
- 内核编译时启用:
CONFIG_KEXEC_CORE=y、CONFIG_KEXEC=y、CONFIG_CRASH_DUMP=y(后者非必须但推荐) - 运行时启用 panic 后 kexec:写入
/proc/sys/kernel/crash_kexec_post_notifiers=1(默认为 0) - 提前加载目标内核:
kexec -l /boot/vmlinuz-$(uname -r) --initrd=/boot/initramfs-$(uname -r).img --append="$(cat /proc/cmdline)"
注意:crash_kexec_post_notifiers=1 表示在 panic 调用所有 notifier 链之后、关中断之前执行 kexec,这是唯一能保证 kexec 可靠触发的时机。设为 0 时,kexec 只在 crashdump 场景下触发(需额外配置 kdump),对普通 panic 无效。
常见失败原因和验证方式
配置完常遇到“panic 后还是冷重启”,大概率是以下某处断链:
-
sysctl kernel.crash_kexec_post_notifiers返回 0 → 检查是否漏写或被其他配置覆盖(如 systemd-sysctl.service 加载顺序) -
kexec -l执行后无报错,但kexec -d显示 “no kernel loaded” → 实际未成功加载,常见于 initramfs 路径错误或--append包含非法空格/引号 - panic 日志末尾出现 “Starting new kernel” 但卡住 → 新内核不兼容当前硬件状态(如 VT-d 已开启但新内核未启用
intel_iommu=on) - 使用
echo c > /proc/sysrq-trigger测试时,系统直接硬复位 → 说明crash_kexec_post_notifiers未生效,或内核未启用CONFIG_KEXEC
验证命令链:sudo sysctl kernel.crash_kexec_post_notifiers && sudo kexec -d && echo 1 | sudo tee /proc/sys/kernel/sysrq && echo c | sudo tee /proc/sysrq-trigger
生产环境必须加的防护措施
kexec 热重启快,但也更“脆”:一次加载失败或内核不匹配,就会导致 panic 后彻底无法恢复。不能只依赖它:
- 始终保留
kernel.panic = 30(或更小值),确保即使 kexec 失败,也能 fallback 到传统重启 - 每次内核更新后,必须重新执行
kexec -l加载新镜像,建议写成 systemd service 随kernel-install触发 - 禁止在 panic 前禁用 watchdog:某些平台(如 ARM SMMU)在 panic 中关闭 IOMMU 后,kexec 跳转会因 DMA 冲突死锁
- 日志中重点监控
kexec: Starting new kernel是否出现 —— 这是唯一确认 kexec 实际触发的证据,不要只看是否“快”
真正决定业务中断时长的,不是 kexec 本身,而是你能否在 panic 发生前就把正确内核稳稳 load 进内存,并让内核 panic 路径精准跳进它。其余都是障眼法。


















