PCI 设备直通确实允许您传递诸如 GPU 之类的东西以在虚拟机内进行适当的加速,这使得运行游戏和其他图形密集型任务成为可能,与裸机安装的 Windows 相比不会造成性能损失。

单一指南不可能涵盖所有现有的不同系统。我们的指南试图为您提供尽可能多的信息。有很多信息,但并非所有信息都与您和您的系统相关,请务必进行一些自己的研究。

BIOS 通用设置

重要的 BIOS 设置,使一切正常运行!

确保您的 BIOS 是最新版本。
启用 SVM/虚拟化模式
启用 VT-d
需要直通才能正常工作;支持的 CPU
启用 SR-IOV
(如果存在)。
禁用 CSM/Legacy Boot
启用 ACS(如果存在),设置为启用(自动不起作用)。
将 PEG {NUMBER} ASPM 设置为 L0 或 L0sL1
设置您提到的任何数量,如果存在 L0,请选择它。
启用 4G 解码
禁用可调整大小的 BAR/智能访问内存
如果启用,您可能会遇到“代码 43 错误”。
启用 IOMMU(如果存在),主要用于 AMD 主板;支持的 CPU
将主显示器设置为 CPU/iGPU
(如果您的 CPU 有 iGPU),如果没有,请跳过此步骤。
将预分配内存设置为 64M
(如果您的 CPU 有 iGPU),如果没有,也跳过这一步。

此步骤对于直通来说不是必需的,但有助于保持整洁。

要忽略 dmesg 输出中的一些烦人的“警告”,请执行以下操作

nano /etc/modprobe.d/kvm.conf
options kvm ignore_msrs=Y report_ignored_msrs=0

Ctrl + X -> Y -> Enter 保存更改。

设置启动参数

对于英特尔CPU

对于GRUB;用 grub 文件中的这一行替换当前类似的行。

nano /etc/default/grub

对该文件进行以下更改。

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt initcall_blacklist=sysfb_init"

Ctrl + X -> Y -> Enter 保存更改。


您的系统可能不依赖于 Grub,而是依赖于 systemd,当您使用ZFS时就是这种情况。

因此对于systemd

nano /etc/kernel/cmdline
root=ZFS=rpool/ROOT/pve-1 boot=zfs intel_iommu=on iommu=pt initcall_blacklist=sysfb_init

Ctrl + X -> Y -> Enter 保存更改。

对于 AMD CPU

对于GRUB;用 grub 文件中的这一行替换当前类似的行。

nano /etc/default/grub

对该文件进行以下更改。

GRUB_CMDLINE_LINUX_DEFAULT="quiet iommu=pt initcall_blacklist=sysfb_init"

Ctrl + X -> Y -> Enter 保存更改。


您的系统可能不依赖于 Grub,而是依赖于 systemd,当您使用ZFS时就是这种情况。

因此对于systemd

nano /etc/kernel/cmdline
root=ZFS=rpool/ROOT/pve-1 boot=zfs iommu=pt initcall_blacklist=sysfb_init

Ctrl + X -> Y -> Enter 保存更改。

仅适用于GRUB

当您的系统使用 Grub 时,进行更改后才需要!

update-grub

仅适用于systemd

仅当您的系统使用 systemd 时,进行更改后始终需要!

pve-efiboot-tool refresh

重新启动以提交更改

reboot

配置 IOMMU

主机重新启动并运行后,我们需要验证 IOMMU 是否已启用

对于英特尔CPU

dmesg | grep -e DMAR -e IOMMU

对于 AMD CPU

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi

如果没有输出,则表示出现了问题。您应该看到类似这样的信息:

“DMAR: IOMMU enabled”

启用必要的内核模块,运行以下命令

nano /etc/modules

添加以下行;

vfio
vfio_iommu_type1
vfio_pci

Ctrl + X -> Y -> Enter 保存更改。

更改任何与模块相关的内容后,您需要刷新 initramfs。 

