10.9 PCI(e)直通

PCI(e)直通可以让虚拟机直接控制物理服务器的PCI硬件设备。与使用虚拟化硬件相比,这种方式的优势有低延迟,高性能以及其他功能特性(例如,任务卸载)。

主要缺点是,一旦采用直通方式,对应硬件就不能再被主机或其他虚拟机使用。

10.9.1通用要求

硬件直通往往需要硬件设备的支持,以下是启用该功能的前置检查项目和准备工作清单。

硬件设备

硬件设备需要支持IOMMU(I/O Memory Management Unit)中断重映射,这需要CPU和主板的支持。

通常,具备Intel VT-d功能的Intel硬件系统,或具备AMD-Vi功能的AMD硬件系统均可以满足要求。但这不意味着直通功能可以开箱即用,硬件设备缺陷,驱动软件不完备等因素都可能导致硬件直通无法正常工作。

一般来说,大部分硬件都可以支持该功能,但服务器级硬件一般比消费级硬件能更好支持直通功能。

可以联系硬件设备厂商,以确定你的硬件设备是否在Linux下支持直通功能。

配置

确定硬件支持直通功能后,还需要完成相应配置才行。

IOMMU

首先需要在内核命令行启用IOMMU功能,见3.10.4节。命令行参数如下:

  • Intel CPU

    Intel_iommu=on

  • AMD CPU

    amd_iommu=on

内核模块

将以下内容添加到配置文件’/etc/modules‘中,确保内核加载相应模块

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

然后还需要更新initramfs。命令行如下:

update-initramfs -u -k all

完成配置

配置完成后,需要重启以启用新配置。可用以下命令行查看新配置是否已启用。

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

如果显示IOMMU,Directed I/O或Interrupt Remapping已启用则表明配置已生效。具体显示内容随硬件类型而有所不同。

此外还需要确保直通硬件在独立的IOMMU组中。可用如下命令查看:

find /sys/kernel/iommu_groups/ -type 1

如硬件与其功能、根端口或PCI(e)桥在同一IOMMU组也可以正常直通,不受影响。

PCI(e)插槽

某些平台处理PCI(e)插槽的方式较为特别。如果发现硬件所在IOMMU组不符合直通要求,可以换个插槽试试看。

不安全的中断

某些平台允许使用不安全的中断。如需启用该功能,可以在/etc/modprobe.d/目录下新增.conf配置文件,并在配置文件中增加以下内容:

options vfio_iommu_type1 allow_unsafe_interrupts=1

务必注意,启用该功能可能导致系统运行不稳定。

GPU直通注意事项

首先,Web GUI的NoVNC和SPICE控制台都不能显示直通GPU的显存内容。

如果要通过直通GPU或vGPU显示图形输出,必须将物理显示器连接到显卡,或者通过虚拟机内的远程桌面软件(如VNC或RDP)才可以。

如果只是把GPU当做硬件加速器使用,比如运行OpenCL或CUDA程序,则不受以上所说情况影响。

10.9.2主机设备直通

大部分PCI(e)直通就是把整个PCI(e)卡直通,例如GPU或网卡直通。

主机配置

硬件设备一旦设为直通,主机将不能再使用。具体有两种配置方法:

1.将设备IDs作为参数传递给vfio-pci模块

在/etc/modprobe.d/目录新增’.conf’配置文件,文件内容示例如下

options vfio-pci ids=1234:5678,4321:8765

其中1234:5678和4321:8765是厂商和设备IDs,具体可以执行以下命令查看获取

lcpci -nn

2.对主机屏蔽驱动以确保可供直通使用

/etc/modprobe.d/目录新增.conf配置文件,文件内容示例如下

blacklist DRIVERNAME

两种方法都需要更新initramfs并重启系统确保配置生效,具体参见10.9.1节。

确认配置

为了确认上面的配置生效,你可以在重启之后,执行下面命令

    lspci -nnk

在输出的结果中,找到设备信息,如果有下面字段:

Kernel driver in use: vfio-pci

或者没有上面in use,也说明设备可以用于直通。

虚拟机配置

完成设备直通,还需要为虚拟机设置hostpciX参数,示例如下:

#qm set VMID -hostpci0 00:02.0

如果设备有多个功能(例如,00:02.000:02.1),可以用00:02即可将其一并直通。

另外,根据设备类型和客户机操作系统的不同,可能还需要设置一些附加参数:

  • x-vga=on|off

    用于将PCI(e)设备标记为客户机的主GPU。启用该参数后,虚拟机的vga配置将被忽略。注意,某些设备不支持x-vga参数,则需要off。

  • pcie=on|off

    通知Proxmox VE启用PCIe或PCI端口。某些客户机/设备组合需要启用PCIe,而不是PCI。而PCIe仅在某些q35类型的机器上可用。

  • rombar=on|off

    用于设置ROM是否对客户机可见。默认为可见。某些PCI(e)设备需要设为对客户机不可见。

  • Romfile=

    用于设置设备ROM文件路径,为可选参数。该路径是相对于/usr/share/kvm/的相对路径。

