Atlantis
GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

5.3 显卡直通

1. 前言

显卡直通似乎是 PVE 上必过的一道门槛,显卡直通又分为独显直通与核显直通,不过核显直通往往还需要提取 ROM、BIOS,过于繁琐,这里只讨论更简单的独显直通。

笔者的测试平台是 i5-13400 + RTX 3060 Laptop 与 E5-2673 V3 + R5 240,分别在 PVE 的 7 和 8 上测试通过。

显卡直通的关键步骤有几个:

  1. 配置 BIOS,使用 UEFI 模式启动宿主机,这一步需要在安装系统执行,同时 BIOS 中开启 VT-d/IOMMU
  2. 配置 grub 中的启动参数,开启 iommu、pcie 直通并配置 video 参数
  3. 屏蔽显卡驱动并加载 vfio_pci 驱动

操作成功后如果看到显卡驱动已经切换为 vfio_pci,就可以在控制台上选择显卡所属的 pci 设备分配给虚拟机了。

PVE 的官方文档也有关于显卡直通的说明:https://pve.proxmox.com/wiki/PCI_Passthrough

2. 操作步骤

以下的操作都在宿主机上执行。

2.1 配置BIOS

宿主机系统必须以 UEFI 模式启动,如果当前使用的是非 UEFI 模式,需要重装系统。

如果已经系统是 UEFI 优先模式的,建议再关闭 Legacy bootCSM,确保显卡设备以 UEFI 模式启动。

对于 Intel 平台,开启 VT-d 后就启用了 IOMMU,AMD 平台未测试,支持 IOMMU 的 CPU 会有类似选项。

2.2 配置grub

修改 /etc/default/grub 的 GRUB_CMDLINE_LINUX_DEFAULT,如下:

➜  ~ cat /etc/default/grub
...
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=vesafb:off,efifb:off,simplefb:off"
...

添加 intel_iommu=on iommu=pt video=vesafb:off,efifb:off,simplefb:off

修改完成后更新 grub

update-grub
pve-efiboot-tool refresh

2.3 配置内核模块

屏蔽显卡驱动并配置kvm参数,如下:

新建文件 /etc/modprobe.d/blacklist.conf,屏蔽 Nvidia 和 AMD 的显卡驱动,对于 Intel 独立显卡需要屏蔽 i915 驱动

# Nvidia
blacklist nvidiafb
blacklist nouveau
blacklist nvidia
options nouveau modeset=0

# AMD
blacklist amdgpu
blacklist radeon

# Intel
#blacklist i915
#blacklist snd_hda_intel
#blacklist snd_hda_codec_hdmi

再创建文件 /etc/modprobe.d/kvm.conf ,配置 kvm 参数

options kvm ignore_msrs=1 report_ignored_msrs=0

然后在 /etc/modules 中添加 vfio 相关驱动

➜  ~ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

最后重新生成 initramfs,重启机器

update-initramfs -u -k all
reboot

重启完成后,查看 dmesg 日志:

检查 IOMMU 是否已启用,若存在 DMAR: IOMMU enabled 表示正常启用:

➜  ~ dmesg | grep -e DMAR -e IOMMU
[    0.009485] ACPI: DMAR 0x0000000065248000 000088 (v02 INTEL  EDK2     00000002      01000013)
[    0.009539] ACPI: Reserving DMAR table memory at [mem 0x65248000-0x65248087]
[    0.051304] DMAR: IOMMU enabled
[    0.128825] DMAR: Host address width 39
[    0.128826] DMAR: DRHD base: 0x000000fed90000 flags: 0x0
[    0.128831] DMAR: dmar0: reg_base_addr fed90000 ver 4:0 cap 1c0000c40660462 ecap 29a00f0505e
[    0.128834] DMAR: DRHD base: 0x000000fed91000 flags: 0x1
[    0.128838] DMAR: dmar1: reg_base_addr fed91000 ver 5:0 cap d2008c40660462 ecap f050da
[    0.128840] DMAR: RMRR base: 0x0000006c000000 end: 0x000000707fffff
[    0.128843] DMAR-IR: IOAPIC id 2 under DRHD base  0xfed91000 IOMMU 1
[    0.128844] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[    0.128845] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.129834] DMAR-IR: Enabled IRQ remapping in x2apic mode
[    0.427017] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[    0.488763] DMAR: No ATSR found
[    0.488764] DMAR: No SATC found
[    0.488765] DMAR: IOMMU feature fl1gp_support inconsistent
[    0.488766] DMAR: IOMMU feature pgsel_inv inconsistent
[    0.488766] DMAR: IOMMU feature nwfs inconsistent
[    0.488767] DMAR: IOMMU feature dit inconsistent
[    0.488768] DMAR: IOMMU feature sc_support inconsistent
[    0.488768] DMAR: IOMMU feature dev_iotlb_support inconsistent
[    0.488769] DMAR: dmar0: Using Queued invalidation
[    0.488772] DMAR: dmar1: Using Queued invalidation
[    0.489423] DMAR: Intel(R) Virtualization Technology for Directed I/O
[    4.752616] pci 0000:00:02.1: DMAR: Skip IOMMU disabling for graphics
[    4.757334] pci 0000:00:02.2: DMAR: Skip IOMMU disabling for graphics
[    4.759636] pci 0000:00:02.3: DMAR: Skip IOMMU disabling for graphics

检查 IOMMU 中断重映射是否生效,若存在 Enabled IRQ remapping 表示正常启用。

➜  ~ dmesg | grep 'remapping'
[    0.128845] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[    0.129834] DMAR-IR: Enabled IRQ remapping in x2apic mode

检查IOMMU隔离是否生效:

