PVE开启IOMMU(硬件直通)

PVE开启IOMMU(硬件直通)

硬件直通

确认主板支持
启用 VT-d
启用 amd-v(amd cpu)
禁用 CSM # i44fx机型建议开启此项,并且设置csm里的其他项目为UEFI
ACS 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.conf
options 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 ExperiencePassmark Performance TestSiSoftware 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:00
      01: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 -u
      reboot
    • 检查 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 即为成功

添加显卡到虚拟机

创建虚拟机

常规 选项卡请根据自己情况填写

操作系统 选项卡请根据自己情况填写

系统 选项卡

  • 显卡 选择 标准VGASPICEVirtlO-GPUVirGL GPU 任选其一即可
  • 机型 选择 q35
  • Qemu代理 选择 开启(一般会安装的,类似 ESXI agent,用于与 虚拟机通信 获取 虚拟机信息
  • BIOS 选择 OVMF(UEFI) ,并选择 EFI存储

磁盘 选项卡请根据自己情况填写

CPU 选项卡

  • 类别 推荐选择 host
  • 其他请根据自己情况填写

内存 选项卡

  • 推荐关闭 Ballooning设备 ,因为 硬件直通虚拟机 需要保证内存不是共享的。

网络 选项卡请根据自己情况填写

添加显卡到虚拟机

选择 虚拟机 , 并点击 硬件

点击 添加 , 然后点击 PCI设备

选择 原始设备 ,在 设备 中选择需要直通的显卡

启用 所有功能主GPUROM-BarPCI-Express

其中 主GPU 可以不用选择,此选项影响 显卡默认参数(会导致无法启动终端) 所有功能ROM-BarPCI-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

posted @   一壶缘  阅读(2155)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示