折腾笔记

折腾笔记

PVE 实战:拔掉 PCI 硬盘后网卡灯不亮的排查与解决

2025-09-06

最近在 PVE 上做实验的时候,遇到一个奇怪的问题:我拔掉了一块 PCI 硬盘,结果原本运行正常的 PCI 网卡 灯完全不亮了,PVE 里也无法识别网络。开始我还以为是网卡坏了,但换到其他系统上一试,网卡完全正常,这让我非常困惑。经过一番排查,发现问题其实和 PCI 地址漂移和 VFIO 直通绑定 有关。


1. 事情经过

我在 PVE 上配置了:

  • 一块 PCI NVMe 硬盘(Biwin)

  • 一块 PCI 网卡(Intel I226-V)

硬盘原本用于虚拟机直通,网卡用于 PVE 系统本身上网。拔掉硬盘后,网卡完全失效,灯不亮,ip link 看不到接口。

我第一时间怀疑硬件坏掉,但在其他系统测试网卡一切正常,于是排除了硬件问题。


2. 排查思路

2.1 检查 PCI 设备

在 PVE 上运行:

lspci -nn | grep Ethernet

结果显示网卡仍在系统里:

02:00.0 Ethernet controller: Intel I226-V [8086:125c]

但是检查驱动:

lspci -k -nn | grep -A3 02:00.0

发现:

Kernel driver in use: vfio-pci
Kernel modules: igc

说明网卡 被 VFIO 绑定了,PVE 无法使用它,所以灯不亮。

2.2 核心原因

结合 IOMMU 分组和 PCI 地址,我发现关键点是:

  • 拔掉硬盘后,PCI 总线号变化:原本网卡在 02:00.0 → 变成 01:00.0

  • PVE 配置里,01:00.0 原本是直通给虚拟机的硬盘

  • 结果网卡被错误绑定到 VFIO,系统驱动失效 → 灯不亮 → 无网络

所以问题根源其实是 PCI 地址漂移导致 VFIO 绑定错误


3. 解决办法

3.1 暂时解除 VFIO 绑定

先解除误绑定:

echo 0000:01:00.0 > /sys/bus/pci/drivers/vfio-pci/unbind

3.2 绑定回系统驱动

然后绑定到 Intel I226-V 的正常驱动:

echo 0000:01:00.0 > /sys/bus/pci/drivers/igc/bind

确认网卡状态:

ip link

网卡应该出现,灯也亮起来,可以正常上网。

3.3 避免下次问题

  1. 不要在 PVE 配置里写死 PCI 地址

    • 使用 vendor:device ID 绑定 VFIO 比如:

      options vfio-pci ids=8086:125c
      
    • 这样即使 PCI 地址变化,也能正确识别设备。

  2. 主板 BIOS 设置

    • 打开 Consistent Device Naming / PCIe slot fixed mapping,减少 PCI 地址漂移的风险。


4. 总结

这次经历让我深刻体会到 PVE 下 PCI 设备直通的坑:

  • 拔掉硬盘不是单纯的硬件操作,可能会改变其他 PCI 设备的总线号

  • VFIO 绑定是 静态绑定 PCI 地址,容易因为地址漂移导致系统设备失效

  • 排查思路是:先确认 PCI 地址 → 检查驱动 → 解除 VFIO 绑定 → 绑定回系统驱动

通过这些步骤,我最终把网卡恢复正常,也总结出了一套 拔 PCI 硬盘后修复网卡的经验

如果你在 PVE 上遇到 网卡灯不亮、接口消失 的情况,记得先别急着换硬件,多半是 PCI 地址漂移和 VFIO 绑定的问题。

  • 0