本文参考:PVE开启硬件直通功能、PVE 7.3 优化和显卡直通、PVE开启硬件显卡直通功能、PVE设置显卡直通、proxmox PCI Passthrough
简介
其实网络上有很多不错的文章讲述了如何直通显卡,也有简单易用的脚本帮你直通(pvetools)。我也成功在pve上直通n卡给win10,但是在Debian12上,我一直没办法使用Nvidia-smi,后来在朋友的提醒下,成功的解决了此问题,所以写下这篇文章讲述我的解决方案。
注意事项
-
本文编写时 Proxmox-Pve版本 为 8.1.3 , PVE内核版本 为 6.5.11-4-pve
-
本文所使用显卡为 Nvidia Quadro T400 4G (TU117GLM)
-
请确保所使用的 硬件设备 支持 Intel VT-D 或者 AMD AMD-V ,并且在 BIOS 中已经启用。
-
本文编写时,测试虚拟机所使用的系统为 Debian12 bookworm ,内核版本为 6.1.0-17-amd64
-
本文编写时,使用n卡驱动安装方式为
apt install nvidia-driver
,开启源bookworm main non-free non-free-firmware contrib
参数
先前准备
开启IOMMU和硬件直通功能
- 编辑(
nano
、vi
)/etc/default/grub
,并修改GRUB_CMDLINE_LINUX_DEFAULT
那一行。
- Intel CPU
intel
# pcie_acs_override=downstream video=vesafb:off video=efifb:off
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"
- AMD CPU
AMD
# pcie_acs_override=downstream video=vesafb:off video=efifb:off
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"
intel_iommu
和amd_iommu=on
为 开启IOMMU
video=vesafb:off video=efifb:off
不加载 vesafb 是 veas设备 的 fb ,efifb 是指 uefi设备 的 fb ,在 PVE 7.3 之后版本用initcall_blacklist=sysfb_init
替代(来源于PVE 7.3 优化和显卡直通)
pcie_acs_override=downstream
是为了将 iommu groups拆分 ,方便直通一些板载的设备(来源于加强硬件直通的功能)
- 更新 GRUB
update-grub
执行更新
- 加载内核模块
编辑 /etc/modules
,新增一下内容
Linux
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
-
重启 PVE
-
验证是否成功 启用IOMMU
输入 dmesg | grep -e DMAR -e IOMMU
,并有以下类似内容
Linux
# 这是我的机器输出内容
[ 0.019611] ACPI: DMAR 0x000000003555A000 000088 (v02 INTEL EDK2 00000002 01000096)
[ 0.019640] ACPI: Reserving DMAR table memory at [mem 0x4225a000-0x4225a087]
[ 0.175656] DMAR: Host address width 39
[ 0.175657] DMAR: DRHD base: 0x000000far90000 flags: 0x0
[ 0.175661] DMAR: dmar0: reg_base_addr far90000 ver 4:0 cap 1c0000c40660462 ecap 29a00f0505e
[ 0.175664] DMAR: DRHD base: 0x000000far91000 flags: 0x1
[ 0.175668] DMAR: dmar1: reg_base_addr far91000 ver 5:0 cap d2008c40660462 ecap f050da
[ 0.175670] DMAR: RMRR base: 0x0000004c000000 end: 0x000000503fffff
[ 0.175673] DMAR-IR: IOAPIC id 2 under DRHD base 0xfed91000 IOMMU 1
[ 0.175674] DMAR-IR: HPET id 0 under DRHD base 0xfed91000
[ 0.175675] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.177198] DMAR-IR: Enabled IRQ remapping in x2apic mode
[ 0.592036] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[ 0.658565] DMAR: Intel-IOMMU force enabled due to platform opt in
[ 0.658570] DMAR: No ATSR found
[ 0.658571] DMAR: No SATC found
[ 0.658572] DMAR: IOMMU feature fl1gp_support inconsistent
[ 0.658573] DMAR: IOMMU feature pgsel_inv inconsistent
[ 0.658574] DMAR: IOMMU feature nwfs inconsistent
[ 0.658575] DMAR: IOMMU feature dit inconsistent
[ 0.658576] DMAR: IOMMU feature sc_support inconsistent
[ 0.658577] DMAR: IOMMU feature dev_iotlb_support inconsistent
[ 0.658578] DMAR: dmar0: Using Queued invalidation
[ 0.658581] DMAR: dmar1: Using Queued invalidation
[ 0.659172] DMAR: Intel(R) Virtualization Technology for Directed I/O
- 验证是否 启用IOMMU中断重映射
输入 dmesg | grep remapping
并输出 类似 以下内容即为成功。到目前为止可以 直通 除显卡外 的 PCI-E设备。
Linux
# intel
[ 0.175675] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.177198] DMAR-IR: Enabled IRQ remapping in x2apic mode
# amd
AMD-Vi: Interrupt remapping enabled
如果失败或者没有,可能没有 启用IOMMU中断重映射 ,会导致无法直通,请看第七点。
- 允许不安全IOMMU中断重映射(第六点成功时,这步跳过)
编辑 /etc/modprobe.d/iommu_unsafe_interrupts.conf
,添加以下内容。
Linux
options vfio_iommu_type1 allow_unsafe_interrupts=1
显卡直通
- 屏蔽驱动
编辑 /etc/modprobe.dpve-blacklist.conf
,添加以下内容
Linux
# 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)
编辑 /etc/modprobe.d/kvm.conf
Linux
options kvm ignore_msrs=1 report_ignored_msrs=0
ignore_msrs
忽略异常
report_ignored_msrs
是否报告异常
- 配置 VFIO ,主要用于 显示输出 和 音频输出 分开
- 查看显卡ID
输入 lspci -nn | grep VGA
,得到类似以下内容
Linux
00:02.0 VGA compatible controller [0300]: Intel Corporation Alder Lake-P Integrated Graphics Controller [8086:46d6] (rev 0c)
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10dg:1fa2] (rev a1)
- 获取 设备ID 和 音频ID ,注意我这 显卡编号 为
01:00.0
输入lspci -n -s 02:00
Linux
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
Linux
options vfio-pci ids=10dg:1fa22,10dg:10fd
- 更新内核
输入 update-initramfs -u
-
重启
-
检查
vfio-pci
是否应用成功
输入 lspci -nnk
并找到 显卡编号 那一行,如果得到类似以下结果,为成功
Linux
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10de:1fb2] (rev a1)
Subsystem: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10de:1489]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:10fa] (rev a1)
Subsystem: NVIDIA Corporation Device [10de:1489]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel
结果中有
Kernel driver in use: vfio-pci
即为成功
添加显卡到虚拟机
创建虚拟机
-
常规 选项卡请根据自己情况填写
-
操作系统 选项卡请根据自己情况填写
-
系统 选项卡
-
显卡 选择
标准VGA
、SPICE
、VirtlO-GPU
、VirGL GPU
任选其一即可 -
机型 选择
q35
-
Qemu代理 选择 开启(一般会安装的,类似 ESXI agent,用于与 虚拟机通信 获取 虚拟机信息)
-
BIOS 选择
OVMF(UEFI)
,并选择EFI存储
-
磁盘 选项卡请根据自己情况填写
-
CPU 选项卡
-
类别 推荐选择
host
-
其他请根据自己情况填写
- 内存 选项卡
- 推荐关闭
Ballooning设备
,因为 硬件直通 的 虚拟机 需要保证内存不是共享的。
-
网络 选项卡请根据自己情况填写
-
确认
添加显卡到虚拟机
-
选择 虚拟机 , 并点击 硬件
-
点击 添加 , 然后点击 PCI设备
-
选择
原始设备
,在 设备 中选择需要直通的显卡 -
启用 所有功能 、 主GPU 、 ROM-Bar 、 PCI-Express
其中 主GPU 可以不用选择,此选项影响 显卡 为 默认参数(会导致无法启动终端)
所有功能 、ROM-Bar 、 PCI-Express 经测试不影响nvidia-smi
命令
- 点击添加
关闭安全启动(Linux专属)
终于来到了其他教程没有的部分
如果你的 安装Linux 后,装完驱动发现无法使用 nvidia-smi
命令,并提示以下内容
Linux
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.
还发现 systemd-modules-load 、 nvidia-persistenced.service 无法启动,systemctl status systemd-modules-load.service
和 journalctl -xeu nvidia-persistenced.service
,提示有以下内容
Linux
# systemd-modules-load.service
modprobe: ERROR: could not insert 'nvidia': Invalid argument
modprobe: ERROR: could not insert 'nvidia_current_drm': Key was rejected by service
modprobe: ERROR: ../libkmod/libkmod-module.c:1047 command_do() Error running install command 'modprobe nvidia ; modprobe -i nvidia-current-modeset ' for module nvidia_modeset: retcode 1
modprobe: ERROR: could not insert 'nvidia_modeset': Invalid argument
modprobe: ERROR: could not insert 'nvidia_current_drm': Key was rejected by service
Error running install command 'modprobe nvidia-modeset ; modprobe -i nvidia-current-drm ' for module nvidia_drm: retcode 1
Failed to insert module 'nvidia_drm': Invalid argument
# nvidia-persistenced.service
Started (737)
Failed to query NVIDIA devices. Please ensure that the NVIDIA device files (/dev/nvidia*) exist, and that user 101 has read and write permissions for those files.
Shutdown (737)
nvidia-persistenced failed to initialize. Check syslog for more details.
nvidia-persistenced.service: Control process exited, code=exited, status=1/FAILURE
这时候,你可以试试关闭虚拟机的安全启动,原因是因为 驱动签名验证 无法通过,我在使用 nvidia官方驱动 安装时候发现的 ,它提示
Linux
The target kernel has CONFIG_MODULE_SIG set, which means that it supports cryptographic signatures on kernel
modules. On some systems, the kernel may refuse to load modules without a valid signature from a trusted key. This
system also has UEFI Secure Boot enabled; many distributions enforce module signature verification on UEFI systems
when Secure Boot is enabled. Would you like to sign the NVIDIA kernel module?
关闭安全启动 步骤如下
-
启动虚拟机,并快速反复按 F2 按钮 进入BIOS
-
用 上下键 将 光条 移动到 Device Manager ,按 回车键 选择
-
选择 Secure Boot Configuration
-
将 光条 移动到 Attempt Secure Boot 一行 , 按 空格键 取消
×
(取消选中),可能会有提示,按 空格键 即可继续 -
按 F10 保存,提示输入
Y
保存,输入N
或者ESC
键 取消,这里输入Y
-
按 ESC键 退回到一开始界面
-
将 光条 移动到 Continue 一行,按 回车键 继续
-
提示按 回车键 继续
-
输入
nvidia-smi
命令查看是否成功
结尾
以上就是 PVE硬件直通 教程。有其他特殊问题的,可以看看官方的这篇文章proxmox PCI Passthrough