设备透传
本章介绍虚拟机设备透传相关的原理和操作,包括常用的 GPU 、USB 等设备的透传。
我们可以将宿主机上的设备透传到虚拟机内,允许虚拟机直接访问宿主机的硬件设备,主要有以下几种使用场景:
PCI/PCIe 设备 透传
将宿主机的PCI/PCIe设备透传到虚拟机,需要预先对宿主机进行如下的配置:
-
Intel VT-d 或 AMD IOMMU 已在系统的 BIOS 中启用。具体请参阅机器的 BIOS 配置菜单,或其它相关信息。
-
修改grub的内核启动参数,使得Intel VT-d 或 AMD IOMMU 已在操作系统中启用:
如果是Intel CPU,则需要在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 添加如下grub参数:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1"
如果是AMD CPU,amd_iommu=on已经默认设置,因此对应 grub 命令行参数为:
GRUB_CMDLINE_LINUX="iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1"
- 更新生成 grub 引导配置文件
在/etc/default/grub设置 GRUB_CMDLINE_LINUX 之后,需要运行 grub2-mkconfig 更新grub的配置文件。
如果系统是BIOS启动,使用如下命令:
$ grub2-mkconfig -o /boot/grub2/grub.cfg
如果是UEFI启动,使用如下命令(假设是CentOS):
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
- 将vfio内核模块设置为自动加载
宿主机PCI/PCIe设备透传原理为:该设备被vfio-pci驱动接管,从而允许设备被用 户态应用程序(即QEMU)直接访问使用。
因此,为了启用PCI/PCIe设备透传,需要启用内核的vfio相关内核模块,并且需要透传的设备需要被 vfio-pci 内核模块接管。
启用vfio内核模块的方法为:修改 /etc/modules-load.d/vfio.conf,加入如下内核模块,将vfio相关内核模块设置为开机自动加载。
$ cat /etc/modules-load.d/vfio.conf
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
备注:内核6.2及以后版本,vfio_virqfd 合并入 vfio 模块,不再有 vfio_virqfd。
host服务会负责设置待透传设备的 vfio-pci 接管。
- 启用大页内存(可选)
建议启用宿主机大页内存(hugepage),具体参见内存大页(Hugepage)。
注:从3.10开始,新部署的x86计算节点会自动开启大页。
- 重启宿主机生效
如果做了2-4步骤的修改,需要重启宿主机使得配置生效。
重启后,查看 /proc/cmdline 确认内核命令行参数配置生效。
执行 lsmod 确认 相关内核模块 被正确加载。
以上为任意PCI/PCIe设备通常的设置,针对不同类型的PCI/PCIe设备和不同的设备透传场景,还有各自不同的设置和使用方法,具体介绍如下:
GPU透传
参见:GPU透传
SR-IOV网卡透传
参见: 网卡SR-IOV卸载
NVME透传
TODO (NVME透传以及设置基于NVME的存储防范)