update-initramfs -u -k all

现在检查重映射是否已启用。

dmesg | grep remapping

应该输出类似以下内容的内容;

对于AMD CPU,

AMD-Vi: Interrupt remapping enabled

对于Intel CPU,

DMAR-IR: Enabled IRQ remapping in x2apic mode

x2apic在较旧的 CPU 上可能有所不同,但仍应有效。

只有当您遇到问题时,才考虑这一点;

您也可以尝试将 nox2apic 添加到您的 Grub 或 Systemd 参数中。

如果您的系统不支持中断重映射,您可能需要允许不安全的中断。

请注意,此选项可能会使您的系统不稳定,但不一定。

nano /etc/modprobe.d/iommu_unsafe_interrupts.conf

添加以下行;

options vfio_iommu_type1 allow_unsafe_interrupts=1

Ctrl + X -> Y -> Enter 保存更改。

将驱动程序模块列入黑名单,让虚拟机可以完全访问显卡等。

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

Ctrl + X -> Y -> Enter 保存更改。

为了使 PCI 直通正常工作,您需要为要分配给虚拟机的每个设备设置一个专用的 IOMMU 组。为确保情况确实如此,请执行以下操作;

pvesh get /nodes/{nodename}/hardware/pci --pci-class-blacklist ""


将{nodename}替换为您的 Proxmox 节点的名称。

这是我的一个节点的示例。如您所见,我的 GPU、USB 控制器、无线适配器都有自己的专用组。

如果您的设备属于同一组,请务必仔细检查 BIOS 中的 ACS(访问控制服务)。如果您在任何地方都找不到它,您可以通过在 grub 或 systemd 文件中包含pcie_acs_override=downstream,multifunction来应用覆盖补丁,如果是这样,请返回我们编辑上述系统文件的步骤。

将您的设备列入黑名单

找到 PCI 设备的相应 ID,运行以下命令

lspci -nn | grep -i {device} #也可以直接使用lspci -nn查看全部

{device} = vga、nvidia、usb、audio、wireless 等。不包括 { } 括号。也可以直接使用lspci -nn查看全部

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

root@pve:~# lspci -nn
00:00.0 Host bridge [0600]: Intel Corporation Xeon E3-1200 v3 Processor DRAM Controller [8086:0c08] (rev 06)
00:01.0 PCI bridge [0604]: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller [8086:0c01] (rev 06)
00:14.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI [8086:8c31] (rev 05)
00:16.0 Communication controller [0780]: Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 [8086:8c3a] (rev 04)
00:1a.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #2 [8086:8c2d] (rev 05)
00:1b.0 Audio device [0403]: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller [8086:8c20] (rev 05)
00:1c.0 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 [8086:8c10] (rev d5)
00:1c.1 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #2 [8086:8c12] (rev d5)
00:1c.2 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #3 [8086:8c14] (rev d5)
00:1d.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #1 [8086:8c26] (rev 05)
00:1f.0 ISA bridge [0601]: Intel Corporation B85 Express LPC Controller [8086:8c50] (rev 05)
00:1f.2 SATA controller [0106]: Intel Corporation 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] [8086:8c02] (rev 05)
00:1f.3 SMBus [0c05]: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller [8086:8c22] (rev 05)
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev e7)
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0]
02:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin [Radeon RX 460/560D / Pro 450/455/460/555/555X/560/560X] [1002:67ef] (rev cf)
02:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Baffin HDMI/DP Audio [Radeon RX 550 640SP / RX 560/560X] [1002:aae0]
03:00.0 Network controller [0280]: Broadcom Inc. and subsidiaries BCM4360 802.11ac Wireless Network Adapter [14e4:43a0] (rev 03)
04:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 11)
root@pve:~#

上述的列表无需记下 GPU 音频 ID。
也可以每次仅引用一个设备,并记下您需要的 ID。

如您所见,上述列表我的 GPU 的 ID 是1002:67df1002:67ef

