FPGA通过vfio实现pci-passthrough给kvm虚拟机

版权声明:转载请注明出处 https://blog.csdn.net/fan_lulu/article/details/84258780

        虚拟机使用透传设备可以获得设备近乎原生的性能。Intel 和 AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为 Virtualization Technology for Directed I/O (VT-d),而 AMD 称之为 I/O Memory Management Unit (IOMMU)。不管是哪种情况,最新的 CPU 都提供将 PCI 物理地址映射到客户虚拟系统的方法。当这种映射发生时,硬件将负责访问(和保护),客户操作系统在使用该设备时,就仿佛它不是一个虚拟系统一样。除了将客 户机映射到物理内存外,新的架构还提供隔离机制,以便预先阻止其他客户机(或管理程序)访问该内存。

一.配置流程

0.首先查阅官方的硬件支持列表或者查看BIOS中的相关选项,以确认cpu及主板是否支持intel或amd的硬件辅助虚拟化功能。另外需透传的设备也需支持pci-passthrough

以下步骤基于环境:Intel(R) Core(TM) i7-4790 CPU + Xilinx artix7 +ubuntu 16.04.3 LTS

1.在bios中打开硬件辅助虚拟化功能

将VT(VT-x)及VT-d选项更改为enable,使其支持硬件虚拟化。

2.编辑文件 /etc/default/grub,以更改liunx内核启动参数

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"
GRUB_CMDLINE_LINUX="locale=zh_CN intel_iommu=on"

中增加 intel_iommu=on

接着运行:

sudo update-grub

grub-mkconfig -o /boot/grub/grub.cfg

 以更新刚刚修改的内核参数,之后进行重启。

运行

cat /proc/cmdline |grep iommu

以查看目前的内核启动参数

有输出即为配置成功

输出如下:

3.确定需要透传的pci设备的设备地址及设备号

运行

从图中找到需要透传的设备 其设备pci地址为0000:05:00.0,设备号为 10ee:7014

运行

virsh nodedev-dumpxml pci_0000_05_00_0

以查看此设备信息

可以看到目前的驱动为xdma

4. 将设备与目前的驱动解绑

运行

 virsh nodedev-detach pci_0000_05_00_0

得到结果

此时再次运行

virsh nodedev-dumpxml pci_0000_05_00_0

查看设备信息

此时设备没有驱动

5.加载vfio模块

modprobe vfio

modprobe vfio-pci

运行

lsmod | grep vfio

有输出即为加载成功

6.挂载vfio驱动

运行

sudo echo 10ee 7014 >/sys/bus/pci/drivers/vfio-pci/new_id

再次运行

virsh nodedev-dumpxml pci_0000_05_00_0

查看设备信息

此时的driver为vfio-pci

7.阶段性验证

此时查看设备所处的iommu_group

查看到设备所处的组号为13

查看此组下的所有设备

发现此组下只有一个设备0000:05:00.0

检测iommu_group是否绑定成功,运行

ls /dev/vfio

输出

会发现此文件夹下多了13这个组号,即为挂载成功!

8.启动KVM虚拟机

在终端输入以启动虚拟机管理软件

sudo virt-manager

点击感叹号对虚拟机硬件设备进行设置

点击 添加硬件 将FPGA添加至虚拟机的硬件菜单中

之后启动虚拟机

9.结果验证

在虚拟机中运行

lspci -nn

FPGA透传给KVM虚拟机完成。

二.透传过程中出现的错误

1.在宿主机中 运行 load_driver.sh 安装FPGA驱动时,出现权限不够的问题

解决方法:用 chmod 命令对shell脚本预付权限,再执行即可

# chmod 777 ./load.driver.sh
# ./load_driver.sh

2.安装FPGA驱动,出现Failed的问题

解决方法:

3.执行

 virsh nodedev-detach pci_0000_05_00_0

出现如下错误:

neither VFIO nor KVM device assignment is currently supported on this system

并且在下面的文件夹中找不到 iommu_group及iommu文件夹。

根据目前的认识,问题可能都出现在一个地方

在对内核启动文件进行更改时,开始只更改了

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"

而对下面这个参数没有做更改

GRUB_CMDLINE_LINUX="locale=zh_CN"

之后对此参数进行修改如下

再按照上方流程中的更新方式对grub文件进行更新并重启。

重启后,能够找到 iommu_group及iommu文件夹,能够对设备与其目前驱动进行解绑,能够查看此设别的iommu组号,能够将设备与vfio驱动挂载,进而继续上方(一)中的流程。

!!!特别注意:在将设备与宿主机上的驱动解绑之前,一定要为设备安装上驱动,再进行解绑!

猜你喜欢

转载自blog.csdn.net/fan_lulu/article/details/84258780
今日推荐