跳转到内容

内核管理与 proxmox-boot-tool ​

Proxmox VE 不用发行版自带的内核,而是维护自己的一套(基于 Ubuntu 内核)。大多数时候你什么都不用管,apt full-upgrade 会顺带把内核也更新了。但遇到硬件驱动问题、想验证新内核是否修了某个 bug,或者升级后某个设备罢工,就需要知道怎么查看、切换、固定内核版本,以及怎么在改坏引导之后退回来。

改内核和引导参数可能让机器起不来

影响范围:本文涉及切换内核版本、固定(pin)内核、以及修改内核命令行参数。操作失误可能导致下次重启进不了系统,正在运行的虚拟机和容器会跟着这台宿主机一起下线。

前置条件:操作前确认你有除 SSH 之外的接入方式(物理显示器键盘,或服务器的 IPMI/iKVM/远程控制台)——网络或内核出问题时,SSH 大概率也连不上了。逐项改动,改一样测一样,不要一次性堆一堆改动再重启。

怎么回退:

  1. 最简单:重启时在引导菜单(GRUB 蓝屏或 systemd-boot 的黑底白字菜单)里手动选一个旧内核条目,这不需要任何提前准备,只要旧内核还在。
  2. 固定内核用错了:进入能正常引导的内核后,执行 proxmox-boot-tool kernel unpin 解除固定,再 proxmox-boot-tool refresh 使其生效。
  3. 改了内核命令行导致起不来:在引导菜单里按 e(GRUB)临时编辑本次启动的参数,去掉可疑的那一项,正常进系统后再永久改回来。
  4. 引导本身坏了:需要用安装介质进入救援模式修复,见宿主机起不来:救援启动(尚未发布,届时会有详细步骤;目前请以官方 Wiki 的 Host Bootloader 页面为准)。

开始之前 ​

先搞清楚这台机器用的是哪种引导方式,因为后面几乎所有命令的行为都和它有关:

  • 看开机画面:官方文档说这是最简单可靠的办法——蓝底的是 GRUB,黑底白字的简洁菜单是 systemd-boot。
  • 命令行判断(宿主机 shell):
sh
efibootmgr -v

输出里如果提示不支持 EFI 变量,说明是传统 BIOS 模式的 GRUB;看到 grubx64.efi(或 arm64 上的 grubaa64.efi)是 UEFI 模式的 GRUB;shimx64.efi 是带 Secure Boot 的 GRUB;systemd-bootx64.efi 则是 systemd-boot。

  • 或者直接看 proxmox-boot-tool status 的输出,它也能反映当前的引导配置方式。

什么时候是 systemd-boot

只有 UEFI 系统 + 根文件系统是 ZFS + 没开 Secure Boot 时,PVE 安装器才会用 systemd-boot。其他情况(传统 BIOS、开了 Secure Boot、根文件系统是 ext4/xfs)一律用 GRUB。

操作步骤 ​

认识当前内核 ​

sh
uname -r
dpkg -l | grep -E 'proxmox-kernel|pve-kernel'

PVE 9.2 默认内核是 7.0 系列,之前 9.0 是 6.14、9.1 是 6.17——每个 PVE 大版本发布时会跟随当时的 Ubuntu 内核版本,一直到 Ubuntu 出下一个 LTS 为止,之后新内核就只以 opt-in(可选安装) 的形式提供,不再自动成为默认值。

opt-in 内核:什么时候值得换 ​

如果某个新内核修复了你关心的硬件问题,可以手动装一个可选版本试试(版本号以你查到的当前可用版本为准):

sh
apt update
apt install proxmox-kernel-<版本号>
systemctl reboot

生产环境先在测试机器上跑一段时间

opt-in 内核经过的验证轮次比默认内核少。官方的建议是:在乎稳定性的机器保持默认内核,想用新特性或需要新硬件支持的话,先在相同型号的测试机器上跑一段时间,确认没问题再推广到生产节点。

已知问题:PVE 9.2 ISO 自带的 7.0.2-6 内核

如果你是用 PVE 9.2 的 ISO 全新安装的,自带内核是 7.0.2-6-pve,这个版本对使用 megaraid_sas 驱动的 RAID 卡、以及部分 JBOD 模式的 NVMe 盘有兼容性问题,已经在后续的 7.0.14-15 修复。装完先 apt update && apt full-upgrade 再重启,通常就能拿到修复后的版本。

proxmox-boot-tool 保留了哪些内核 ​

proxmox-boot-tool 负责把内核同步到每一块 ESP(EFI System Partition)分区,并配置引导程序去启动它们。默认情况下它会保留:

  • 当前正在运行的内核
  • 软件更新过程中新装的内核
  • 最新的两个已安装内核
  • 上一个内核系列(例如 6.14、6.17 这种大版本)里最新的一个
  • 你手动指定要保留的内核

