博客链接:PVE 配置显卡直通

配置

  • Device: Dell PowerEdge T630
  • CPU: Intel(R) Xeon(R) E5-2696 v4 x2
  • GPU 1: Matrox Electronics Systems Ltd. G200eR2
  • GPU 2: NVIDIA GeForce GTX 1060 3GB
  • OS: Proxmox VE bookworm 8.3.1 x86_64

注意事项

  1. 硬件需支持并在 BIOS 中开启 Intel VT-D 或 AMD AMD-V
  2. BIOS 中开启 X2APIC 功能
  3. 进行任何硬件变更时请依据 手册 进行硬件配置
  4. 为了能够实时了解到 GPU 运行情况,建议连接显示器观察其响应,但如果出现主机无法识别/无法列出 PCIe 设备时请尝试拔掉显示器后重启
  5. 虚拟机存在直通设备时,建议关闭内存的 Ballooning 功能,来确保虚拟机内存不共享

PVE 直通显卡

开启 IOMMU 和硬件直通功能

编辑 /etc/default/grub,并修改 GRUB_CMDLINE_LINUX_DEFAULT 根据硬件平台添加如下选项

# Intel CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream" # AMD CPU
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream"

intel_iommu=on amd_iommu=on 用于开启 IOMMU 硬件单元驱动

iommu=pt 用于跳过地址映射来提高内核驱动设备性能

initcall_blacklist=sysfb_init 用于禁用 simplefb 设备加载

PVE 7.3 中使用 simplefb 替代了旧的 vesafbefifb

所以旧版中,Legacy BIOS 引导使用 video=vesafb:offUEFI 使用 video=efifb:off

pcie_acs_override=downstream 用于拆分 iommu groups,防止分组错误时直通一个板载端口导致整个设备被直通

更新 GRUB

PVE 官方手册中给出了 proxmox-boot-tool refresh 命令用于更新 GRUB,但有可能无法正常更新,此时请根据情况尝试 update-grub

加载内核模块

编辑 /etc/modules,添加如下内容

vfio
vfio_iommu_type1
vfio_pci

Linux Kernel 6.2 版本中取消了 vfio_virqfd,低于该版本需额外添加

重启 PVE

验证 IOMMU

dmesg | grep -e DMAR -e IOMMU,输出类似内容

[    0.000000] Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA
[ 0.008734] ACPI: DMAR 0x000000007BAFE000 0000E8 (v01 DELL PE_SC3 00000001 DELL 00000001)
[ 0.008767] ACPI: Reserving DMAR table memory at [mem 0x7bafe000-0x7bafe0e7]
[ 0.349828] DMAR: IOMMU enabled
[ 0.822346] DMAR: Host address width 46
[ 0.822348] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0
[ 0.822357] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.822360] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1
[ 0.822365] DMAR: dmar1: reg_base_addr c7ffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.822367] DMAR: ATSR flags: 0x0
[ 0.822370] DMAR: ATSR flags: 0x0
[ 0.822372] DMAR-IR: IOAPIC id 10 under DRHD base 0xfbffc000 IOMMU 0
[ 0.822374] DMAR-IR: IOAPIC id 8 under DRHD base 0xc7ffc000 IOMMU 1
[ 0.822375] DMAR-IR: IOAPIC id 9 under DRHD base 0xc7ffc000 IOMMU 1
[ 0.822376] DMAR-IR: HPET id 0 under DRHD base 0xc7ffc000
[ 0.822378] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.822688] DMAR-IR: IRQ remapping was enabled on dmar0 but we are not in kdump mode
[ 0.822995] DMAR-IR: IRQ remapping was enabled on dmar1 but we are not in kdump mode
[ 0.823121] DMAR-IR: Enabled IRQ remapping in x2apic mode
[ 1.331693] DMAR: No RMRR found
[ 1.331696] DMAR: No SATC found
[ 1.331698] DMAR: dmar0: Using Queued invalidation
[ 1.331701] DMAR: dmar1: Using Queued invalidation
[ 1.347932] DMAR: Intel(R) Virtualization Technology for Directed I/O

验证 IOMMU 中断重映射

dmesg | grep remapping,输出类似内容

# Intel
[ 0.822378] DMAR-IR: Queued invalidation will be enabled to support x2apic and Intr-remapping.
[ 0.823121] DMAR-IR: Enabled IRQ remapping in x2apic mode
# AMD
AMD-Vi: Interrupt remapping enabled

