在玩 PVE(Proxmox VE)和软路由(如 OpenWrt)的圈子里,有句流传很广的话:“没事别瞎升级”。
很多折腾 All in One 的朋友,手痒点了 PVE 的系统更新,把内核从 5.15 升级到 6.2 甚至 6.5 / 6.8 之后,突然发现原本稳定的直通网卡(尤其是 Intel i225-V、i226-V,或者是瑞昱 Realtek 8125B)开始频繁掉线。系统日志(dmesg)里充斥着大量的 PCIe Bus Error: severity=Corrected 或者网卡重置的报错,直接导致全家断网,血压飙升。
这通常是因为新内核中的 PCIe ASPM(活动状态电源管理) 策略,或者新驱动对某些硬件的节能特性兼容性不佳,导致直通给虚拟机的网卡在低负载时被强行“休眠”或发生硬件重置。
如果你也遇到了这个问题,最快、最稳妥的解决方案就是回退到之前稳定的内核,并将其锁定,防止后续更新再次被覆盖。下面是保姆级的操作指南。
第一步:临时切回旧内核(确保系统可达)
在锁定内核之前,我们首先需要让 PVE 运行在那个稳定的旧内核下。
- 重启 PVE 主机。
- 在连接显示器的物理屏幕上(或通过 IPMI / IKVm),密切注意引导画面。
- 关键操作:
- 如果你的 PVE 是 GRUB 引导(传统 BIOS 或部分 UEFI),在启动菜单出现时,按方向键选择 "Advanced Options for Proxmox VE",然后选择你之前那个稳定的内核版本(比如
6.2.16-3-pve)启动。 - 如果你的 PVE 是 systemd-boot 引导(现代 UEFI 默认),在启动时连续狂按
Space(空格键)或Esc键,会弹出一个内核选择菜单,使用方向键选择旧内核启动。
- 如果你的 PVE 是 GRUB 引导(传统 BIOS 或部分 UEFI),在启动菜单出现时,按方向键选择 "Advanced Options for Proxmox VE",然后选择你之前那个稳定的内核版本(比如
进入系统后,可以通过 uname -r 命令确认当前是否已经成功运行在旧内核下。
第二步:使用官方推荐工具锁定内核
网上很多老教程会教你修改 /etc/default/grub 或者去改 systemd-boot 的配置文件。千万不要这样做!
从 PVE 7.x 开始,官方引入了专用工具 proxmox-boot-tool,它可以自动识别你使用的是 GRUB 还是 systemd-boot,并安全地管理内核引导。使用它来锁定内核,不仅简单,而且绝对不会把引导写挂。
1. 列出系统当前已安装的所有内核
在 PVE 的 Shell 终端运行以下命令:
proxmox-boot-tool kernel list
你将看到类似下面的输出:
Manually selected kernels:
None.
Automatically selected kernels:
6.8.4-2-pve
6.5.11-8-pve
6.2.16-3-pve
这里会显示你当前系统里备选的旧内核版本(例如 6.2.16-3-pve)。
2. 锁定(Pin)你想要的旧内核
假设我们要锁定 6.2.16-3-pve 这个版本,直接执行:
proxmox-boot-tool kernel pin 6.2.16-3-pve
系统会输出提示,告诉你该内核已经被锁定为默认启动内核。
3. 验证锁定状态
再次运行 proxmox-boot-tool kernel list,你会发现它已经发生了变化:
Manually selected kernels:
6.2.16-3-pve
Automatically selected kernels:
6.8.4-2-pve
6.5.11-8-pve
只要 6.2.16-3-pve 处于 Manually selected kernels 下,后续无论你执行 apt update && apt upgrade 升级了多少次系统,PVE 在重启时都会强行默认启动这个被锁定的内核。
日后如何解除锁定?
如果你以后换了网卡,或者新内核修复了 Bug,想要恢复自动升级最新内核,只需执行一行命令解锁即可:proxmox-boot-tool kernel unpin
第三步:彻底清理“有毒”的新内核(可选)
虽然锁定内核后,新内核不会被启用,但它们依然会占用 /boot 分区空间。如果你强迫症严重,或者担心哪天配置出问题又跳回新内核,可以直接把坏事的内核卸载掉。
查询带有新内核版本号的软件包:
dpkg --get-selections | grep pve-kernel或者直接寻找特定的内核 meta 包:
dpkg -l | grep "pve-kernel-6.8"彻底卸载新内核(以 6.8.4 为例):
apt purge pve-kernel-6.8.4-2-pve注意:绝对不要卸载你当前正在运行的(uname -r 显示的)内核!
更新引导配置(卸载后通常会自动触发,但手动跑一次更保险):
proxmox-boot-tool refresh
进阶:不想回退内核,如何修复直通网卡掉线?
如果你因为某些原因(例如需要新内核对新 CPU 的大小核调度支持)必须留在新内核,可以通过**禁用 PCIe 节能(ASPM)和屏蔽 PCIe 报错(AER)**来尝试解决网卡直通掉线的问题。
方法:修改 Grub 引导参数
编辑 Grub 配置文件:
nano /etc/default/grub找到
GRUB_CMDLINE_LINUX_DEFAULT这一行,在原有参数(如intel_iommu=on)后面,追加以下参数:pcie_aspm=off pci=noaerpcie_aspm=off:彻底关闭 PCIe 链路的主动电源管理,不让网卡进入低功耗状态,从根本上杜绝因“睡死”导致的掉线。pci=noaer:禁用 PCIe 先进错误报告(AER)。这样系统就不会因为网卡出现微小的瞬态抖动而向控制台疯狂报错、甚至重置整个 PCIe 槽位。
保存并退出(在 nano 中,按
Ctrl+O回车保存,Ctrl+X退出)。更新引导:
- 如果是 GRUB 引导:
update-grub - 如果是 systemd-boot 引导,或不确定引导方式,统一执行:
proxmox-boot-tool refresh
- 如果是 GRUB 引导:
重启 PVE 主机,再次观察网卡直通运行状态。
总结
对于家用 AIO 软路由设备来说,稳定永远大于一切。新内核带来的跑分提升或微弱的功耗下降,远没有“网络不掉线”来得实在。
如果你的网卡直通在老内核下工作得完美无瑕,强烈建议使用 proxmox-boot-tool kernel pin 将其牢牢锁死。让专业的人做专业的事,让稳定的内核服务稳定的网络。