kexec热切换本质是跳过bios/固件,由当前内核直接加载并跳转至新内核,不触发硬件复位、不关闭服务,实现秒级切换;但非无感升级,需手动保存数据、保障文件系统同步,并确认内核启用config_kexec=y及已安装kexec-tools。

Linux 使用 kexec 实现不重启机器的内核热切换,本质是跳过 BIOS/固件阶段,直接由当前运行的内核加载并跳转到新内核。整个过程不触发硬件复位,也不关闭服务进程(需手动保障),因此能做到秒级切换。但要注意:这不是“无感”升级,而是快速强制切换,应用状态不会自动保存或迁移。
确认系统支持 kexec
不是所有内核默认启用该功能,必须满足两个前提:
- 当前内核已编译开启 CONFIG_KEXEC=y(或 CONFIG_KEXEC_CORE=y):执行
grep CONFIG_KEXEC /boot/config-$(uname -r),输出应为CONFIG_KEXEC=y - 已安装用户态工具 kexec-tools:常见发行版用
sudo apt install kexec-tools(Debian/Ubuntu)或sudo dnf install kexec-tools(Fedora/RHEL)
准备目标内核与启动参数
要切换的目标内核必须已存在,通常位于 /boot/ 下,包括:
-
vmlinuz 文件(如
/boot/vmlinuz-6.8.0-xx-generic) -
initrd/initramfs 镜像(如
/boot/initrd.img-6.8.0-xx-generic) -
启动参数:推荐复用当前内核参数,执行
cat /proc/cmdline获取;也可按需精简(例如去掉quiet splash便于调试)
分两步完成热切换
kexec 操作严格分为加载(load)和执行(exec)两个独立动作:
-
加载新内核到内存:
sudo kexec -l /boot/vmlinuz-6.8.0-xx-generic --initrd=/boot/initrd.img-6.8.0-xx-generic --append="$(cat /proc/cmdline)"
成功后无输出,可通过sudo kexec -s查看当前已加载的内核信息 -
立即切换到新内核:
sudo kexec -e
执行后系统瞬间跳转,当前内核停止运行,新内核开始引导——此过程不执行 shutdown、不 sync 磁盘、不通知服务退出,务必提前保存数据、暂停关键业务
常见注意事项与避坑点
kexec 热切换不是“安全重启”,容易因状态残留导致异常:
- 设备驱动不会重初始化,某些硬件(如 GPU、RDMA、加密卡)可能进入不可恢复状态
- 文件系统未卸载,若写入缓存未刷盘,可能引发数据损坏(尤其 ext4/journal 模式下风险较低但非零)
- 不要在容器运行时、数据库活跃写入中、或 NFS 客户端挂载状态下直接使用
- 如需用于生产环境热升级,建议搭配内核模块兼容性检查(
modinfo对比)、服务健康探针及回滚预案