如果您在后续过程中遇到任何 USB 直通问题,您可能还需要查找您的 USB 控制器 ID。

记下您的 ID 以备下一步使用!

通常,建议添加您计划用于虚拟机的所有设备的 ID。黑名单本质上的作用是阻止 Proxmox 的设备,将它们禁止使用,并且不让虚拟机完全访问它,至少在大多数情况下是这样。

将主机的 PCI 设备 ID 列入黑名单,运行以下命令

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

在此文件中添加设备 ID,如下所示;

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

Ctrl + X -> Y -> Enter 保存更改。

同样,不要添加 GPU 音频 ID。

请注意,如果您将 SeaBIOS 模式用于任何用途,在此处添加disable_vga=1

可能会阻止客户机以 SeaBIOS 模式启动。您还可以将 disable_idle_d3=1添加 到行尾,本质上是禁用 D3 设备电源状态;这将阻止某些硬件进入低功耗模式,这可能会导致某些硬件通过时出现问题,请 在此处阅读更多信息。禁用它没有坏处,可能只会消耗更多电量。例如,已显示出 Thunderbolt 卡更好的稳定性。

现在你想让它看起来像这样。

现在,当您完成所有排序后,您需要再次重新启动主机。

reboot

将设备添加到虚拟机

当您的主机重新启动并运行时,我们终于可以开始向我们的虚拟机添加配件了!

在继续之前,根据您选择的 GPU、AMD 或 Nvidia,请先查看页面底部以对您的 macOS 进行必要的配置。

每当添加 GPU 或将显示设置为无时,控制台窗口的这种情况都是完全正常的。

因此,请确保您的显示器已连接好或至少有一个假插头,以便您能够使用您首选的远程应用程序远程进入虚拟机。

这是为了让 GPU 完全工作而需要设置的设置。对于某些显卡,只能勾选“所有功能”和“ROM 栏”。请自己试验这些选项!

某些显卡还需要转储的 .rom 文件才能工作。要获取该文件,您必须自己从特定显卡转储该文件,请查看本文后面的指南。

我们最近发现,如果未勾选 PCI-Express,HDMI-Audio 等功能可能无法工作。但请注意,如果勾选了该选项,您的安装可能无法启动,请取消勾选。

vBIOS 转储(可选)

在某些情况下,您可能必须转储 vBIOS,这完全取决于硬件。因此,在执行此操作之前,请继续阅读直通指南!

Rom-Parser

转储 GPU 很简单。它给我们带来了一些好处。这让我们可以测试它是否与 UEFI 兼容。我们还可以将转储的 vBIOS 文件用于我们的 VM。让我们的 VM 拥有 GPU vBIOS 的预加载副本。


逐个运行下面的每个命令,让我们从检查更新开始,安装依赖项并安装 rom-parser。

apt update
apt install gcc git build-essential -y
git clone https://github.com/awilliam/rom-parser
cd rom-parser
make

现在您只需要转储 vBIOS。它会被转储到 /tmp/image.rom。

仔细检查您的 GPU 总线 ID。

cd /sys/bus/pci/devices/0000:01:00.0/
echo 1 > rom
cat rom > /tmp/image.rom
echo 0 > rom

现在验证 vBIOS rom

./rom-parser /tmp/image.rom

应该输出类似如下的内容;

Valid ROM signature found @0h, PCIR offset 190h
PCIR: type 0, vendor: 10de, device: 1280, class: 030000
PCIR: revision 0, vendor revision: 1
Valid ROM signature found @f400h, PCIR offset 1ch
PCIR: type 3, vendor: 10de, device: 1280, class: 030000
PCIR: revision 3, vendor revision: 0 EFI: Signature Valid Last image
AMD 供应商重置(可选)

当今的 AMD GPU 经常会遇到 AMD 重置错误;这会导致显卡无法正确重置,因此每次主机开机时只能使用一次。当您第二次尝试启动虚拟机时,它会尝试重置并失败,导致虚拟机或主机挂起。

