在将 Proxmox VE (PVE) 升级到 8.0 甚至更高版本(内核升级至 6.2 / 6.5 / 6.8)后,不少将 Intel i226-V 网卡直通给 OpenWrt、iStoreOS 或 pfSense 等软路由系统的用户,都会遇到网卡无故断开、瞬间丢包、甚至彻底死机的问题。
在系统日志(dmesg 或 logread)中,通常伴随着以下报错:
igc 0000:01:00.0 eth0: Reset adapter unexpectedly
igc 0000:01:00.0 eth0: Tx Unit Hang
pcieport 0000:00:1c.0: AER: Uncorrected (Fatal) error received
这一问题的根源在于 PVE 8.0 的高版本内核启用了更激进的 PCIe 活动状态电源管理(ASPM)和节能以太网(EEE)策略,而 i226-V 网卡在直通(VFIO)状态下,无法很好地处理这些低功耗状态的转换,导致网卡控制器挂起。
以下是经过验证的彻底解决方案,建议按照步骤依次排查和配置。
一、 物理层与 BIOS 基础设置(首要步骤)
在调整系统软件之前,必须确保主板 BIOS 的节能设置不会干扰 PCIe 设备的正常运行。
- 进入主板 BIOS。
- 关闭 PCIe ASPM:找到
ASPM、Active State Power Management或PCI Express One Link Standby,将其设置为 Disabled(禁用)。 - 关闭全局节能设置:将
C-States或Global C-state Control暂时设为 Disabled,或者至少确保 PCIe 相关的节能选项处于关闭状态。 - VT-d 与 SR-IOV:确保
Intel Virtualization Technology和VT-d保持 Enabled(开启)。
二、 PVE 宿主机配置:禁用内核 ASPM
即使在 BIOS 中关闭了 ASPM,Linux 内核在启动时仍可能自行接管并启用。我们需要在 PVE 宿主机的 GRUB/systemd-boot 中强制禁用 PCIe 电源管理。
1. 确定引导方式
在 PVE 命令行执行:
[ -d /sys/firmware/efi ] && echo "EFI 引导" || echo "Legacy 引导"
2. 修改引导参数
如果是 GRUB 引导(大多数情况):
编辑 /etc/default/grub 文件:
nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT 这一行,在末尾添加 pcie_aspm=off 和 pcie_port_pm=off。
修改后的效果类似于:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_aspm=off pcie_port_pm=off"
保存退出后,更新 GRUB:
update-grub
如果是 systemd-boot 引导:
编辑 /etc/kernel/cmdline 文件:
nano /etc/kernel/cmdline
在整行内容的末尾空一格,添加 pcie_aspm=off pcie_port_pm=off。
保存退出后,更新内核配置:
proxmox-boot-tool refresh
修改完成后,务必重启 PVE 宿主机。
三、 虚拟机配置优化(关键步骤)
直通 i226-V 网卡给虚拟机(如 OpenWrt)时,虚拟机的硬件配置不当也会导致 PCIe 链路不稳定。
1. 检查机型(Machine)
- 不要使用默认的
i440fx。 - 进入 PVE 网页后台 -> 选择你的虚拟机 -> 硬件 -> 机型。
- 将其修改为
q35。q35架构能够更好地支持 PCIe 直通及相关的现代 PCI 设备特性。
2. 检查 PCI 设备直通参数
在虚拟机的硬件中双击你的 i226-V PCI 设备,确保以下设置:
- 全部功能 (All Functions):如果你的网卡是多口的(如双口 i226),且你想把这一组网卡都给这个虚拟机,请勾选此项。
- ROM-Bar:必须保持勾选。不勾选 ROM-Bar 可能会导致网卡初始化失败。
- PCI-Express:必须勾选。将设备挂载在虚拟的 PCIe 总线上,而不是传统的 PCI 总线上,这对于 i226-V 这种 2.5G 现代网卡至关重要。
四、 虚拟机内部:关闭 EEE 节能与 ASPM(最核心修复)
当网卡被直通给虚拟机后,实际控制该网卡的是虚拟机的内核驱动(如 OpenWrt 的 igc 驱动)。如果虚拟机内核依然尝试让网卡进入休眠,网卡依旧会断网。
以 OpenWrt 虚拟机为例,进行如下操作:
1. 禁用虚拟机内部的 ASPM
如果你的 OpenWrt 使用了 GRUB 引导(x86_64 常见),编辑 OpenWrt 引导分区下的 grub.cfg,在内核启动参数中同样加入:
pcie_aspm=off
这能防止虚拟机系统对直通网卡实施链路状态省电。
2. 彻底禁用 EEE(节能以太网)
节能以太网(Energy Efficient Ethernet, EEE)是 i226-V 在 Linux 下断网的超级元凶。网卡在没有流量时会降频省电,一旦有流量涌入,唤醒延迟会导致驱动判定“Tx Unit Hang”从而重置网卡。
在虚拟机中,安装 ethtool 工具:
# OpenWrt 环境
opkg update
opkg install ethtool
查询你的直通网卡(假设为 eth1)的 EEE 状态:
ethtool --show-eee eth1
你会看到 EEE status: enabled。
立即关闭 EEE:
ethtool --set-eee eth1 eee off
配置开机自动关闭 EEE
由于 ethtool 的设置在重启后会失效,需要将其写入开机自启脚本中。
在 OpenWrt 中,编辑 /etc/rc.local:
nano /etc/rc.local
在 exit 0 之前,加入以下命令(根据你的直通网卡实际接口名称修改,如 eth1, eth2):
# 禁用所有直通网卡的 EEE
ethtool --set-eee eth1 eee off
ethtool --set-eee eth2 eee off
保存退出。
五、 替代方案:退回到 VirtIO 半虚拟化网卡
如果你完成了上述所有调整,由于某些特定的硬件兼容性(如特定的 N100/N305 迷你主机主板布线问题),i226-V 依然存在极低概率的断线,建议放弃物理直通,转为使用 PVE 桥接的 VirtIO 半虚拟化网卡。
现代 CPU 的性能足够强劲,在 2.5G 吞吐下,VirtIO 网卡与直通网卡的性能损耗差异在伯仲之间,但稳定性有质的提升。
- 在 PVE 宿主机上,为 i226-V 网卡创建 Linux Bridge(如
vmbr1)。 - 在虚拟机硬件中,添加网络设备,模式选择 VirtIO (semi-virtualized),桥接至对应的
vmbrX。 - 开启 PVE 网卡的多队列(Multiqueue),充分释放多核 CPU 性能。
总结
PVE 8.0 升级带来的 i226-V 断网,90% 归咎于 PCIe ASPM 与 EEE 节能 冲突。通过在 BIOS 禁用节能 -> PVE 命令行禁用 ASPM -> 虚拟机内用 ethtool 禁用 EEE 这三板斧,基本可以完美解决直通断网的问题,让你的软路由重新恢复 7x24 小时稳定运行。