重启时长按Shift(BIOS)或按Esc(UEFI)调出GRUB菜单,选旧内核如vmlinuz-5.15.0-91-generic启动;确保GRUB_SAVEDEFAULT=true,检查GRUB_TIMEOUT非0,UEFI需禁用Secure Boot;删新内核用apt autoremove --purge,勿手动rm;initramfs损坏则用sudo update-initramfs -u -k 5.15.0-91-generic修复;生产环境依赖grub-reboot或LVM/btrfs快照实现回滚。

内核升级后无法启动,怎么进旧内核?
GRUB 启动菜单通常保留上一两个旧内核条目,只要没手动删过 /boot/vmlinuz- 和 /boot/initramfs- 文件,重启时长按 Shift(BIOS)或按 Esc(UEFI)可调出菜单。用方向键选中旧版本内核(比如 vmlinuz-5.15.0-91-generic),回车启动。
- 确保
/etc/default/grub中GRUB_SAVEDEFAULT=true已启用,下次启动会默认沿用上次选中的内核 - 若菜单不显示,检查
GRUB_TIMEOUT是否为 0,临时修复可开机时按住 Shift 强制唤出 - UEFI 系统可能需进固件设置禁用 “Secure Boot” 才能加载旧 initramfs(尤其第三方驱动编译过的内核)
如何安全删除新内核、保留旧内核?
别直接 rm -rf /boot/5.19 —— 这容易漏删 /lib/modules/5.19.0-xx/ 或残留 dpkg 配置,导致包管理器异常。
- Ubuntu/Debian 系统优先用
apt autoremove --purge,它会识别并移除未被依赖的内核包(如linux-image-5.19.0-xx-generic) - 先查当前运行内核:
uname -r,再列已安装内核:dpkg -l | grep 'linux-image-.*-generic' | awk '{print $2}' - 手动清理前务必确认:旧内核的
linux-image、linux-modules、linux-headers三个包都完整存在,缺一不可 - 清理后运行
update-grub,否则 GRUB 不会刷新菜单
回滚时 initramfs 损坏怎么办?
常见现象是卡在 “Loading initial ramdisk…” 或报错 Failed to load module 'xhci_hcd'。这往往是因为新内核的 initramfs 被重建时覆盖了旧内核的镜像,或模块路径没更新。
- 用旧内核启动后,立即重生成对应 initramfs:
sudo update-initramfs -u -k 5.15.0-91-generic - 若提示 “no image found”,说明
/lib/modules/5.15.0-91-generic缺失,需重新安装该内核头文件包:sudo apt install linux-modules-5.15.0-91-generic - 不建议用
mkinitcpio(Arch)或dracut(RHEL)命令处理 Debian/Ubuntu 系统,工具链不兼容
生产环境要不要自动回滚机制?
Linux 内核本身不提供原子升级或事务回滚能力。所谓“自动回滚”,本质是靠外部机制兜底:
- 在部署脚本中加检查:升级后
timeout 30s bash -c 'until ping -c1 google.com; do sleep 1; done',失败则触发grub-reboot+ 重启 - 使用
grub-reboot设置下一次启动的默认内核(如sudo grub-reboot 'Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-91-generic'),比改GRUB_DEFAULT更安全 - 真正关键的服务器,建议用 LVM 快照或 btrfs subvolume,在升级前拍快照,回滚就是
btrfs subvolume set-default切过去
内核回滚最常被忽略的一点:不是所有驱动模块都能跨内核版本复用。比如某网卡厂商只给 5.15 提供 .ko 文件,你切到 5.19 就失联——这种场景下,“回滚”必须同步还原整个模块生态,不能只换 vmlinuz。