查看当前保留了哪些:

sh
proxmox-boot-tool kernel list

输出分「手动选择」和「自动选择」两组。想额外保留某个版本(比如升级前先手动锁住当前能用的内核作为保险):

sh
proxmox-boot-tool kernel add <内核版本>
proxmox-boot-tool refresh

升级内核前先确认旧内核还在名单里

proxmox-boot-tool kernel list 输出里能看到当前运行的内核,只要它还在自动或手动保留的名单里,升级新内核失败时就还能从引导菜单选回它。心里没底的话,升级前手动 kernel add 一下当前版本。

固定(pin)一个内核版本 ​

想让系统始终从某个特定版本启动,不管后面装了多新的内核:

sh
proxmox-boot-tool kernel pin <内核版本>
proxmox-boot-tool refresh

只想验证「下次开机」用某个版本,不永久改变默认值(比如测试一个新内核是否解决了问题):

sh
proxmox-boot-tool kernel pin <内核版本> --next-boot

解除固定:

sh
proxmox-boot-tool kernel unpin
proxmox-boot-tool refresh

别忘了 refresh,也别忘了解除固定

  1. pin/unpin 之后必须跑 proxmox-boot-tool refresh,配置才会真正同步到 ESP 分区(交互模式下工具会主动提示你要不要执行)。
  2. 固定内核会让你错过之后版本的安全更新。排查完问题、确认新版本没问题后,记得 unpin,回到跟随最新内核的状态。

修改内核命令行参数 ​

改引导参数(比如启用 IOMMU、调整内存管理参数)之前,先确认走的是哪种引导:

GRUB:编辑 /etc/default/grub,改 GRUB_CMDLINE_LINUX_DEFAULT 这一行,然后:

sh
update-grub

用 proxmox-boot-tool 管理引导的系统上,update-grub 会自动触发一次 refresh。

systemd-boot:编辑 /etc/kernel/cmdline(整个文件就是一行参数),然后:

sh
proxmox-boot-tool refresh

一次只改一个参数,改完立刻重启验证

内核命令行参数写错格式或加了机器不支持的参数,轻则该功能不生效,重则直接进不了系统。每次只改一项,改完就重启确认,而不是攒一堆改动再重启——出问题时才知道是哪一项导致的。IOMMU 相关的参数改动详见开启 IOMMU:GRUB 与 systemd-boot(该文规划中)。

PVE 9.2 新增的 memtest86+ 引导项 ​

9.2 版本起,使用 proxmox-boot-tool 管理引导的系统,引导菜单里会自动多出一个 memtest86+ 条目。绝大多数场景没有影响,但如果你的机器是通过 IPMI/PXE 之类的远程管理方式配置了固定的引导路径(部分云主机商的裸金属机型是这样),升级到 9.2 后需要用 efibootmgr -v 确认引导路径仍然指向 PVE 自己的加载器(类似 \EFI\proxmox\shimx64.efi 或 \EFI\systemd\systemd-bootx64.efi),而不是被新加入的 memtest86+ 条目抢了默认启动项。

检查结果 ​

改动之后,逐项确认:

sh
# 1. 正在运行的内核符合预期
uname -r

# 2. ESP 同步状态正常
proxmox-boot-tool status

# 3. 固定状态符合预期(有没有 pin、pin 的是哪个版本)
proxmox-boot-tool kernel list

# 4. 引导项里能看到预期的加载器
efibootmgr -v

常见问题 ​

执行了 kernel pin,重启后还是启动了别的内核。 先确认跑没跑 proxmox-boot-tool refresh。仍不行的话尝试 proxmox-boot-tool reinit 后再 refresh。ZFS 根文件系统、UEFI 引导的系统在从 PVE 7 升级到 8 时有过一个已知问题:需要手动安装 systemd-boot 软件包,8 升 9 时如果之前没处理过这个问题可能还会遇到,可以按从 PVE 8 升级到 9(规划中)里的说明排查,或先查官方 Wiki 的 Host Bootloader 页面确认当前状态。

开了 Secure Boot,怎么选引导方式。 Secure Boot 场景只支持 GRUB(带 shim 签名),不支持 systemd-boot。proxmox-boot-tool init <分区> grub 可以强制某块 ESP 用 GRUB。

升级到 9.2 后开机进了 memtest86+ 而不是系统。 参考上文「PVE 9.2 新增的 memtest86+ 引导项」,用 efibootmgr -v 核对并修正默认引导路径;用了第三方引导管理器(如 rEFInd)的话,需要在它的配置里把内核条目排到 memtest86+ 之前。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。