|
| 1 | +--- |
| 2 | +title: Proxmox VE SR-IOV 开启流量统计 |
| 3 | +date: 2025-11-19 00:00:00 |
| 4 | +updated: 2025-11-19 00:00:00 |
| 5 | +categories: 教程 |
| 6 | +tags: |
| 7 | +- Linux |
| 8 | +- PVE |
| 9 | +- 虚拟机 |
| 10 | +- 网卡 |
| 11 | +- SR-IOV |
| 12 | +thumbnailImage: https://lfs.libmbr.com/assets/2025/11/19/2b947baf-34a8-4a04-9d3a-118a9f7e5325.webp |
| 13 | +--- |
| 14 | +默认配置下,网卡开启 SR-IOV 后需要将虚拟机的网卡类型改为 PCIe 直通,修改为直通后 Proxmox VE 无法正常读取统计信息。提供一个不太优雅的解决方法。 |
| 15 | + |
| 16 | +<!-- more --> |
| 17 | + |
| 18 | +## 前提条件 |
| 19 | +需要使用到 [VF Representors 接口](https://docs.kernel.org/networking/representors.html)(下文简称 Reps)。网卡必须支持并开启 SwitchDev 特性。 |
| 20 | + |
| 21 | +- mlx5 网卡开启 E-Switch 分载、SwitchDev 特性可以阅读[这篇文章](/archives/508/#配置-E-Switch-分载)。 |
| 22 | + |
| 23 | +## Reps 接口命名 |
| 24 | +Proxmox VE 9 及更新版本中,Reps 接口的系统默认命名规则是 ``PFNAMErVFID`` |
| 25 | + |
| 26 | +如果使用老版本,Reps 接口命名规则由网卡驱动决定,以 NVIDIA/Mellanox 网卡为例,命名规则为 ``PFNAMEpfXvfY``,X 为 PF 接口号,Y 为 VF 接口号。 |
| 27 | + |
| 28 | +## 修改前检查 |
| 29 | +SR-IOV 接口有网络活动时,宿主机上的 VF Representors 接口统计数据会正常更新。 |
| 30 | + |
| 31 | +``` |
| 32 | +$ ifconfig ens0f0h1 |
| 33 | +ens0f0h1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 |
| 34 | + inet6 fe80::1c70:19ff:fefe:56fb prefixlen 64 scopeid 0x20<link> |
| 35 | + ether 1e:70:19:fe:56:fb txqueuelen 1000 (Ethernet) |
| 36 | + RX packets 307679053 bytes 212674010217 (198.0 GiB) |
| 37 | + RX errors 0 dropped 0 overruns 0 frame 0 |
| 38 | + TX packets 246924012 bytes 159490311908 (148.5 GiB) |
| 39 | + TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
| 40 | +``` |
| 41 | +确认接口数据正常后即可修改 PVE 代码。 |
| 42 | + |
| 43 | +## 操作步骤 |
| 44 | +1. 先找到 SR-IOV VF 对应的 Representor 接口。 |
| 45 | + |
| 46 | +2. 修改 ``/usr/share/perl5/PVE/ProcFSTools.pm`` |
| 47 | +找到 ``read_proc_net_dev`` 函数,大概位置在第 375 行。 |
| 48 | +在 ``return`` 前加入下面代码: |
| 49 | + |
| 50 | +```perl |
| 51 | +if (!exists $res->{'TAP-DEV'} && exists $res->{'VF-REP-DEV'}) { |
| 52 | + $res->{'TAP-DEV'} = { |
| 53 | + %{$res->{'VF-REP-DEV'}} |
| 54 | + }; |
| 55 | +} |
| 56 | +``` |
| 57 | +- ``TAP-DEV`` 修改为 ``tapXXXiY``,``XXX`` 为 VMID,``Y``为网卡序号(任意非负整数,且不与已存在的序号重复) |
| 58 | +- ``VF-REP-DEV`` 修改为 Representor 接口名。 |
| 59 | + |
| 60 | +3. 如果存在多个接口、多个 VM,则为每个接口、每个 VM 重复上面的步骤。 |
| 61 | + |
| 62 | +4. 重启 pvestatd : |
| 63 | +``systemctl restart pvestatd`` |
| 64 | + |
| 65 | +操作完成后即可看到 WebUI 正常显示流量统计: |
| 66 | + |
| 67 | + |
| 68 | +## 关闭更新 |
| 69 | +{% alert info %} |
| 70 | +此步骤是可选的。 |
| 71 | +{% endalert %} |
| 72 | + |
| 73 | +系统更新可能会覆盖上述更改。 |
| 74 | + |
| 75 | +使用下面的命令阻止更新: |
| 76 | +```perl |
| 77 | +apt-mark hold libpve-common-perl |
| 78 | +``` |
| 79 | + |
| 80 | +使用下面的命令恢复更新: |
| 81 | +```perl |
| 82 | +apt-mark unhold libpve-common-perl |
| 83 | +``` |
0 commit comments