SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-24

内核更新后 VPS 无法启动:如何恢复

VPS 更新内核后无法启动?通过服务商控制台进入 GRUB,选择旧内核恢复 SSH,并排查 initramfs、LVM 与启动项问题。

内核更新后 VPS 无法启动时,首先应做什么

VPS 在内核更新后无法启动时,通常几分钟内即可恢复,因为更新一般不会删除昨天还能正常工作的内核。Ubuntu 会将新内核安装在旧内核旁边,只修改 GRUB 默认启动的条目。因此,第一步不是修复系统。请在启动菜单中选择之前的内核,恢复登录提示符,然后从正在运行的系统中进行诊断。

在服务器上处理此问题不同于修复笔记本电脑,因为服务器没有连接键盘,也没有显示器显示内核崩溃信息。SSH 也不会响应,因为系统尚未启动到 sshd 可以运行的阶段。下面的所有操作都通过服务商提供的控制台完成。

修改任何内容前,先查看您自己的控制台。控制台上的文本决定了故障类别;两台都“无法启动”的服务器,可能需要完全相反的修复方法。

SSH 失效时如何访问控制台?

打开服务提供商的控制面板,查找控制台。常见名称包括 VNC 控制台、Web 控制台、noVNC 和串行控制台。如果两者都存在,优先使用串行控制台,因为它提供可滚动和复制的真实文本,而 VNC 视图只是屏幕图像。现在就找到该控制项,并确认可以打开。等到服务中断时再寻找它,会让您失去排障所需的冷静。这项检查应属于新 VPS 上线后的前 10 分钟检查,并与防火墙规则和 SSH 密钥一起完成。

大多数控制面板还提供救援模式或恢复映像。它会从服务提供商的网络启动一个小型系统,并将您的磁盘作为额外设备挂载,因此磁盘上的系统不会运行。当 GRUB 本身损坏时,救援模式是备用方案;如果您决定不再修复某台服务器,也可以使用它将数据复制出来。

通常需要从控制面板执行硬重置才能进入启动菜单,因为您无法在无法登录的机器上运行 sudo reboot。硬重置等同于直接断电。文件系统会经历非正常关机,因此下次启动时可能会执行文件系统检查。

如何在 GRUB 菜单中选择旧内核?

从按下重置按钮开始监视控制台。启动最初几秒内,反复按 Esc;如果机器使用传统 BIOS 模式启动,则按住 Shift。可操作的时间窗口很短,而且控制台查看器通常需要一秒钟才能连接,因此应尽早开始按键,并持续按下。

菜单出现后,选择“Advanced options for Ubuntu”。该子菜单会列出所有已安装的内核,最新的排在最前面;每个内核都有一个 recovery mode 条目。选择第二个普通条目,也就是位于最新内核下方的内核,然后按 Enter。Recovery mode 是另一种模式:它会启动到精简的单用户系统,用于修复,不用于让服务恢复在线。

如果旧内核能够启动,服务器就已恢复运行。确认当前使用的内核,并记下版本号。

uname -r
dpkg -l 'linux-image-*' | grep '^ii'

dpkg 的输出是已安装内核的列表。如果输出只有一行,则完全没有备用内核。这是首先需要修复的问题。

GRUB 菜单始终不显示。怎么办?

云镜像通常包含隐藏菜单的配置。Ubuntu 镜像通常会在 /etc/default/grub.d/ 下的文件中将超时时间设为 0,因此会立即启动最新内核,没有可按的按键。

也存在相反的情况:菜单显示在屏幕上并等待输入,看起来像是系统卡住。GRUB 会记录一次启动失败,下次启动时可能一直显示菜单,直到有人按下按键。没有键盘的服务器会一直等待。如果控制台显示菜单但没有任何变化,就是这种情况。选择一个菜单项并继续启动。

应在系统运行正常时同时修复这两种情况。编辑 /etc/default/grub:

GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=10
GRUB_RECORDFAIL_TIMEOUT=10
GRUB_TERMINAL="console serial"
GRUB_SERIAL_COMMAND="serial --unit=0 --speed=115200"
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0,115200"

然后应用配置,并确认修改仍然生效,因为 /etc/default/grub.d/ 中的文件会在 /etc/default/grub 之后读取,可能覆盖你的设置。

sudo update-grub
grep -rE 'TIMEOUT|TERMINAL' /etc/default/grub /etc/default/grub.d/

