1.使设备正常工作的重要 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
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 允许将此空间映射到内存以便更简单地访问。
更多参数释义
参数 | 解释说明 |
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 相关的报错 |
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/,转载请注明出处。
评论0