1.关于SR-IOV
SR-IOV是Single Root I/O Virtualization的缩写,对于网卡来说,就是一个物理网卡可以虚拟出来多个轻量化的PCI-e物理设备,从而分配给不同的虚拟机使用(每个虚拟机就像拥有单独的物理网卡一样)。其性能结余纯虚拟网卡和物理网卡之间——纯虚拟性能 < SR-IOV虚拟性能 < 物理直通性能。
2.前提条件
2.1.软件系统要支持(比如esxi、pve、unraid……)
2.2.主板要支持、cpu要支持(在bios设置中要有vt-d选项且必须打开,有的文章说还要有SR-IOV设置选项,经我测试,sr-iov这个不是必备项——我的华擎B365M-Pro4没有这个选项也是可以成功开启的,但如果主板bios有单独的SR-IOV选项,也必须要打开。),对于unraid系统,进入web-gui界面右上角“显示器”图标查看系统信息,如果HVM、IOMMU均显示为“已启用”则可以支持。
2.3.网卡要支持,比如intel的i350-T4千兆网卡(但网上寨卡比较多,原装的又比较贵),还有我最近买的X550-T2(万兆、5千兆、2.5千兆、千兆、百兆之间自适应)、X540-T2(只能在万兆、千兆之间切换)等网卡都可以。在unraid中可以通过如下方法查看你的网卡是否支持sr-iov:
①.如果是6.9x版本(我在试用阶段也完全没问题),可在【工具】→【系统设备】页面直接将鼠标放在欲查询的网卡,在弹出的信息框中如果出现sr-iov字样则支持,否则不支持(下图中8086:1563】 01:00.0对应的X550T这个网口是支持sr-iov的):
②.或者shell窗口输入(所有版本通用)cat /sys/bus/pci/devices/0000:设备ID/sriov_totalvfs 可以查看最大虚拟设备数,如果该数值大于0,则支持。设备ID可参照上图理解:【8086:1563】 01:00.0的对应设备ID为01:00.0,则cat /sys/bus/pci/devices/0000:01:00.0/sriov_totalvfs,我的显示为63,表示支持sr-iov且可虚拟出63个网卡。而我的另外一张网卡RTL8125 2.5GbE([10ec:8125] 04:00.0) ,运行cat /sys/bus/pci/devices/0000:04:00.0/sriov_totalvfs后输出No such file or directory,则该网卡不支持sr-iov。
3.开启网卡的sr-iov:
3.1.修改【Main】→【Flash】→【Syslinux 配置】→【Unraid OS】及【Unraid OS GUI Mode】,在append与 initrd=/bzroot之间添加如下代码(需要保存并重启系统):
pcie_acs_override=downstream,multifunction vfio_iommu_type1.allow_unsafe_interrupts=1 intel_iommu=on iommu=pt pci_pt_e820_access=on pci=assign-busses
3.2.虚拟出网卡,还是以前述的X550第1个网口为例,假如我要虚拟3个网卡,则输入如下命令即可:
echo 3 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs
现在去【工具】→【系统设备】中就可以看到新增的3张虚拟网卡了(同时记住该虚拟网卡的群组ID【8086:1565】,在后续屏蔽后直通时有用)
如果需要取消,则输入echo 0 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs即可。
由于unraid系统的特殊性,在shell窗口输入的命令重启后就失效了,所以在测试成功后可以通过CA Config Editor插件在go文件添加echo 3 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs就可以每次启动时均自动加载虚拟网卡了。
3.4.固定虚拟网卡的mac地址:(此步骤非必须,我只是为了绑定虚拟网卡的ip以便于管理——SR-IOV虚拟出来的网卡mac地址会随着虚拟机开关发生变化)
这步的关键是要搞清楚开启SR-IOV功能的网卡在unraid系统中的网络接口编号,所以在所有的开启SR-IOV动作之前,必须先进行unraid的网络设置,并记录好。我的系统主板自带2个网卡,再添加了一张支持SR-IOV的X550-T2网卡,现在的【设置】→【网络设置】如下
因为我是在eth2上开启的sr-iov,为了确认一下,还可以用如下命令核实一下:
ip link show dev eth2
确实有3张虚拟网卡(第一行为对应的物理网卡信息,最后3行vf 0,vf 1,vf 2为虚拟出来的网卡,由于我已经设置了固定mac,所以显示了不同的mac地址,否则mac地址全是0)
接下来就可以输入如下命令将虚拟网卡的mac地址固定了:
ip link set eth接口名 vf vf序号 mac MAC地址
对应我的则是:
ip link set eth2 vf 0 mac 00:55:01:01:00:00
ip link set eth2 vf 1 mac 00:55:01:01:00:01
ip link set eth2 vf 2 mac 00:55:01:01:00:02
说明:我的Z490-itx之X550-T2是将第1个口进行虚拟化,由于490板载2个网卡,所以X550-T2第1个网口在unraid中为eth2,为了便于理解和记忆,我将其mac地址按如下规则重新命名:(:55:01:01代表第1张X550网卡第1个网口,末尾:00代表第0个虚拟网卡,:01代表第1个虚拟网卡……),你可以根据自己喜好自行发挥——比如第2张350网卡第2个口的第10个虚拟网卡改成00:35:02:02:00:10
(测试成功后将前述语句写入go文件,就不用每次重启unraid后再手工敲入命令来写mac了)
4.屏蔽并直通虚拟网卡
4.1.屏蔽虚拟网卡:不能在【系统设备】或【vfio-pci cfg插件】中进行屏蔽!不能在【系统设备】或【vfio-pci cfg插件】中进行屏蔽!不能在【系统设备】或【vfio-pci cfg插件】中进行屏蔽!只能在【Main→Flash】中添加代码屏蔽——在系统设备中查看虚拟网卡的群组ID(参照3.2步骤图片显示),我的为8086:1565,则将其加入到【Main】→【Flash】→【Syslinux 配置】→【Unraid OS】及【Unraid OS GUI Mode】的append与 initrd=/bzroot之间,加上之前的代码,合并后完整代码为:append pcie_acs_override=downstream,multifunction vfio_iommu_type1.allow_unsafe_interrupts=1 intel_iommu=on iommu=pt pci_pt_e820_access=on pci=assign-busses vfio-pci.ids=8086:1565 initrd=/bzroot
重启unraid。
4.2.直通虚拟网卡:在添加虚拟机或虚拟机编辑时最末端的其他PCI设备中就可以找到刚虚拟出来的网卡了。选中,更新即可。
我是把它直通给windows10虚拟机的(当然你也可以虚拟给openwrt等软路由、其它nas系统作为WAN使用),开启windows虚拟机等待安装虚拟网卡驱动(如果windows不能自动安装驱动,可以通过第三方驱动安装工具软件来安装)后即可正常使用。