示例

下面的例子通过PCIe直通主GPU设备:

    qm set VMID -hostpci0 02:00,pcie=on,x-vga=on

其他注意事项

为获得更好的兼容性,在直通GPU设备时,最好选择q35芯片组,并选择使用OVMF(针对虚拟机的EFI)代替SeaBIOS,选择PCIe代替PCI。注意,在使用OVMF时,同时需要准备好EFI ROM,否则还得使用SeaBIOS。

10.9.3 SR-IOV

另一种PCI(e)直通方法是利用设备自带的硬件虚拟化功能。当然,这需要硬件设备本身具备相应功能。

SR-IOV(Single-Root Input/Output Virtualization)技术可以支持硬件同时提供多个VF(Virtual Function)供系统使用。每个VF都可以用于不同虚拟机,不仅可以提供硬件的全部功能,而且比软件虚拟化设备性能更好,延迟更低。

目前,最常见的支持SR-IOV的设备是网卡(Network Interface Card)。能将单一物理端口虚拟化为多个VF,同时允许虚拟机调用校验卸载等等硬件特性,从而降低主机CPU负载。

主机配置

有两种方法可以启用硬件设备虚拟化功能VF。

1.设置启用驱动程序中的相应参数

例如Intel驱动中的

max_vfs=4

该参数可以配置在/etc/modprobe.d/目录下的.conf配置文件中。(修改配置后不要忘记更新initramfs文件)

参数的具体信息和设置方法可以查看驱动程序文档。

2.通过sysfs设置启用

如果设备硬件和驱动程序支持,可以在线调整VF数量。例如,可以通过以下命令在设备0000:01:00.0上启用4个VF:

#echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs

如果需要将该配置永久生效,可以安装‘sysfsutils’软件包,并在/etc/sysfs.conf中配置相关参数,或在/etc/sysfs.d/目录下专门创建.conf配置文件也可以。

虚拟机配置

创建VF后,可以运行lspci命令查看相应的PCI(e)设备信息,并根据相应设备ID进行直通配置,具体步骤可参考10.9.2 节普通PCI(e)设备直通配置。

其他注意事项

配置SR-IOV直通,硬件平台支持是尤为重要的。有可能首先要在BIOS/EFI中设置启用相关功能,或使用特定PCI(e)端口。如有疑问,还要咨询平台厂商或查看有关手册才可以。

10.9.4中介设备(vGPU,GVT-g)

中介设备(mediated device)也是一种实现硬件功能和性能复用的硬件虚拟化技术,多见于GPU虚拟化配置中,如Intel GVT-g和Nvidia vGPU。

利用该技术,一个物理硬件设备可以创建多个虚拟设备,效果类似于SR-IOV。主要区别在于,中介设备不产生新的PCI(e)设备,并且只适用于虚拟机。

主机配置

首先,硬件卡需要支持中介设备技术。可以从厂商获取驱动以及相关配置文档。

Intel的GVG-g驱动已经集成在Linux内核,并可以在第5、6、7代Intel Core CPU直接使用,在E3 v4、E3 v5和E3 v6版本的Xeon CPU上也可以直接使用。

在Intel显卡上启用该技术,首先要确保已经加载kvmgt内核模块(例如将其写进配置文件/etc/modules),并按3.10.4节内核命令行相关内容,添加如下参数:

I915.enable_gvt=1

然后还要按10.9.1节内容更新initramfs,并重启服务器主机。

虚拟机配置

配置直通中介设备,只需要设置虚拟机的hostpciX参数的mdev属性即可。

具体可以通过sysfs查看所支持的硬件设备。如下例,列出0000:00:02.0下所有的设备类型:

#ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types

每个条目都是一个目录,其中需要关注的重要文件有:

  • available_instances

用于记录当前可用的实例数量,每在虚拟机中使用一个mdev,该计数都会减1。

  • description

    包含该类设备的功能简短描述

  • create

    是一个功能点,用于创建该类设备。如果hostpciX的mdev属性被配置启用,Proxmox VE会自动调用该功能点。

下面是针对Intel GVT-g vGPU(Intel Skylake 6700k)的配置示例:

qm set VMID -hostpci0 00:02.0,mdev=i915-GVTg_V5_4

执行以上命令后,Proxmox VE会在虚拟机启动时自动创建该设备,并在虚拟机停止时自动删除清理。