如何让多台KVM虚拟机通过PCIe共享访问同一FPGA设备?
可行的解决方法
1. 利用FPGA厂商的虚拟化/共享方案
多数主流FPGA厂商(如Xilinx、Intel)提供了官方的设备共享或虚拟化工具,这是最稳妥的方案:
- SR-IOV支持:如果你的FPGA支持SR-IOV(Single Root I/O Virtualization),可以在主机上启用该功能并创建多个虚拟功能(VF)。每个VF可独立分配给一台虚拟机,libvirt会将其识别为独立的PCIe设备,不会触发占用冲突。
- 操作步骤:
- 检查FPGA的SR-IOV支持:
lspci -v -s 0000:05:00.0,查看是否有SR-IOV: Supported字段。 - 启用SR-IOV:通过sysfs设置VF数量,比如
echo 4 > /sys/bus/pci/devices/0000:05:00.0/sriov_numvfs。 - 用
lspci确认新生成的VF设备(通常是同总线号下的新设备,如0000:05:00.1、0000:05:00.2等),然后通过virsh attach-device给每个虚拟机分配对应的VF。
- 检查FPGA的SR-IOV支持:
- 操作步骤:
- 厂商专用虚拟化套件:Xilinx的Vitis虚拟化工具、Intel的FPGA Virtualization Suite等,这类工具通过软件层实现FPGA资源的切片共享,无需直接PCIe透传,可直接在多虚拟机中访问分配的FPGA切片。
2. 使用VFIO Mediated Device(mdev)
如果你的FPGA支持VFIO mdev框架,可以创建多个虚拟设备实例,让多台虚拟机通过这些虚拟设备共享物理FPGA:
- 操作步骤:
- 加载必要内核模块:
modprobe vfio vfio-mdev。 - 检查FPGA的mdev支持:查看
/sys/bus/pci/devices/0000:05:00.0/mdev_supported_types目录下是否有可用的设备类型。 - 创建mdev设备实例:选择一个支持的类型,比如
echo "unique-uuid-here" > /sys/bus/pci/devices/0000:05:00.0/mdev_supported_types/<type>/create。 - 在虚拟机的XML配置中添加该mdev设备,替换原有的物理PCIe设备配置:
<hostdev mode='subsystem' type='mdev' managed='no'> <source> <address uuid='unique-uuid-here'/> </source> </hostdev> - 重启虚拟机生效。
- 加载必要内核模块:
3. 绕过libvirt设备锁定(不推荐)
libvirt的设备锁定机制是为了防止硬件冲突,强行绕过可能导致数据损坏、硬件故障或系统崩溃,仅在测试环境且明确风险的情况下尝试:
- 操作步骤:
- 编辑libvirt配置文件:
sudo nano /etc/libvirt/qemu.conf。 - 添加或修改配置项:
device_lock = "none"。 - 重启libvirtd服务:
sudo systemctl restart libvirtd。
- 编辑libvirt配置文件:
- 注意:此方法会完全禁用libvirt的PCIe设备占用检查,多虚拟机同时访问同一物理设备时,需要确保FPGA自身支持多主机访问,否则极易引发硬件问题。
内容的提问来源于stack exchange,提问作者Sterling
相关产品推荐
相关产品推荐

