> 虚拟化 Virtualization > Proxmox >

PVE下如何启用 PCI直通显卡GPU/iGPU/USB/声卡AUDIO等硬件直通教程

1.使设备正常工作的重要 BIOS 设置
 
启用 VT-d
禁用 CSM
ACS Enable # 如果存在,设置为已启用(自动不起作用)
启用 4G解码 4G Decoding
禁用 Resizable BAR/Smart Access Memory智能访问内存 #(如果启用,AMD GPUS(Vega 及更高版本)会遇到“代码 43 错误”)
启用 IOMMU # 如果存在,主要用于 AMD 主板
将主显示器设置为 CPU/iGPU # 如果您的 CPU 有 iGPU
预分配内存为 64M
2.打开PVE节点的shell,输入命令:
要忽略 dmesg 输出中的一些烦人的错误, 请运行以下命令(# 这一步对于直通来说不是必需的,但有助于保持干净。)
 
nano /etc/modprobe.d/kvm.conf
options kvm ignore_msrs=Y report_ignored_msrs=0
# 按 Ctrl + X,然后按 Y + Enter 保存更改。
3.启动内核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 允许将此空间映射到内存以便更简单地访问。
4.使用以下命令更新 grub
 
update-grub
5.重新启动主机以应用更改
 
reboot
6.主机启动并运行后,运行以下命令,验证是否开启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
# 出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
7.对于某些平台,可能需要允许不安全中断。运行以下命令
 
nano /etc/modprobe.d/iommu_unsafe_interrupts.conf # 添加以下行;请注意,此选项可能会使您的系统不稳定。
options vfio_iommu_type1 allow_unsafe_interrupts=1
8.启用必要的内核模块,运行以下命令
 
nano /etc/modules # 添加以下行;
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
9.更改任何相关模块后,您需要刷新 initramfs。 运行以下命令
 
update-initramfs -u -k all
10.现在检查是否已启用重新映射, 运行以下命令
 
dmesg | grep remapping # 应该输出类似这样的内容;
“AMD-Vi: Interrupt remapping enabled”
“DMAR-IR: Enabled IRQ remapping in x2apic mode”
# 'x2apic' 在旧 CPU 上可能有所不同,但应该仍然可以工作。
11.将驱动程序模块列入黑名单,以使虚拟机能够完全访问显卡等。运行以下命令
 
nano /etc/modprobe.d/pve-blacklist.conf # 添加以下行;
blacklist nouveau
blacklist nvidia
blacklist nvidiafb
blacklist snd_hda_codec_hdmi
blacklist snd_hda_intel
blacklist snd_hda_codec
blacklist snd_hda_core
blacklist radeon
blacklist amdgpu
blacklist i915
options vfio_iommu_type1 allow_unsafe_interrupts=1
# 如果有重复项,记得删除,解释:屏蔽三大显卡驱动,屏蔽hdmi声音驱动;options
12.找到您的 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]”
13.将主机的 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。
14.将主机的 PCI 设备 ID 列入黑名单,运行以下命令 (# 这可以在虚拟机的硬件部分中完成,而不是使用此方法。硬件 -> 添加 -> PCI 设备。)
 
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
15.再次重新启动主机以应用更改
 
reboot
16.能够为连接的外部显示器提供适当的显示加速(# 这可以在虚拟机的硬件部分中完成,而不是使用此方法。硬件 -> 显示 -> 无。)
 
nano /etc/pve/qemu-server/”VMID”.conf
# VMID = 例如 100、101、102 等
# 请注意,将“显示”设置为“无”(vga:无)会导致控制台/noVNC 被禁用 - “任务错误:无法运行 vncproxy”。
# 如有必要,恢复到 vmware。
vga: none
# vga: vmware # 如果使用此选项,请删除“vga: none”。
17.Mac系统下有关兼容 GPU 的一些信息
 
EFI/OC/config.plist # 挂载 EFI 驱动器并在 OpenCore Configurator.app中打开文件。
# boot-args 位于 NVRAM -> 7C436110-AB2A-4BBB-A880-FE41995C9F82
# AMD RX 5000 和 6000 系列需要在 boot-arg 添加以下参数才能获得正确的输出。
agdpmod=pikera
# 如果您有 Nvidia 的任何 GTX 600 或 700 系列,请仅使用 OpenCore Legacy Patcher,因为该系列是唯一与 macOS 兼容的系列。
# AMD RX 400/500 和 RX 5000/6000 系列不需要任何补丁,因为它们是macOS支持的原生卡。
18.注意:
 
# 勾选直通的所有功能,这是您希望 GPU 充分工作的设置。对于某些功能,只能勾选“所有功能”和“ROM-Bar”。
这些复选框因卡而异,可能需要测试适合您的选项。
有些卡还需要转储显卡的.rom文件才能工作。要实现这一点,您必须使用现有的一些指南,从您的特定卡中自行转储显卡的rom文件。我们将来可能会为此添加一个指南。
独立显卡的rom下载地址https://www.techpowerup.com/vgabios
# 我们最近发现,如果未勾选 PCI-Express,则 HDMI-音频之类的功能可能无法工作。但请注意,您的安装可能无法在勾选后启动,然后取消勾选即可。
# 关于Mac系统下的提醒!如果您有 Nvidia 的任何 GTX 600 或 700 系列,请仅使用 OpenCore Legacy Patcher,因为该系列是唯一与 macOS 兼容的系列。
#如果您使用 OCLP 并收到这些错误,这可以解决问题
EFI/OC/config.plist # boot-args 位于 NVRAM 下 -> 7C436110-AB2A-4BBB-A880-FE41995C9F82
amfi_get_out_of_my_way=0x1 # AMFI 已启用
ngfxcompat=1 # 强制缺少 compat 属性
ngfxgl=1 # 强制 OpenGL 属性缺失
nvda_drv_vrl=1 # nvda_drv(_vrl) 变量缺失
# 要解决 SIP 错误,请将 csr-active-config 更改为030A0000
# 重新启动后,从启动选择器中选择重置 NVRAM

 
 原文链接:https://imacos.top/2023/07/31/pci/,转载请注明出处。
(责任编辑:IT)