此时可以直通除显卡外的 PCIe 设备

如果没有开启,请验证 BIOS 中是否启用 X2APIC 功能

开启 X2APIC 后仍无法启用中断重映射,尝试在 /etc/modprobe.d/iommu_unsafe_interrupts.conf 中添加以下内容并重启

options vfio_iommu_type1 allow_unsafe_interrupts=1

vfio_iommu_type1 启用该模块来实现设备隔离、DMA 映射及中断处理

allow_unsafe_interrupts 允许不安全的 IOMMU 中断重映射

显卡直通

屏蔽驱动

编辑 /etc/modprobe.d/pve-blacklist.conf 添加以下内容用于屏蔽对应 GPU 平台驱动,防止主机驱动 GPU

# 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)

NVIDIA GPU 在 Windows 中可能会在使用类似 GeForce Experience Passmark Performance Test SiSoftware Sandra 应用时使出警告

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

options kvm ignore_msrs=1 report_ignored_msrs=0

ignore_msrs=1 忽略异常

report_ignore_msrs=0 禁止报告异常

配置 VFIO,分离显示和音频输出

输入 lspci -nn | grep VGA 得到如下输出

09:00.0 VGA compatible controller [0300]: Matrox Electronics Systems Ltd. G200eR2 [102b:0534] (rev 01)
83:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1060 3GB] [10de:1b84] (rev a1)

显然 83:00.0 为 GPU 设备,执行 lspci -n -s 83:00,得到如下输出

83:00.0 0300: 10de:1b84 (rev a1)
83:00.1 0403: 10de:10f0 (rev a1)

根据以上两次输出对比可以得到设备 ID 为 10de:1b84,则板载音频设备 ID 为 10de:10f0

将两个 ID 写入 /etc/modprobe.d/vfio.conf

options vfio-pci ids=10de:1b84,10de:10f0

vfio-pci 用于将指定设备绑定到 VFIO 框架,由 vfio-pci 驱动,以便用户态进程可以直接访问这些设备

更新内核

update-initramfs -u

重启

验证 vfio-pci

执行 lspci -nnk 找到显卡设备,应为类似如下内容

83:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1060 3GB] [10de:1b84] (rev a1)
Subsystem: GALAX GP104 [GeForce GTX 1060 3GB] [1b4c:11de]
Kernel driver in use: vfio-pci
Kernel modules: nvidiafb, nouveau
83:00.1 Audio device [0403]: NVIDIA Corporation GP104 High Definition Audio Controller [10de:10f0] (rev a1)
Subsystem: GALAX GP104 High Definition Audio Controller [1b4c:11de]
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel

其中 Kernel driver in use 值为 vfio-pci 即可

添加显卡到虚拟机

登录 PVE WebUI,进入虚拟机 Hardware 配置,Add => PCI Device

选择 Raw Device,在 Device 中选择 GPU,开启 All Functions ROM-Bar PCI-Express

点击 Add

解决 Linux 虚拟机中驱动签名验证问题

如果在 Linux 中使用 nvidia-smi 提示以下内容

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 提示以下内容

# 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

该问题大概率由 驱动签名无法验证 导致,此时请尝试在 虚拟机 BIOS 中关闭安全启动

如果出于特殊需求或环境导致无法关闭,需注册 DKMS 密钥,注册流程比较复杂且涉及 EFI 分区改动,本文不作详解

