2025/11/29 文章修缮

内容更正:自 PVE9 开始,系统已默认开启了硬件直通。也就是说,如果您是 PVE 9.0 之后的用户,无需执行编辑 /etc/default/grub 文件的步骤。

前言

本文只讨论显卡的直通(Passthrough)操作,不包含核显虚拟化(SR-IOV)。

必要信息

  • 本文基于 PVE 8.4,测试后发现 PVE 9 也支持(9.0.10)额外信息见页首 2025/11/29 文章修缮章。
  • 请确保所使用的 硬件设备 支持 Intel VT-D 或者 AMD AMD-V ,并且在 BIOS 中已经启用
  • 本文默认您已拥有一定 Linux 系统操作基础。(指不是只会复制代码)

开启IOMMU

编辑文件

使用自己顺手的编辑工具(例如 nano)编辑 /etc/default/grub 文件。

修改 GRUB_CMDLINE_LINUX_DEFAULT 配置项:

AMD 平台修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"
Intel 平台修改为:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"

更新 GRUB

使用以下命令更新 GRUB:

proxmox-boot-tool refresh

加载对应内核模块

编辑 /etc/modules

添加如下字样:

vfio
vfio_iommu_type1
vfio_pci
# vfio_virqfd

如果您使用较新的 PVE 版本,可能会发现该文件内容如下:

# /etc/modules is obsolete and has been replaced by /etc/modules-load.d/.
# Please see modules-load.d(5) and modprobe.d(5) for details.
#
# Updating this file still works, but it is undocumented and unsupported.

意思是这个文件已被 /etc/modules-load.d/. 取代,修改这个文件仍然起作用,但它将不再在文档里出现,也不被官方支持。不过这并不对我们的直通有什么影响,所以继续下一步。

随后使用 reboot 重启 PVE。

检验设置

输入 dmesg | grep iommu,若设置正确,应当由类似如下的打印内容:

root@pve:~# dmesg | grep iommu
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.14.8-2-pve root=/dev/mapper/pve-root ro quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream
[    0.029753] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.14.8-2-pve root=/dev/mapper/pve-root ro quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream
[    0.265777] iommu: Default domain type: Passthrough (set via kernel command line)
[    0.294219] pci 0000:00:00.0: Adding to iommu group 0
[    0.294232] pci 0000:00:01.0: Adding to iommu group 1
[    0.294240] pci 0000:00:01.1: Adding to iommu group 2
[    0.294247] pci 0000:00:01.2: Adding to iommu group 3
[    0.294257] pci 0000:00:02.0: Adding to iommu group 4
[    0.294264] pci 0000:00:02.1: Adding to iommu group 5
[    0.294272] pci 0000:00:03.0: Adding to iommu group 6
[    0.294280] pci 0000:00:04.0: Adding to iommu group 7
[    0.294291] pci 0000:00:08.0: Adding to iommu group 8
[    0.294297] pci 0000:00:08.1: Adding to iommu group 9
[    0.294303] pci 0000:00:08.3: Adding to iommu group 10
[    0.294314] pci 0000:00:14.0: Adding to iommu group 11
[    0.294319] pci 0000:00:14.3: Adding to iommu group 11
[    0.294346] pci 0000:00:18.0: Adding to iommu group 12
[    0.294346] pci 0000:00:18.1: Adding to iommu group 12
[    0.294362] pci 0000:00:18.2: Adding to iommu group 12
[    0.294367] pci 0000:00:18.3: Adding to iommu group 12
[    0.294373] pci 0000:00:18.4: Adding to iommu group 12
[    0.294379] pci 0000:00:18.5: Adding to iommu group 12
[    0.294385] pci 0000:00:18.6: Adding to iommu group 12
[    0.294390] pci 0000:00:18.7: Adding to iommu group 12
[    0.294409] pci 0000:01:00.0: Adding to iommu group 13
[    0.294424] pci 0000:01:00.1: Adding to iommu group 13
[    0.294431] pci 0000:02:00.0: Adding to iommu group 14
[    0.294438] pci 0000:03:00.0: Adding to iommu group 15
[    0.294453] pci 0000:04:00.0: Adding to iommu group 16
[    0.294465] pci 0000:04:01.0: Adding to iommu group 17
[    0.294476] pci 0000:04:02.0: Adding to iommu group 18
[    0.294487] pci 0000:04:03.0: Adding to iommu group 19
[    0.294498] pci 0000:04:04.0: Adding to iommu group 20
[    0.294510] pci 0000:04:05.0: Adding to iommu group 21
[    0.294521] pci 0000:04:06.0: Adding to iommu group 22
[    0.294532] pci 0000:04:07.0: Adding to iommu group 23
[    0.294545] pci 0000:04:08.0: Adding to iommu group 24
[    0.294557] pci 0000:04:09.0: Adding to iommu group 25
[    0.294568] pci 0000:04:0a.0: Adding to iommu group 26
[    0.294578] pci 0000:04:0b.0: Adding to iommu group 27
[    0.294591] pci 0000:04:0c.0: Adding to iommu group 28
[    0.294603] pci 0000:04:0d.0: Adding to iommu group 29
[    0.294617] pci 0000:06:00.0: Adding to iommu group 30
[    0.294629] pci 0000:11:00.0: Adding to iommu group 31
[    0.294641] pci 0000:12:00.0: Adding to iommu group 32
[    0.294660] pci 0000:13:00.0: Adding to iommu group 33
[    0.294667] pci 0000:13:00.1: Adding to iommu group 34
[    0.294675] pci 0000:13:00.2: Adding to iommu group 35
[    0.294684] pci 0000:13:00.3: Adding to iommu group 36
[    0.294691] pci 0000:13:00.4: Adding to iommu group 37
[    0.294699] pci 0000:13:00.6: Adding to iommu group 38
[    0.294706] pci 0000:14:00.0: Adding to iommu group 39
[    2.213208] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).

直通显卡

屏蔽显卡驱动

编辑 /etc/modprobe.d/pve-blacklist.conf,按对应硬件添加对应内容:

# Nvidia
blacklist nvidiafb
blacklist nouveau
blacklist nvidia

# AMD
blacklist amdgpu
blacklist radeon

# Intel UHD
#blacklist snd_hda_codec_hdmi
#blacklist snd_hda_intel
#blacklist snd_hda_codec
#blacklist snd_hda_core

忽略显卡警告

Nvidia专属,主要在 Win 中遇到一些应用,列如 GeForce Experience 、Passmark Performance Test 和 SiSoftware Sandra

为什么这么做?

因为 Tips:"Some Windows applications like GeForce Experience, Passmark Performance Test and SiSoftware Sandra can crash the VM. You need to add"(大意:一些 Win 平台的应用,像是 GeForce Experience, Passmark Performance Test and SiSoftware Sandra 等软件可能会导致 VM 崩溃,所以你需要添加(以下信息)) —— PVE 官方 GPU Passthrough 文档

编辑 /etc/modprobe.d/kvm.conf,添加如下内容:

options kvm ignore_msrs=1 report_ignored_msrs=0

配置 VFIO

主要用于 显示输出 和 音频输出 分开。

确定显卡 ID

执行 lspci -nn | grep VGA,我这里信息如下:

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117 [GeForce GTX 1650] [10de:1f82] (rev a1)
13:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Granite Ridge [Radeon Graphics] [1002:13c0] (rev c6)

这里可以看到我的独显 ID 是 01:00(13:00.0 是 AMD 的核显)

获取 设备ID 和 音频ID

输入 lspci -n -s 01:00(我的是 01:00,您应当改为您的实际情况)

01:00.0 0300: 10dg:1fa2 (rev a1)
01:00.1 0403: 10dg:10fd (rev a1)

编辑文件

将 设备ID10dg:1fa2) 和 音频ID (10dg:10fd) 写入到 /etc/modprobe.d/vfio.conf

options vfio-pci ids=10dg:1fa2,10dg:10fd

更新内核

update-initramfs -u

随后使用 reboot 重启主机。

检验设置生效

使用以下命令:

lspci -nnk

找到显卡的位置,输出应当如下:

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117 [GeForce GTX 1650] [10de:1f82] (rev a1)
        Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:8d92]
        Kernel driver in use: vfio-pci
        Kernel modules: nvidiafb, nouveau
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)
        Subsystem: Micro-Star International Co., Ltd. [MSI] Device [1462:8d92]
        Kernel driver in use: vfio-pci
        Kernel modules: snd_hda_intel

(结果中有 Kernel driver in use: vfio-pci 即为成功)

创建虚拟机

与平常一样创建即可。但有以下几个设置需要修改:

  • 机型:q35
  • BIOS:OVMF(UEFI)

其余设置均可按照自己喜好设置。

随后编辑虚拟机的设置:

  1. 选择 虚拟机 , 并点击 硬件
  2. 点击 添加 , 然后点击 PCI设备
  3. 选择 原始设备 ,在 设备 中选择需要直通的显卡
  4. 启用 所有功能 、 主GPU 、 ROM-Bar 、 PCI-Express
  5. 添加

至此,显卡的直通操作就完成了。你可以打开虚拟机并安装驱动使用显卡了。

参考文档

https://www.cnblogs.com/MAENESA/p/18005241 —— 本文总体思路参考

PCI Passthrough - Proxmox VE —— PVE 官方的显卡直通文档

  • reward_image1
此作者没有提供个人介绍。
最后更新于 2025-12-13