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)
编辑文件
将 设备ID(10dg: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)
其余设置均可按照自己喜好设置。
随后编辑虚拟机的设置:
- 选择 虚拟机 , 并点击 硬件
- 点击 添加 , 然后点击 PCI设备
- 选择
原始设备,在 设备 中选择需要直通的显卡 - 启用 所有功能 、 主GPU 、 ROM-Bar 、 PCI-Express
- 添加
至此,显卡的直通操作就完成了。你可以打开虚拟机并安装驱动使用显卡了。
参考文档
https://www.cnblogs.com/MAENESA/p/18005241 —— 本文总体思路参考
PCI Passthrough - Proxmox VE —— PVE 官方的显卡直通文档
Comments NOTHING