相同PCI设备ID的双网卡Stub(VFIO-PCI)实现及相关疑问
相同PCI设备ID的双网卡Stub(VFIO-PCI)实现及相关疑问
嘿Marco,我来帮你捋清楚这两个问题~
1. 相同PCI设备ID是完全正常的
你不用惊讶,PCI设备ID是用来标识硬件型号的,不是每个单独设备的唯一ID。同一品牌同一型号的网卡,设备ID必然相同——就像同一型号的手机,型号编号都是一样的,区分它们的是各自的PCI地址(也就是你看到的02:00.0和03:00.0),这才是每个网卡独有的标识。
2. 如何只用VFIO-PCI Stub其中一块网卡?
当然可以实现,核心思路就是通过PCI地址精准绑定指定网卡到vfio-pci驱动,而不是通过设备ID(那样会把两块都绑走)。下面分临时生效和持久化两种方案:
临时生效(单次开机有效,适合测试)
- 先确定要Stub的网卡PCI地址(比如
0000:02:00.0,注意要加前缀0000:,部分系统需要完整域名),先卸载它当前的驱动(Realtek网卡一般是r8169):echo 0000:02:00.0 > /sys/bus/pci/drivers/r8169/unbind - 让vfio-pci驱动识别该设备ID,再绑定指定地址:
# 让vfio-pci识别你的网卡设备ID echo 10ec 8161 > /sys/bus/pci/drivers/vfio-pci/new_id # 把目标网卡绑定到vfio-pci echo 0000:02:00.0 > /sys/bus/pci/drivers/vfio-pci/bind - 验证:用
lspci -nnk -s 02:00.0查看,输出里的Kernel driver in use应该变成vfio-pci。
持久化设置(开机自动生效)
如果你想每次开机自动Stub指定网卡,修改GRUB内核参数是最稳妥的方式:
- 编辑GRUB配置文件:
sudo nano /etc/default/grub - 找到
GRUB_CMDLINE_LINUX这一行,添加针对特定PCI地址的vfio绑定参数,比如:
(保留原来的参数,只在后面加这段)GRUB_CMDLINE_LINUX="... vfio-pci.addr=0000:02:00.0" - 确保vfio相关模块开机自动加载:创建
/etc/modules-load.d/vfio.conf文件,写入:vfio vfio_iommu_type1 vfio_pci - 更新GRUB配置:
- Debian/Ubuntu系:
sudo update-grub - RHEL/CentOS系:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
- Debian/Ubuntu系:
- 重启系统后,用
lspci -nnk验证目标网卡的驱动是否已经是vfio-pci。
小提示
如果绑定失败,大概率是目标网卡被NetworkManager或其他网络服务占用了——先在系统设置里禁用该网卡的网络连接,再执行绑定操作就好啦。
备注:内容来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

