默认配置下,网卡开启 SR-IOV 后需要将虚拟机的网卡类型改为 PCIe 直通,修改为直通后 Proxmox VE 无法正常读取统计信息。提供一个不太优雅的解决方法。

前提条件

需要使用到 VF Representors 接口(下文简称 Reps)。网卡必须支持并开启 SwitchDev 特性。

  • mlx5 网卡开启 E-Switch 分载、SwitchDev 特性可以阅读这篇文章

Reps 接口命名

Proxmox VE 9 及更新版本中,Reps 接口的系统默认命名规则是 PFNAMErVFID

如果使用老版本,Reps 接口命名规则由网卡驱动决定,以 NVIDIA/Mellanox 网卡为例,命名规则为 PFNAMEpfXvfY,X 为 PF 接口号,Y 为 VF 接口号。

修改前检查

SR-IOV 接口有网络活动时,宿主机上的 VF Representors 接口统计数据会正常更新。

1
2
3
4
5
6
7
8
$ ifconfig ens0f0h1
ens0f0h1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1c70:19ff:fefe:56fb prefixlen 64 scopeid 0x20<link>
ether 1e:70:19:fe:56:fb txqueuelen 1000 (Ethernet)
RX packets 307679053 bytes 212674010217 (198.0 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 246924012 bytes 159490311908 (148.5 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

确认接口数据正常后即可修改 PVE 代码。

操作步骤

  1. 先找到 SR-IOV VF 对应的 Representor 接口。

  2. 修改 /usr/share/perl5/PVE/ProcFSTools.pm
    找到 read_proc_net_dev 函数,大概位置在第 375 行。
    return 前加入下面代码:

1
2
3
4
5
if (!exists $res->{'TAP-DEV'} && exists $res->{'VF-REP-DEV'}) {
$res->{'TAP-DEV'} = {
%{$res->{'VF-REP-DEV'}}
};
}
  • TAP-DEV 修改为 tapXXXiYXXX 为 VMID,Y为网卡序号(任意非负整数,且不与已存在的序号重复)
  • VF-REP-DEV 修改为 Representor 接口名。
  1. 如果存在多个接口、多个 VM,则为每个接口、每个 VM 重复上面的步骤。

  2. 重启 pvestatd :
    systemctl restart pvestatd

操作完成后即可看到 WebUI 正常显示流量统计:
Proxmox VE WebUI Network Stats

关闭更新

此步骤是可选的。

系统更新可能会覆盖上述更改。

使用下面的命令阻止更新:

1
apt-mark hold libpve-common-perl

使用下面的命令恢复更新:

1
apt-mark unhold libpve-common-perl