跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 为 NVIDIA 卡配置 GPU 直通
适用范围 SUSE Linux Enterprise Server 15 SP4

为 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 校验主机环境

  1. 校验主机操作系统是否为 SLES 12 SP3 或更高版本:

    > cat /etc/issue
    Welcome to SUSE Linux Enterprise Server 15  (x86_64) - Kernel \r (\l).
  2. 校验主机是否支持 VT-d 技术,并且已在固件设置中启用该技术:

    > dmesg | grep -e "Directed I/O"
    [   12.819760] DMAR: Intel(R) Virtualization Technology for Directed I/O

    如果未在固件中启用 VT-d,请启用它并重引导主机。

  3. 校验主机是否有额外的 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)

B.3.2 启用 IOMMU

默认已禁用 IOMMU。您需要在系统引导时于 /etc/default/grub 配置文件中启用它。

  1. 对于基于 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"
  2. 保存修改后的 /etc/default/grub 文件时,请重新生成主 GRUB 2 配置文件 /boot/grub2/grub.cfg

    > sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  3. 重引导主机并校验是否已启用 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

B.3.4 配置 VFIO 并隔离用于直通的 GPU

  1. 查找卡供应商和型号 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)
  2. 创建包含以下内容的 /etc/modprobe.d/vfio.conf 文件:

    options vfio-pci ids=10de:1db4
    注意
    注意

    校验您的卡是否不需要额外的 ids= 参数。对于某些卡,还必须指定音频设备,因此还必须将该设备的 ID 添加到列表中,否则便无法使用该卡。

B.3.5 装载 VFIO 驱动程序

可通过三种方式装载 VFIO 驱动程序。

B.3.5.1 在 initrd 文件中包含该驱动程序

  1. 创建 /etc/dracut.conf.d/gpu-passthrough.conf 文件并在其中添加以下内容(请注意前导空格):

    add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd"
  2. 重新生成 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 直通功能正常工作。

  1. 安装 qemu-ovmf 软件包,其中包含 UEFI 固件映像:

    > sudo zypper install qemu-ovmf
  2. 通过过滤以下命令的结果获取 OVMF binvars 文件的列表:

    > rpm -ql qemu-ovmf
  3. 使用在上一步中获取的列表,在 /etc/libvirt/qemu.conf 文件中的 libvirt QEMU 配置内启用 OVMF。命令应如下所示:

    nvram = [
    "/usr/share/qemu/ovmf-x86_64-4m.bin:/usr/share/qemu/ovmf-x86_64-4m-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-4m-code.bin:/usr/share/qemu/ovmf-x86_64-4m-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-smm-ms-code.bin:/usr/share/qemu/ovmf-x86_64-smm-ms-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-smm-opensuse-code.bin:/usr/share/qemu/ovmf-x86_64-smm-opensuse-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-ms-4m-code.bin:/usr/share/qemu/ovmf-x86_64-ms-4m-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-smm-suse-code.bin:/usr/share/qemu/ovmf-x86_64-smm-suse-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-ms-code.bin:/usr/share/qemu/ovmf-x86_64-ms-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-smm-code.bin:/usr/share/qemu/ovmf-x86_64-smm-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-opensuse-4m-code.bin:/usr/share/qemu/ovmf-x86_64-opensuse-4m-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-suse-4m-code.bin:/usr/share/qemu/ovmf-x86_64-suse-4m-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-suse-code.bin:/usr/share/qemu/ovmf-x86_64-suse-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-opensuse-code.bin:/usr/share/qemu/ovmf-x86_64-opensuse-vars.bin",
    "/usr/share/qemu/ovmf-x86_64-code.bin:/usr/share/qemu/ovmf-x86_64-vars.bin",
    ]

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

过程 B.1︰ 基于 RPM 的发行套件
  1. http://www.nvidia.com/download/driverResults.aspx/131159/en-us 下载驱动程序 RPM 软件包。

  2. 安装下载的 RPM 软件包:

    > sudo rpm -i nvidia-diag-driver-local-repo-sles123-390.30-1.0-1.x86_64.rpm
  3. 刷新软件源并安装 cuda-drivers.对于非 SUSE 发行套件,此步骤有所不同:

    > sudo zypper refresh && zypper install cuda-drivers
  4. 重引导 Guest VM:

    > sudo shutdown -r now
过程 B.2︰ 通用安装程序
  1. 由于安装程序需要编译 NVIDIA 驱动程序模块,因此请安装 gcc-c++kernel-devel 软件包。

  2. 在 Guest 上禁用安全引导,因为 NVIDIA 的驱动程序模块未签名。在 SUSE 发行套件上,可以使用 YaST GRUB 2 模块来禁用安全引导。有关详细信息,请参见 第 17.1.1 节 “在 SUSE Linux Enterprise Server 上实施”

  3. 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
  4. 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
过程 B.3︰ 测试 Linux 驱动程序安装
  1. 将目录切换到 CUDA 示例模板:

    > cd /usr/local/cuda-9.1/samples/0_Simple/simpleTemplates
  2. 编译并运行 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>
  1. https://www.nvidia.com/Download/index.aspx 下载并安装 NVIDIA 驱动程序。

  2. https://developer.nvidia.com/cuda-downloads?target_os=Windows&target_arch=x86_64 下载并安装 CUDA 工具包。

  3. 在 Guest 上的 Program Files\Nvidia GPU Computing Toolkit\CUDA\v10.2\extras\demo_suite 目录中可以找到一些 NVIDIA 演示示例。