PVE下直通PCI设备通用教程

PVE下直通PCI设备通用教程

根据黑苹果屋教程整理

配置文件修改前请先将原配置文件备份

cp /*/*/***.* /*/*/***.*.bak

一、BIOS设置

启用 VT-d
禁用 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

二、忽略错误

忽略 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 /etc/default/grub # 将以下行粘贴到其中,并在旧标签前面添加一个注释标签#,以下为常用的一些写法。
# 对于 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 允许将此空间映射到内存以便更简单地访问。
参数 解释说明
quiet 默认参数,表示在启动过程中只显示重要信息
intel_iommu=on 用 intel_iommu 驱动来驱动 IOMMU 硬件单元
amd_iommu=on 用 amd_iommu 驱动来驱动 IOMMU 硬件单元
iommu=pt 只为使用透传功能的设备启用 IOMMU,并可以提供更好的功能和性能
pci=assign-busses 部分网卡开启 SR-IOV 需要这个参数,否则可能报错
PCIe_acs_override=downstream 用于将 iommu groups 拆分,方便灵活按需直通一些板载的设备
PCIe_acs_override=multifunction PCIe 直通多功能支持,提高直通完美度(可选)
nofb 该选项允许你不用一个frame缓冲来使用图形安装程序
textonly 仅在文本模式下支持 GRUB 串行控制台
nomodeset 系统启动过程中,暂时不运行图像驱动程序
video=vesafb:off 禁用 vesa 启动显示设备
video=efifb:off 禁用 efi 启动显示设备
video=simplefb:off 5.15 内核开始直通可能需要这个参数
initcall_blacklist=sysfb_init 部分 A 卡如 RX580 直通异常可能需要这个参数
pcie_aspm=off 关闭 PCIe 设备的 ASPM 节能模式,解决部分 PCIe 设备 AER 报错
pcie_aspm=force 强制 PCIe 设备及爱情 ASPM 节能模式,解决部分 PCIe 设备 AER 报错
pci=noaer 不输出 AER 报错日志,华南主板经常会 AER 报错,建议配合使用,眼不见心不烦
pci=nomsi 在系统范围内禁用 MSI 中断,主要还是解决 PCIe 相关的报错

四、更新grub,并重启

update-grub
reboot

五、重启后,验证是否开启iommu

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
# 如果没有输出,则说明有问题。你应该看到这样的东西;“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
# 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
#https://www.cnblogs.com/MAENESA/p/18005241 教程网址
#如果失败或者没有,可能没有启用IOMMU中断重映射 ,会导致无法直通,请如下操作。
# 编辑文件,添加以下行;请注意,此选项可能会使您的系统不稳定。
nano /etc/modprobe.d/iommu_unsafe_interrupts.conf
options vfio_iommu_type1 allow_unsafe_interrupts=1

七、启用必要的内核模块

nano /etc/modules # 添加以下行;
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

八、更改任何相关模块后,需刷新initramfs

update-initramfs -u -k all

九、检查是否已启用重新映射

dmesg | grep remapping # 应该输出类似这样的内容;
“AMD-Vi: Interrupt remapping enabled”
“DMAR-IR: Enabled IRQ remapping in x2apic mode”
# 'x2apic' 在旧 CPU 上可能有所不同,但应该仍然可以工作。
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
#其它教程结合 https://www.cnblogs.com/MAENESA/p/18005241

十、驱动程序模块列入黑名单,以使虚拟机能够完全访问显卡等

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
#屏蔽hdmi声音驱动
options vfio_iommu_type1 allow_unsafe_interrupts=1
# 屏蔽三大显卡驱动,

十一、找到您的 PCI 设备对应的 ID

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]

十二、将主机的PCI设备ID绑定到vifo模块,并重启。

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。
rbboot

十三、直通显卡一些注意事项

# 勾选直通的所有功能,这是您希望 GPU 充分工作的设置。对于某些功能,只能勾选“所有功能”和“ROM-Bar”。
这些复选框因卡而异,可能需要测试适合您的选项。
有些卡还需要转储显卡的.rom文件才能工作。要实现这一点,您必须使用现有的一些指南,从您的特定卡中自行转储显卡的rom文件。我们将来可能会为此添加一个指南。
独立显卡的rom下载地址https://www.techpowerup.com/vgabios
# 我们最近发现,如果未勾选 PCI-Express,则 HDMI-音频之类的功能可能无法工作。但请注意,您的安装可能无法在勾选后启动,然后取消勾选即可。

十四、挂载显卡rom方式操作

  • 设备只有核显:大部分情况会出现核显直通后,即使驱动了显卡,显示信号的HDMI、DP、DVI等接口无法正常输出画面,但是也有部分电脑可以通过加载显卡的rom来实现显示信号的输出,提取rom并加载的一些方式,后续在更新对应的教程
  • 设备只有独立显卡(或双独立显卡):直通后需要通过加载显卡的rom后,可实现显示信号输出,显卡信号输出正常工作.独立显卡的rom可以通过https://www.techpowerup.com/vgabios下载自己对应的型号,下载的时候需要对应显卡型号、厂商信息、显卡BIOS版本日期等信息,至于这些信息如何查看,下面的内容会介绍
  • 设备核显与独立显卡同时具备:直通独立显卡一般不用加载显卡的rom,但这也不是绝对的,直通核显同样需要加载显卡的rom,不然也会出现接口无法正常输出画面的情况
  • 设备有两张以上独立显卡或同时具备两张显卡:通常PCIE通道的第一张独立显卡需要加载显卡的rom,才能直通。第二张之后的独立显卡因为启动PVE系统的时候不会占用到,所以第二张之后的独立显卡不用添加rom也可以实现直通,添加了rom后反而会直通不成功。
  • 获取显卡rom

      1. 在winPE环境下:您需要使用U盘制作winPE的启动盘,在winPE下使用Aida64.exe工具,可以通过显卡的BIOS版本日期、显存大小来查看这些信息.下载对应的显卡rom
      2. 获得显卡的信息,进入下载https://www.techpowerup.com/vgabios
    • 使用GPU-Z后,界面上显示的“bios 版本”(英文版的叫“bios vision”),这一行最右边有一个小图标,点击一下,会出现菜单选项,选“保存至文件”就可以了。如果保存下来的是“*.bin”格式的文件,也是可以直接用的

    • 将获取到的显卡rom上传到PVE的指定目录中(PVE开机状态),上传路径:/usr/share/kvm

  • 在虚拟机硬件中添加直通显卡,然后再虚拟机的配置文件中添加显卡rom的加载

    nano /etc/pve/qemu-server/"VMID".conf
    # VMID修改为您的设备ID,VMID = 例如 100、101、102 等
    # 可能需要避免在某些设备上使用“pcie=1”。
    hostpci0: “0x:00”,pcie=1,x-vga=1
    #hostpci1: “0x:00”,pcie=1
    #hostpci2; “0x:00”,pcie=1
    # 在直通的显卡后加入如下参数
    ,romfile=amd580.rom
    reboot
  • 在虚拟机”硬件“里高显示设置为”无“,或修改配置文件。

    nano /etc/pve/qemu-server/”VMID”.conf
    # VMID = 例如 100、101、102 等
    # 请注意,将“显示”设置为“无”(vga:无)会导致控制台/noVNC 被禁用 - “任务错误:无法运行 vncproxy”。
    # 如有必要,恢复到 vmware。
    vga: none
    # vga: vmware # 如果使用此选项,请删除“vga: none”。
posted @   一壶缘  阅读(1005)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示