PVE 配置显卡直通的更多相关文章

  1. PVE开启硬件显卡直通功能

    首先编辑GRUB配置文件: root@pve:~# vim /etc/default/grub root@pve:~# root@pve:~# cat /etc/default/grub # If y ...

  2. pve配置

    U盘安装 推荐使用https://rufus.ie/ 刻录到U盘 (注意:以 DD 镜像 模式写入) 关闭订阅提醒 将if(data.status!=='Active')替换为if(false) se ...

  3. kvm配置USB直通

    参照:https://www.linuxidc.com/Linux/2014-12/110919.htm WebVirMgr界面是没有直接的途径了,只能靠修改xml文件,在<device> ...

  4. All in one入门之All in one和三种PVE、ESXI、Windows Server方案

    前言 All in one 前段时间,在某多多上花了446大洋弄了一台J4125准系统小主机,再花了一点钱买个杂牌msata和"全新"三星内存条,入坑了All in one. Al ...

  5. ESXI和vSphere的安装配置-实现一台电脑硬件虚拟化为两台

    本篇文章包含以下几个部分: 1EXSI软件和vSphere软件的安装 2在vSphere上安装虚拟系统 3对虚拟系统通过配置实现硬件虚拟化,实现硬件直通 1.EXSI安装 通过网上下载EXSI ISO ...

  6. 通过 SMB 直通优化文件服务器的性能

    https://technet.microsoft.com/zh-cn/library/hh831487.aspx Windows Server 2012 内置新增功能,称为 SMB 直通,用来支持使 ...

  7. NVIDIA 显卡与 CUDA 在深度学习中的应用

    CUDA(Compute Unified Device Architecture),是显卡厂商 NVIDIA 推出的运算平台. 0. 配置 显卡驱动的下载地址:Drivers - Download N ...

  8. qemu-kvm安装and配置桥接和SR-IOV

    kvm和docker的区别:kvm是全虚拟化,需要模拟各种硬件,docker是容器,共享宿主机的CPU,内存,swap等.本文安装的qemu-kvm属于kvm虚拟化,其中:kvm负责cpu虚拟化和内存 ...

  9. PVE联网及更换国内源

    一.PVE联网 第一次安装PVE,正常情况下PVE的IP是在我们上网的网段的.没有网络有可能是没有配置DNS服务器地址或DNS地址是软路由网关地址.解决方法有3种: 1:设置DHCP自动获取网络地址和 ...

  10. VMware workstation 14 安装 iOS虚拟机

    https://03k.org/vmware-macos.html https://jingyan.baidu.com/article/363872ec206a356e4ba16f30.html 1. ...

随机推荐

  1. vscode使用github

    1, vscode打开terminal,生成RSA密钥,并查看蜜月 PS D:\code\SQL> git init Reinitialized existing Git repository ...

  2. legend不显示

    legend写了对应的data,在series需要填写对应的name

  3. 跨平台交叉编译 Native AOT

    如何将.NET 应用程序发布到鸿蒙上,肯定是很多人感兴趣的话题,目前.NET完全具备可以在OpenHarmony系统上运行的能力,.NET 现在有很多选项CoreCLR.Mono和NativeAOT. ...

  4. 【前端】【Vue】Vue3自适应瀑布流解决方案

    Vue3自适应瀑布流解决方案 效果如上图所示. 说明:Vue3.[vue-masonry插件](vue-masonry - npm (npmjs.com)) 建议查看官方文档vue-masonry ( ...

  5. 如何在BASH中将制表符分隔值(TSV)文件转换为逗号分隔值(CSV)文件?(How do I convert a tab-separated values (TSV) file to a comma-separated values (CSV) file in BASH?)

    我有一些TSV文件需要转换为CSV文件. BASH中是否有任何解决方案,例如使用awk来转换这些?我可以这样使用sed,但担心它会出错: sed 's/\t/,/g' file.tsv > fi ...

  6. JVM实战—1.Java代码的运行原理

    大纲 1.Java代码到底是如何运行起来的 2.JVM类加载机制的一系列概念 3.JVM中有哪些内存区域及各自的作用 4.JVM的垃圾回收机制的作用 5.问题汇总 1.Java代码到底是如何运行起来的 ...

  7. Qt/C++离线读取全国任意经纬度高程海拔值/无任何依赖/纯原创代码解析

    一.前言说明 做地图开发会遇到一个常规需求,就是获取当前经纬度对应的海拔高度,也叫做高程值,很遗憾各大地图厂商都未提供接口获取,可能是有明文规定,不能地图中提供对应的海拔高度值,于是需要另想他法,尽管 ...

  8. Qt编写视频监控系统73-不同视频流不同类型的判断和解析(http/m3u8/rtsp/rtmp等)

    一.前言 这套视频监控系统大概从2018年起步整体框架,一步步积累到现在,中间经历了无数次的各种视频文件.视频流.视频设备的播放测试,比如光视频文件就有mp4/wmv/rmvb/mkv/avi等格式, ...

  9. [转]OpenCV学习笔记(十五)——摄像机的标定和3D重建calib3D

    OpenCV学习笔记(十五)--摄像机的标定和3D重建calib3D OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标 翻译 搜索 复制

  10. 万字长文,一篇吃透WebSocket:概念、原理、易错常识、动手实践

    本文由作者"阿宝哥"分享,原题"你不知道的 WebSocket",有修订和改动. 1.引言 本文将从基本概念.技术原理.常见易错常识.动手实践等多个方面入手,万 ...