GRUB_TERMINAL="console serial" 会将菜单发送到图形控制台和串行端口,因此你可以在面板提供的任一查看器中看到它。console= 内核参数会对后续启动消息执行相同操作。每次启动增加 10 秒延迟,是为了确保你能在凌晨 2 点访问菜单而付出的合理代价。

我遇到的是哪一类故障?

查看控制台停止滚动前的最后 20 行。内核更新后,通常会出现以下 4 种故障模式。

GRUB 找不到自己的文件。您会看到 grub rescue> 提示符,或看到有关不存在的分区或文件的错误,但完全不会出现内核消息。此时内核还没有开始运行。此类问题通常由磁盘或分区变更,或将 bootloader 写入错误设备导致,而不是由内核软件包单独导致。

内核启动,但无法挂载根文件系统。内核消息开始滚动,随后进入提示符为 (initramfs) 的 busybox shell,或者启动过程以无法挂载根文件系统的 panic 结束。内核已经加载,但 initramfs 没有找到磁盘。initramfs 是用于查找并挂载实际根文件系统的小型临时根文件系统。在 Ubuntu 上,此 shell 通常会先显示一条放弃等待根设备的消息,并列出它要查找的 UUID。复制该 UUID,稍后将其与 blkid 的输出进行比较。

逻辑卷始终未出现。这是上一类故障的一种具体原因。在 (initramfs) 提示符下运行 ls /dev/mapper。如果唯一的条目是 control,说明没有激活任何 LVM(逻辑卷管理器)卷,因此根设备尚不存在。手动启用卷组:

lvm vgchange -ay
ls /dev/mapper
exit

exit 会将控制权交还给 initramfs 脚本,由它重试挂载。如果系统随后成功启动,说明新的 initramfs 缺少 LVM 组件。此时应重建该映像,而不是修改内核。

完全没有 Linux 输出。控制台显示固件文本、UEFI(统一可扩展固件接口)shell、没有任何内核输出的空白屏幕,或不断重启。故障发生在 Linux 运行之前。系统恢复后,检查服务器实际使用的启动模式,因为许多 VPS 实例以传统 BIOS 模式启动,根本不会使用 EFI 路径:

[ -d /sys/firmware/efi ] && echo UEFI || echo BIOS
mountpoint /boot/efi
sudo efibootmgr -v

升级期间未挂载 /boot/efi 是 UEFI 计算机上的常见原因。维护 EFI 系统分区的软件包随后会将文件写入一个普通的空目录,而不是实际的 EFI 分区。固件会持续启动旧的启动项,直到该启动项与磁盘上的内容不再匹配。

还有一种情况根本不是启动故障。如果您进入显示系统处于 emergency mode 的 root shell,说明内核已经启动,但用户空间停止了。通常这是因为 /etc/fstab 中存在错误配置行,或某个文件系统检查失败。在该 shell 中运行 journalctl -xb,并查看失败的 unit 名称。

内核软件包损坏,还是 initramfs 损坏?

从控制台看,这两种问题几乎相同,但修复方法不同。先启动旧内核,然后比较这些文件。

ls -l /boot/vmlinuz-* /boot/initrd.img-*
df -h /boot

对于每个已安装版本,都应有一个 vmlinuz- 和一个匹配的 initrd.img-,且文件大小应合理。缺少 initrd,或其大小明显小于其他版本,说明 initramfs 生成失败。最常见的原因是 /boot 已满。相关证据位于软件包日志中:

sudo grep -iE 'no space|update-initramfs' /var/log/apt/term.log
sudo tail -n 40 /var/log/apt/history.log

history.log 还会准确列出最近几次运行安装了哪些软件包,以及安装时间。这可以确定发生了哪些更改。

如果 /boot 已满,先释放空间,然后为所需版本重新构建映像并刷新菜单。版本字符串应从您自己的 ls 输出中获取,因为下面的占位符不是实际版本:

KVER=6.8.0-XX-generic
sudo update-initramfs -c -k "$KVER"
sudo update-grub
ls -l /boot/initrd.img-$KVER

最后一个 ls 用于验证。文件大小正常,表示映像已生成。如果内核映像本身已损坏,或 dpkg -l 显示软件包处于 ii 以外的任何状态,请重新安装该软件包:

sudo apt install --reinstall linux-image-$KVER
sudo dpkg --configure -a

在没有内核可以启动时从救援模式修复