Vendor Reset 项目做出了一些补丁来解决该问题,请阅读 github 页面以获取更多信息以及通过此补丁支持哪些 GPU。

当系统仅配备一个 GPU 时,此问题尤其严重。这是因为该 GPU 被指定为主 GPU,并在启动过程中由主机 UEFI 初始化,因此即使只有一次,也不适合直通。

当重置问题发生时,您通常会看到类似于此 dmesg 输出的内容。

pcieport 0000:00:02.0: AER: Uncorrected (Non-Fatal) error received: 0000:00:02.0
pcieport 0000:00:02.0: AER: PCIe Bus Error: severity=Uncorrected (Non-Fatal), type=Transaction Layer, (Requester ID)
pcieport 0000:00:02.0: AER: device [8086:3c04] error status/mask=00004000/00000000
pcieport 0000:00:02.0: AER: [14] CmpltTO (First)
pcieport 0000:00:02.0: AER: Device recovery successful

让我们从安装所需的依赖项和供应商重置开始。

确保您已获得最新的内核头,并检查更新:

apt install pve-headers

如果失败,请确保您已禁用企业存储库并启用非订阅存储库。

安装构建依赖项:

apt install git dkms build-essential

执行构建:

git clone https://github.com/gnif/vendor-reset.git
cd vendor-reset
dkms install .

启用供应商重置以在启动时自动加载:

echo "vendor-reset" >> /etc/modules

将更改应用到 Initramfs

update-initramfs -u

重新启动节点以提交更改

reboot

当您启动带有 AMD GPU 的 VM 时,您将在 dmesg 输出中看到消息,表明正在使用新的重置程序。

vfio-pci 0000:03:00.0: AMD_POLARIS10: version 1.0
vfio-pci 0000:03:00.0: AMD_POLARIS10: performing pre-reset
vfio-pci 0000:03:00.0: AMD_POLARIS10: performing reset
vfio-pci 0000:03:00.0: AMD_POLARIS10: GPU pci config reset
vfio-pci 0000:03:00.0: AMD_POLARIS10: performing post-reset
vfio-pci 0000:03:00.0: AMD_POLARIS10: reset result = 0

根据您所拥有的 GPU 类型,可能需要进行一些调整,您需要安装您的 EFI 磁盘并在您首选的 OpenCore 配置编辑器中打开此文件。

AMD 用户

EFI/OC/config.plist

安装您的 EFI 驱动器并在 OpenCore Configurator 中打开文件。

启动参数位于NVRAM ->7C436110-AB2A-4BBB-A880-FE41995C9F82

AMD RX 5000 和 6000 系列需要以下启动参数才能获得正确的输出。agdpmod=pikera

当您拥有 Nvidia 的任何 GTX 600 或 700 系列时才使用 OpenCore Legacy Patcher,因为该系列是唯一与 macOS 兼容的系列。

AMD RX 400/500 和 RX 5000/6000 系列不需要任何修补,因为它们是原生卡。

Nvidia 用户

EFI/OC/config.plist
boot-args 进入
NVRAM -> 7C436110-AB2A-4BBB-A880-FE41995C9F82
amfi=0x80
AMFI 已启用
ngfxcompat=1
强制兼容属性缺失
ngfxgl=1
强制 OpenGL 属性缺失
nvda_drv_vrl=1
nvda_drv(_vrl) 变量缺失

要解决 SIP 错误,请将 csr-active-config 更改为 030A0000
重新启动后,从启动选择器中选择重置 NVRAM。

提醒!如果您拥有 Nvidia 的任何 GTX 600 或 700 系列,则仅使用 OpenCore Legacy Patcher,因为该系列是唯一与 macOS 兼容的系列。

如果您使用 OCLP 并遇到这些错误,这可以解决问题;

要解决 SIP 错误,请将 csr-active-config 更改为 030A0000
重新启动后,从启动选择器中选择重置 NVRAM。

发表评论

滚动至顶部