17
2025
03
16:45:07

PVE开启IOMMU(硬件直通)

硬件直通

确认主板支持
启用 VT-d启用 amd-v(amd cpu)禁用 CSM # i44fx机型建议开启此项,并且设置csm里的其他项目为UEFIACS Enable # 如果存在,设置为已启用(自动不起作用)启用 4G解码 4G Decoding禁用 Resizable BAR/Smart Access Memory智能访问内存 #(如果启用,AMD GPUS(Vega 及更高版本)会遇到“代码 43 错误”)启用 IOMMU # 如果存在,主要用于 AMD 主板将主显示器设置为 CPU/iGPU # 如果您的 CPU 有 iGPU预分配内存为 64M
忽略部分错误(同 忽略显卡警告(Nvidia专属)

忽略 dmesg 输出中的一些的错误, 请运行以下命令(# 这一步对于直通来说不是必需的,但有助于保持干净。)

nano /etc/modprobe.d/kvm.confoptions kvm ignore_msrs=Y report_ignored_msrs=0# 按 Ctrl + X,然后按 Y + Enter 保存更改。
开启iommu

IOMMU(Input-Output Memory Management Unit)是一种硬件功能,用于管理设备对系统内存的访问。启用 IOMMU 后,可以在虚拟机中直接访问物理设备,并允许虚拟机独立于主机操作系统运行

  • 编辑(nano、vi) /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,multifunction pci=nommconf"

    # 对于 AMD CPU

    GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction pci=nommconf"

    # 其他的一些写法(如果是AMD处理器,将intel改为amd)

    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt i915.enable_gvt=1 video=efifb:off" # 这是GVT模式,也就是共享模式,少部分cpu支持,但体验很好

    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt video=efifb:off" # 这是独占模式,都支持,但显示器没有pve的控制台输出,也只能直通个一个虚拟机

    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt pcie_acs_override=downstream,multifunction"

    GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on initcall_blacklist=sysfb_init pcie_acs_override=downstream,multifunction"

    # 参数释义

    1.iommu=pt:启用 Intel VT-d 或 AMD-Vi 的 IOMMU。这是一种硬件功能,用于管理设备对系统内存的访问。在虚拟化环境中,启用 IOMMU 后,可以将物理设备直通到虚拟机中,以便虚拟机可以直接访问硬件设备。“iommu=pt”不是必须的,PT模式只在必要的时候开启设备的IOMMU转换,可以提高未直通设备PCIe的性能,建议添加。

    2.initcall_blacklist=sysfb_init:禁用 sysfb_init 内核初始化函数。这个函数通常用于在内核启动过程中初始化系统帧缓冲。在使用 GPU 直通的情况下,这个函数可能会干扰直通操作,因此需要禁用它。

    3.i915.enable_gvt=1:启用 Intel GVT-g 虚拟 GPU 技术。这个选项用于创建一个虚拟的 Intel GPU 设备,以便多个虚拟机可以共享物理 GPU 设备。启用 GVT-g 需要在支持虚拟 GPU 的 Intel CPU 和主板上运行,并且需要正确配置内核和虚拟机。想开启GVT-g的就添加这条,显卡直通的就不要添加了。

    4.initcall_blacklist=sysfb_init:屏蔽掉pve7.2以上的一个bug,方便启动时候就屏蔽核显等设备驱动;

    5.pcie_acs_override=downstream,multifunction:便于iommu每个设备单独分组,以免直通导致物理机卡死等问题

    6.pci=nommconf:意思是禁用pci配置空间的内存映射,所有的 PCI 设备都有一个描述该设备的区域(您可以看到lspci -vv),访问该区域的最初方法是通过 I/O 端口,而 PCIe 允许将此空间映射到内存以便更简单地访问。



    intel_iommu 和 amd_iommu=on 为 开启IOMMU

    video=vesafb:off  不加载 vesafb 是 veas设备 的 fb

    video=efifb:off   不加载  uefi设备 的 fb

    在 PVE 7.3 之后版本用initcall_blacklist=sysfb_init 替代

    pcie_acs_override=downstream 是为了将 iommu groups拆分,

    方便直通一些板载的设备(来源于加强硬件直通的功能)


  • 更新GRUB


    proxmox-boot-tool refresh 或 update-grub



    reboot
  • 加载内核模块,编辑 /etc/modules ,新增一下内容


    nano /etc/modules # 添加以下行;

    vfio

    vfio_iommu_type1

    vfio_pci

    #vfio_virqfd



    vfio_virqfd 在 Linux 6.2 以上版本中不适用,低于 Linux 6.2 的请取消注释-
  • 刷新 initramfs。 运行以下命令

    update-initramfs -u -k all
  • 验证是否成功,输入命令,如有类似下列提示,则成功


    dmesclg | grep -e DMAR -e IOMMU

    # 如果没有输出,则说明有问题。你应该看到这样的东西;“DMAR: IOMMU enabled”

    # 另外一种验证方式

    dmesg | grep iommu

    [ 1.341100] pci 0000:00:00.0: Adding to iommu group 0

    [ 1.341116] pci 0000:00:01.0: Adding to iommu group 1

    [ 1.341126] pci 0000:00:02.0: Adding to iommu group 2

    [ 1.341137] pci 0000:00:14.0: Adding to iommu group 3

    [ 1.341146] pci 0000:00:17.0: Adding to iommu group 4

    # 此时输入命令

    find /sys/kernel/iommu_groups/ -type l

    # 出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启


  • 验证是否 启用IOMMU中断重映射 输入 dmesg | grep remapping 并输出 类似 以下内容即为成功。到目前为止可以 直通 除显卡外 的 PCI-E设备


    dmesg | grep remapping

    # 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中断重映射 ,会导致无法直通,请如下操作。


      vim /etc/modprobe.d/iommu_unsafe_interrupts.conf



      #增加

      options vfio_iommu_type1 allow_unsafe_interrupts=1

显卡直通

  • 屏蔽驱动 编辑 /etc/modprobe.d/pve-blacklist.conf ,添加以下内容


    nano /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

    blacklist i915
  • 忽略显卡警告(Nvidia专属,主要在 Win 中遇到一些应用,列如 GeForce Experience 、Passmark Performance Test 和 SiSoftware Sandra) 编辑 /etc/modprobe.d/kvm.conf


    options kvm ignore_msrs=1 report_ignored_msrs=0



    ignore_msrs 忽略异常 report_ignored_msrs 是否报告异常
  • 配置 VFIO ,主要用于 显示输出 和 音频输出 分开

    • 查看显卡ID 输入 lspci -nn | grep VGA ,得到类似以下内容


      lspci -nn | grep -i “device” # 您也可以执行 lspci -nn 命令,这将列出所有设备及ID

      # “device”= amd、ati、nvidia、vga、usb、audio、wireless 等

      # 然后您应该会看到类似于下面的列表;

      # 一次只引用一个设备,并记下您需要的 ID。

      “0x:00.x VGA compatible controller [1234:5678]

      “0x.00.x Audio Device [1234:5678] # 无需记下 GPU 音频 ID。

      “0x.00.x USB controller [1234:5678]


    • 获取 设备ID 和 音频ID , 输入lspci -n -s 02:00 上面的ID

      lspci -n -s 02:0001:00.0 0300: 10dg:1fa2 (rev a1)01:00.1 0403: 10dg:10fd (rev a1)
    • 将 设备ID 和 音频ID 写入到 /etc/modprobe.d/vfio.conf


      nano /etc/modprobe.d/vfio-pci.conf

      # 请注意,在此处添加disable_vga 可能会阻止来宾在SeaBIOS 模式下启动,也可以将disable_vga=1参数去掉

      # 像这样在此文件中添加设备 ID,两组以上用,隔开,只有一个就不用了;

      options vfio-pci ids=1234:5678,1234:5678 disable_vga=1

      # 再次强调,不要添加 GPU 音频 ID。





      #如果有多个设备,ids后面每个设备之间用,隔开
    • 更新内核,重启

      update-initramfs -ureboot
    • 检查 vfio-pci 是否应用成功 输入 lspci -nnk 并找到 显卡编号 那一行,如果得到类似以下结果,为成功


      01:00.0 VGA compatible controller [0300]: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10dg:1fa2] (rev a1)

      Subsystem: NVIDIA Corporation TU117GLM [Quadro T400 Mobile] [10dg:1fa2]

      Kernel driver in use: vfio-pci

      Kernel modules: nvidiafb, nouveau

      01:00.1 Audio device [0403]: NVIDIA Corporation Device [10dg:10fd] (rev a1)

      Subsystem: NVIDIA Corporation Device [10dg:10fd]

      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 命令

点击添加

intel GVT-g虚拟化核显

理论上支持intel 5-10代CPU

  • 改 GRUB配置 ,在 GRUB_CMDLINE_LINUX_DEFAULT= 行添加 intel_iommu=on i915.enable_gvt=1

  • 更新Grub,update-grubOrproxmox-boot-tool refresh

  • 检查 IOMMU是否开启

  • 加载内核模块


    编辑  /etc/modules



    vfio

    vfio_iommu_type1

    vfio_pci

    # vfio_virqfd

    kvmgt



    #vfio_virqfd 在 Linux 6.2 以上版本中不适用,低于 Linux 6.2 的请取消注释
  • 更新内核 update-initramfs -u ,并重启pve

  • 验证量否开启


    ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/

    # 如果不是,将00:02.0换成自己的



    # 出现下面4个选项或者类似的即成功

    i915-GVTg_V5_1 i915-GVTg_V5_2 i915-GVTg_V5_4 i915-GVTg_V5_8





推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://sg.hqyman.cn/post/9647.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册
51La

您的IP地址是: