虚拟机使用透传设备可以获得设备近乎原生的性能。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驱动挂载,进而继续上方(一)中的流程。
!!!特别注意:在将设备与宿主机上的驱动解绑之前,一定要为设备安装上驱动,再进行解绑!