HOOOS

PVE 升级后直通网卡频繁掉线?手把手教你安全回退并永久锁定内核版本

0 16 折腾群群主 PVEPCIe直通软路由
Apple

在玩 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 运行在那个稳定的旧内核下。

  1. 重启 PVE 主机
  2. 在连接显示器的物理屏幕上(或通过 IPMI / IKVm),密切注意引导画面。
  3. 关键操作
    • 如果你的 PVE 是 GRUB 引导(传统 BIOS 或部分 UEFI),在启动菜单出现时,按方向键选择 "Advanced Options for Proxmox VE",然后选择你之前那个稳定的内核版本(比如 6.2.16-3-pve)启动。
    • 如果你的 PVE 是 systemd-boot 引导(现代 UEFI 默认),在启动时连续狂按 Space(空格键)或 Esc 键,会弹出一个内核选择菜单,使用方向键选择旧内核启动。

进入系统后,可以通过 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 分区空间。如果你强迫症严重,或者担心哪天配置出问题又跳回新内核,可以直接把坏事的内核卸载掉。

  1. 查询带有新内核版本号的软件包

    dpkg --get-selections | grep pve-kernel
    

    或者直接寻找特定的内核 meta 包:

    dpkg -l | grep "pve-kernel-6.8"
    
  2. 彻底卸载新内核(以 6.8.4 为例):

    apt purge pve-kernel-6.8.4-2-pve
    

    注意:绝对不要卸载你当前正在运行的(uname -r 显示的)内核!

  3. 更新引导配置(卸载后通常会自动触发,但手动跑一次更保险):

    proxmox-boot-tool refresh
    

进阶:不想回退内核,如何修复直通网卡掉线?

如果你因为某些原因(例如需要新内核对新 CPU 的大小核调度支持)必须留在新内核,可以通过**禁用 PCIe 节能(ASPM)屏蔽 PCIe 报错(AER)**来尝试解决网卡直通掉线的问题。

方法:修改 Grub 引导参数

  1. 编辑 Grub 配置文件:

    nano /etc/default/grub
    
  2. 找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,在原有参数(如 intel_iommu=on)后面,追加以下参数:

    pcie_aspm=off pci=noaer
    
    • pcie_aspm=off:彻底关闭 PCIe 链路的主动电源管理,不让网卡进入低功耗状态,从根本上杜绝因“睡死”导致的掉线。
    • pci=noaer:禁用 PCIe 先进错误报告(AER)。这样系统就不会因为网卡出现微小的瞬态抖动而向控制台疯狂报错、甚至重置整个 PCIe 槽位。
  3. 保存并退出(在 nano 中,按 Ctrl+O 回车保存,Ctrl+X 退出)。

  4. 更新引导:

    • 如果是 GRUB 引导:update-grub
    • 如果是 systemd-boot 引导,或不确定引导方式,统一执行:proxmox-boot-tool refresh
  5. 重启 PVE 主机,再次观察网卡直通运行状态。

总结

对于家用 AIO 软路由设备来说,稳定永远大于一切。新内核带来的跑分提升或微弱的功耗下降,远没有“网络不掉线”来得实在。

如果你的网卡直通在老内核下工作得完美无瑕,强烈建议使用 proxmox-boot-tool kernel pin 将其牢牢锁死。让专业的人做专业的事,让稳定的内核服务稳定的网络。

点评评价

captcha
健康