➜  ~ pvesh get /nodes/pve/hardware/pci --pci-class-blacklist ""
┌──────────┬────────┬──────────────┬────────────┬────────┬────────────────────────────────────────────┬──────┬──────────────────┬───────────────────────┬──────────────────┬───────────────────────┬────────────────────┐
│ class    │ device │ id           │ iommugroup │ vendor │ device_name                                │ mdev │ subsystem_device │ subsystem_device_name │ subsystem_vendor │ subsystem_vendor_name │ vendor_name        │
╞══════════╪════════╪══════════════╪════════════╪════════╪════════════════════════════════════════════╪══════╪══════════════════╪═══════════════════════╪══════════════════╪═══════════════════════╪════════════════════╡
│ 0x010601 │ 0x7ae2 │ 0000:00:17.0 │          6 │ 0x8086 │                                            │      │ 0x7ae2           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x010802 │ 0x0009 │ 0000:02:00.0 │         11 │ 0x1e0f │ NVMe SSD                                   │      │ 0x0033           │                       │ 0x1e0f           │ KIOXIA Corporation    │ KIOXIA Corporation │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x020000 │ 0x1a1d │ 0000:00:1f.6 │          9 │ 0x8086 │ Ethernet Connection (17) I219-V            │      │ 0x1a1d           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x028000 │ 0x24fb │ 0000:03:00.0 │         12 │ 0x8086 │ Dual Band Wireless-AC 3168NGW [Stone Peak] │      │ 0x2110           │                       │ 0x8086           │ Intel Corporation     │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x030000 │ 0xa782 │ 0000:00:02.0 │          0 │ 0x8086 │                                            │      │ 0xa782           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x030000 │ 0xa782 │ 0000:00:02.1 │         13 │ 0x8086 │                                            │      │ 0xa782           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x030000 │ 0xa782 │ 0000:00:02.2 │         14 │ 0x8086 │                                            │      │ 0xa782           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x030000 │ 0xa782 │ 0000:00:02.3 │         15 │ 0x8086 │                                            │      │ 0xa782           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x030000 │ 0x2520 │ 0000:01:00.0 │         10 │ 0x10de │ GA106M [GeForce RTX 3060 Mobile / Max-Q]   │      │ 0x0000           │                       │ 0x10de           │ NVIDIA Corporation    │ NVIDIA Corporation │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x040300 │ 0x7ad0 │ 0000:00:1f.3 │          9 │ 0x8086 │                                            │      │ 0x3897           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x040300 │ 0x228e │ 0000:01:00.1 │         10 │ 0x10de │                                            │      │ 0x0000           │                       │ 0x10de           │ NVIDIA Corporation    │ NVIDIA Corporation │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x050000 │ 0x7aa7 │ 0000:00:14.2 │          3 │ 0x8086 │                                            │      │ 0x0000           │                       │ 0x0000           │                       │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x060000 │ 0xa705 │ 0000:00:00.0 │          1 │ 0x8086 │                                            │      │ 0xa705           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x060100 │ 0x7a87 │ 0000:00:1f.0 │          9 │ 0x8086 │                                            │      │ 0x7a87           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x060400 │ 0xa70d │ 0000:00:01.0 │          2 │ 0x8086 │                                            │      │ 0xa70d           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x060400 │ 0x7ab8 │ 0000:00:1c.0 │          7 │ 0x8086 │                                            │      │ 0x7ab8           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x060400 │ 0x7abf │ 0000:00:1c.7 │          8 │ 0x8086 │                                            │      │ 0x7abf           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x078000 │ 0x7ae8 │ 0000:00:16.0 │          5 │ 0x8086 │                                            │      │ 0x7ae8           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x0c0330 │ 0x7ae0 │ 0000:00:14.0 │          3 │ 0x8086 │                                            │      │ 0x7ae0           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x0c0500 │ 0x7aa3 │ 0000:00:1f.4 │          9 │ 0x8086 │                                            │      │ 0x7aa3           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x0c8000 │ 0x7acc │ 0000:00:15.0 │          4 │ 0x8086 │                                            │      │ 0x7acc           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
├──────────┼────────┼──────────────┼────────────┼────────┼────────────────────────────────────────────┼──────┼──────────────────┼───────────────────────┼──────────────────┼───────────────────────┼────────────────────┤
│ 0x0c8000 │ 0x7aa4 │ 0000:00:1f.5 │          9 │ 0x8086 │                                            │      │ 0x7aa4           │                       │ 0x1849           │ ASRock Incorporation  │ Intel Corporation  │
└──────────┴────────┴──────────────┴────────────┴────────┴────────────────────────────────────────────┴──────┴──────────────────┴───────────────────────┴──────────────────┴───────────────────────┴────────────────────┘

最后检查 Nvidia 显卡是否加载了 vfio 驱动

➜  ~ lspci -knn|grep -A 2 NVIDIA
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] [10de:2520] (rev a1)
	Subsystem: NVIDIA Corporation Device [10de:0000]
	Kernel driver in use: vfio-pci
	Kernel modules: nvidiafb, nouveau
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:228e] (rev a1)
	Subsystem: NVIDIA Corporation Device [10de:0000]
	Kernel driver in use: vfio-pci
	Kernel modules: snd_hda_intel

至此完成宿主机上的全部配置。

3. 使用直通显卡

要启用显卡直通,虚拟机必须是 q35 机型,且使用纯 UEFI 系统系统。

创建虚拟机完成后,选择添加 PCI 设备,选中显卡对应的设备,我们不需要使用显卡输出视频,只作为视频、AI 加速卡使用,这里就不勾选主 GPU:

显示设备与音频设备从属于同一个 IOMMU 组,这里只需添加显示设备即可,无需添加音频设备