如果菜单中的每个条目都启动失败,请启动服务商提供的救援镜像,并从系统外部修复磁盘。此时磁盘会显示为未挂载设备,磁盘上的任何系统都未运行,也不会有进程占用它。

完整的 chroot 修复流程

先运行 lsblk -f,并从当前机器读取实际的设备名称。在 KVM 上,/dev/vda 很常见;Ubuntu server 安装通常会将根文件系统放在 LVM 上,例如 /dev/ubuntu-vg/ubuntu-lv。

sudo lsblk -f
sudo vgchange -ay
sudo mount /dev/ubuntu-vg/ubuntu-lv /mnt
sudo mount /dev/vda2 /mnt/boot
sudo mount /dev/vda1 /mnt/boot/efi

跳过不适用于当前环境的行。许多镜像没有独立的 /boot,也没有 EFI 分区。然后绑定挂载内核接口,并进入系统:

for d in dev proc sys run; do sudo mount --rbind /$d /mnt/$d; done
sudo chroot /mnt /bin/bash

在 chroot 环境中,底层运行的是健康的内核,但你操作的是已损坏的系统。请在该环境中执行修复:

df -h /boot
update-initramfs -u -k all
update-grub
grub-install /dev/vda
exit

在 BIOS 系统上,grub-install 使用整个磁盘,而不是某个分区。在 UEFI 系统上使用 grub-install --target=x86_64-efi --efi-directory=/boot/efi,并在运行该命令前确认该目录已挂载。使用 exit 退出,再使用 sudo umount -R /mnt 卸载所有内容,然后将控制面板切换回正常启动并重启。

测试新内核,避免影响下一次启动

GRUB 可以仅启动某个菜单项一次,然后恢复到您选择的默认项。将默认项指向您信任的内核,再让新内核仅启动一次。如果启动失败,从管理面板执行硬重置即可返回正常内核,无需在控制台中争分夺秒。

在 /etc/default/grub 中设置 GRUB_DEFAULT=saved,运行 sudo update-grub,然后列出菜单项标题,以便准确指定其中一项:

grep -E "(menuentry|submenu) " /boot/grub/grub.cfg | cut -d"'" -f2
sudo grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-XX-generic"
sudo grub-editenv list
sudo grub-reboot 0
sudo reboot

grub-editenv list 应将您选择的标题输出为 saved_entry。这证明该机制有效,因为保存设置需要可写的 /boot/grub/grubenv,而在某些布局中该文件系统并未以可写方式挂载,且不会明确提示。菜单项 0 位于顶部,对应最新的内核。在这里使用标题比使用编号更安全,因为每次安装或删除内核后,编号都会变化。

无头服务器上使用 autoremove 的风险

APT 会维护一份不得自动删除的内核软件包列表。查看该列表:

cat /etc/apt/apt.conf.d/01autoremove-kernels
dpkg -l 'linux-image-*' | grep -c '^ii'

每当内核软件包发生变化时,系统都会重新生成此文件。该文件会保护正在运行的内核和最近安装的内核。风险在于时机。刚重启并进入新内核后立即运行 sudo apt autoremove --purge,受保护列表已经更新,因此你原本依赖的旧内核不再受保护。对于配有键盘的机器,这只是一个不便。对于无头服务器,这意味着你无法选择启动菜单项,只能从救援映像挂载磁盘。

至少保留两个内核;如果 /boot 有足够空间,则保留三个。检查 uname -r 后按名称删除旧内核,这样就不会删除当前正在运行的内核:

uname -r
sudo apt purge linux-image-6.8.0-XX-generic
dpkg -l 'linux-image-*' | grep '^ii'

之后再次运行最后一条命令。从三个减少到两个表示完成了清理。从两个减少到一个,则意味着下次重启时可能发生服务中断。

升级前创建快照

在 apt upgrade 之前创建的快照,是唯一不依赖启动任何组件的恢复路径。恢复快照后,磁盘会回到旧内核仍为默认内核的状态,您可以在已打开控制台的情况下重试升级。运行中的计算机创建的快照具有崩溃一致性,也就是说,快照记录的是仿佛突然断电时的磁盘状态。因此,如果云服务提供商支持离线快照,请先关闭服务器。快照也不等于备份,因为它通常与所复制的卷位于同一基础设施中。了解 VPS 快照与真正备份的区别,才能判断在故障范围超出内核问题时,哪一种方式可以帮助您恢复。

