为 NVIDIA 卡配置 GPU 直通
B.1 简介 #
本文介绍如何将主机计算机上的 NVIDIA GPU 显卡分配给虚拟化 Guest。
B.2 先决条件 #
只有 AMD64/Intel 64 体系结构支持 GPU 直通。
主机操作系统需是 SLES 12 SP3 或更高版本。
本文的内容涉及一组基于 V100/T1000 NVIDIA 卡的指令,仅与 GPU 计算相关。
请校验您使用的是否为 NVIDIA Tesla 产品 — Maxwell、Pascal 或 Volta。
要管理主机系统,您需要在主机上额外安装一块显卡,以便可以在配置 GPU 直通或 SSH 功能环境时使用它。
B.3 配置主机 #
B.3.1 校验主机环境 #
校验主机操作系统是否为 SLES 12 SP3 或更高版本:
>
cat /etc/issue Welcome to SUSE Linux Enterprise Server 15 (x86_64) - Kernel \r (\l).校验主机是否支持 VT-d 技术,并且已在固件设置中启用该技术:
>
dmesg | grep -e "Directed I/O" [ 12.819760] DMAR: Intel(R) Virtualization Technology for Directed I/O如果未在固件中启用 VT-d,请启用它并重引导主机。
校验主机是否有额外的 GPU 或 VGA 卡:
>
lspci | grep -i "vga" 07:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. \ MGA G200e [Pilot] ServerEngines (SEP1) (rev 05)对于 Tesla V100 卡:
>
lspci | grep -i nvidia 03:00.0 3D controller: NVIDIA Corporation GV100 [Tesla V100 PCIe] (rev a1)对于 T1000 Mobile(可在 Dell 5540 上使用):
>
lspci | grep -i nvidia 01:00.0 3D controller: NVIDIA Corporation TU117GLM [Quadro T1000 Mobile] (rev a1)
默认已禁用 IOMMU。您需要在系统引导时于 /etc/default/grub
配置文件中启用它。
对于基于 Intel 的主机:
GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt rd.driver.pre=vfio-pci"
对于基于 AMD 的主机:
GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on rd.driver.pre=vfio-pci"
保存修改后的
/etc/default/grub
文件时,请重新生成主 GRUB 2 配置文件/boot/grub2/grub.cfg
:>
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg重引导主机并校验是否已启用 IOMMU:
>
dmesg | grep -e DMAR -e IOMMU
B.3.3 将 Nouveau 驱动程序加入黑名单 #
要将 NVIDIA 卡分配给 VM Guest,我们需要防止主机操作系统加载 NVIDIA GPU 的内置 nouveau
驱动程序。创建包含以下内容的 /etc/modprobe.d/60-blacklist-nouveau.conf
文件:
blacklist nouveau
查找卡供应商和型号 ID。使用第 B.3.1 节 “校验主机环境”中列出的总线编号(例如
03:00.0
)进行查找:>
lspci -nn | grep 03:00.0 03:00.0 3D controller [0302]: NVIDIA Corporation GV100 [Tesla V100 PCIe] [10de:1db4] (rev a1)创建包含以下内容的
/etc/modprobe.d/vfio.conf
文件:options vfio-pci ids=10de:1db4
注意校验您的卡是否不需要额外的
ids=
参数。对于某些卡,还必须指定音频设备,因此还必须将该设备的 ID 添加到列表中,否则无法使用该卡。
可通过三种方式加载 VFIO 驱动程序。
B.3.5.1 在 initrd 文件中包含该驱动程序 #
创建
/etc/dracut.conf.d/gpu-passthrough.conf
文件并在其中添加以下内容(请注意前导空格):add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd"
重新生成 initrd 文件:
>
sudo
dracut --force /boot/initrd $(uname -r)
B.3.5.2 将该驱动程序添加到自动加载的模块的列表 #
创建 /etc/modules-load.d/vfio-pci.conf
文件并在其中添加以下内容:
vfio vfio_iommu_type1 vfio_pci kvm kvm_intel
B.3.5.3 手动加载该驱动程序 #
要在运行时手动加载该驱动程序,请执行以下命令:
>
sudo
modprobe vfio-pci
B.3.6 为 Microsoft Windows Guest 禁用 MSR #
对于 Microsoft Windows Guest,我们建议禁用 MSR(特定于模型的寄存器),以避免 Guest 崩溃。创建 /etc/modprobe.d/kvm.conf
文件并在其中添加以下内容:
options kvm ignore_msrs=1
B.3.7 安装 UEFI 固件 #
主机需使用 UEFI 固件进行引导(即,不使用旧式 BIOS 引导序列)才能使 GPU 直通功能正常工作。安装 qemu-ovmf 软件包(如果尚未安装):
>
sudo
zypper install qemu-ovmf
B.3.8 重引导主机计算机 #
要使上述步骤中的大部分更改生效,需要重引导主机计算机:
>
sudo
shutdown -r now
B.4 配置 Guest #
本节介绍如何配置 Guest 虚拟机,以使其能够使用主机的 NVIDIA GPU。使用虚拟机管理器或 virt-install
安装 Guest VM。有关详细信息,请参见第 10 章 “Guest 安装”。
B.4.1 Guest 配置要求 #
在安装 Guest VM 期间,选择
并配置以下设备:如果可能,请使用 Q35 芯片组。
使用 UEFI 固件安装 Guest VM。
添加以下模拟设备:
图形:Spice 或 VNC
设备:qxl、VGA 或 Virtio
有关详细信息,请参见 第 14.6 节 “视频”。
将主机 PCI 设备(在本示例中为
03:00.0
)添加到 Guest。有关详细信息,请参见 第 14.12 节 “将主机 PCI 设备分配到 VM Guest”。为获得最佳性能,我们建议对网卡和存储设备使用 virtio 驱动程序。
B.4.2 安装显卡驱动程序 #
B.4.2.1 Linux Guest #
从 https://www.nvidia.com/download/driverResults.aspx/131159/en-us 下载驱动程序 RPM 软件包。
安装下载的 RPM 软件包:
>
sudo
rpm -i nvidia-diag-driver-local-repo-sles123-390.30-1.0-1.x86_64.rpm刷新储存库并安装 cuda-drivers.对于非 SUSE 发行套件,此步骤有所不同:
>
sudo
zypper refresh && zypper install cuda-drivers重引导 Guest VM:
>
sudo
shutdown -r now
由于安装程序需要编译 NVIDIA 驱动程序模块,因此请安装 gcc-c++ 和 kernel-devel 软件包。
在 Guest 上禁用安全引导,因为 NVIDIA 的驱动程序模块未签名。在 SUSE 发行套件上,可以使用 YaST GRUB 2 模块来禁用安全引导。有关详细信息,请参见 第 17.1.1 节 “在 SUSE Linux Enterprise Server 上实施”。
从 https://www.nvidia.com/Download/index.aspx?lang=en-us 下载驱动程序安装脚本,将此脚本转换为可执行文件,然后运行此可执行文件以完成驱动程序安装:
>
chmod +x NVIDIA-Linux-x86_64-460.73.01.run>
sudo
./NVIDIA-Linux-x86_64-460.73.01.run从 https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=SLES&target_version=15&target_type=rpmlocal 下载 CUDA 驱动程序,并按照屏幕上的说明进行安装。
安装 NVIDIA 驱动程序后,虚拟机管理器显示器将与 Guest 操作系统断开连接。要访问 Guest VM,您必须通过 ssh
登录,然后切换到控制台界面,或者在 Guest 中安装专用 VNC 服务器。为避免屏幕闪烁,请停止并禁用显示器管理器:
>
sudo
systemctl stop display-manager && systemctl disable display-manager
将目录切换到 CUDA 示例模板:
>
cd /usr/local/cuda-9.1/samples/0_Simple/simpleTemplates编译并运行
simpleTemplates
文件:>
make && ./simpleTemplates runTest<float,32> GPU Device 0: "Tesla V100-PCIE-16GB" with compute capability 7.0 CUDA device [Tesla V100-PCIE-16GB] has 80 Multi-Processors Processing time: 495.006000 (ms) Compare OK runTest<int,64> GPU Device 0: "Tesla V100-PCIE-16GB" with compute capability 7.0 CUDA device [Tesla V100-PCIE-16GB] has 80 Multi-Processors Processing time: 0.203000 (ms) Compare OK [simpleTemplates] -> Test Results: 0 Failures
B.4.2.2 Microsoft Windows Guest #
在安装 NVIDIA 驱动程序之前,需要使用 Guest libvirt
定义中的 <hidden
state='on'/>
指令对驱动程序隐藏超级管理程序,例如:
<features> <acpi/> <apic/> <kvm> <hidden state='on'/> </kvm> </features>
从 https://www.nvidia.com/Download/index.aspx 下载并安装 NVIDIA 驱动程序。
从 https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64 下载并安装 CUDA 工具包。
在 Guest 上的
Program Files\Nvidia GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite
目录中可以找到多个 NVIDIA 演示示例。