这在发布版本升级期间尤其重要,因为内核、initramfs 工具、引导加载程序和 GRUB 配置会在一次操作中同时发生变化。请在开始 将 Ubuntu 24.04 升级到 26.04 之前立即创建快照,而不要在前一晚创建,这样恢复点才与即将修改的服务器状态一致。如果您的服务器尚未提供该升级,原因是发布时间安排,而不是配置损坏,因为 LTS 到 LTS 的升级只有在 第一个点版本 26.04.1 发布后才会开放。

无人值守升级如何处理内核软件包

Ubuntu 的 unattended-upgrades 会在不提示的情况下安装安全更新,内核软件包也和其他软件包一样通过 security pocket 获取。由此会产生两个后果。

首先,新内核已经安装,但尚未运行。内核只有在启动时才会生效。此时会出现文件 /var/run/reboot-required,而 /var/run/reboot-required.pkgs 会记录请求重启的原因;但除非您在 /etc/apt/apt.conf.d/50unattended-upgrades 中启用了 Unattended-Upgrade::Automatic-Reboot,否则系统不会自动重启。

cat /var/run/reboot-required.pkgs
grep -E 'Automatic-Reboot|Blacklist' /etc/apt/apt.conf.d/50unattended-upgrades

其次,这个时间差会掩盖故障原因。服务器可能在 3 月安装内核,却在 6 月因完全无关的原因重启,随后无法正常启动。导致启动失败的更改已经存在 3 个月,因此当天执行的操作无法解释问题。您可以在 /var/log/apt/history.log 中找到安装当前导致启动失败的内核时所执行的任务。

请在您选定的日期主动重启,并提前打开控制台窗口。这个习惯可以将一次原因不明的中断变成只需 2 分钟完成的菜单选择。如果您需要自动安装但不希望系统意外重启,请保持自动安装启用、自动重启关闭,并参阅如何在 Ubuntu 上配置 unattended-upgrades了解具体设置。使用 sudo apt-mark hold linux-image-generic 锁定内核软件包会完全停止内核更新,同时也会停止内核安全修复。因此,应将其视为您有意接受的取舍,而不是安全措施。

FAQ

如何在没有键盘的 VPS 上启动旧内核?

打开服务商的控制台(VNC 或串行控制台),然后从控制面板触发硬重置,因为您无法登录并执行正常重启。机器重启时,反复按 Esc;如果使用传统 BIOS 启动,则按住 Shift,以停留在 GRUB 菜单。选择“Advanced options for Ubuntu”,然后选择位于最新内核下方的条目。出现登录提示后,运行 uname -r 确认当前使用的内核,并运行 dpkg -l 'linux-image-*' 查看系统中安装的其他内核。系统恢复运行后再进行故障诊断。

为什么我的 VPS 完全不显示 GRUB 菜单?

云镜像通常会在 /etc/default/grub.d/ 下的文件中将 GRUB 超时设置为 0,因此系统会直接启动最新内核,没有可供按下的按键。在 /etc/default/grub 中设置 GRUB_TIMEOUT=10 和 GRUB_TIMEOUT_STYLE=menu,添加 GRUB_TERMINAL="console serial",使菜单也能通过串行控制台显示,然后运行 sudo update-grub。使用 grep -r TIMEOUT /etc/default/grub /etc/default/grub.d/ 验证结果,因为该目录中的文件会在主文件之后读取,并可能覆盖您的修改。

是否应删除旧内核以释放 /boot 中的空间?

删除最旧的内核,但至少保留两个。/boot 已满本身就会导致故障,因为此时生成 initramfs 会失败,最终留下一个没有可用映像的内核。检查 uname -r 后,按确切的软件包名称执行清理,确保运行中的内核不会成为候选项。在无头服务器上不要直接使用 sudo apt autoremove --purge,因为每次内核变更都会重新生成受保护内核列表;如果执行时机不当,菜单中可能只剩一个内核,且没有回退条目。

unattended-upgrades 会导致系统无法启动吗?

它可能安装一个之后无法启动的内核,但除非 /etc/apt/apt.conf.d/50unattended-upgrades 中的 Unattended-Upgrade::Automatic-Reboot 设置为 true,否则不会重启机器。常见情况是延迟故障:内核在自动运行期间安装,出现 /var/run/reboot-required,而问题直到数周后的下一次重启才暴露。重启前先打开控制台,并读取 /var/log/apt/history.log,以确定安装当前启动内核的是哪次运行。