前言
本文的内容理论上适用于Intel 6-13代的cpu核显(也许支持Intel14代及更高版本)
PVE版本为:Proxmox Virtual Environment 8.0.4
内核版本:Linux6.2.16-6-pve
BIOS默认已经开了虚拟化vt-d, iommu相关直通设置,没开的自己进BIOS设置
本文内容的介绍是基于你已经安装了PVE并开启了iommu直通基础上介绍(下文也会附上开启iommu方式)
如果你还没有安装PVE,可以参考我前几期的教程附上链接:
Proxmox(PVE)系统环境搭建安装教程:https://imacos.top/2023/07/18/pve/
PVE下如何启用 PCI直通显卡GPU/iGPU/USB/声卡AUDIO等硬件直通教程:https://imacos.top/2023/07/31/pci/
PVE下macOS苹果系统PCI直通AMD 580显卡硬件直通实例提取显卡rom教程:https://imacos.top/2023/08/01/580/
操作流程概览图:
工具
AFUWIN5.12(win10完美运行)
balenaEtcher
winpe.dmg
UBU 1.79.17
PlatformGOPPolicy.ffs
ffs工具
MMTool
winscp/Transmit
vbios_gvt_uefi.rom
所有工具在本文下载地址中,如果你使用的是i7 9700,可以直接使用已经修改好的文件。
视频教程
UEFI启动点亮显示器的原理
1.独立显卡亮机原理:
如果电脑有一张独显,显示器接在独显上,电脑采用UEFI固件引导,从开机通电到点亮屏幕,电脑启动的流程为:主板UEFI从显卡VBIOS中读取GOP固件,并利用GOP固件驱动独显,点亮屏幕。之后加载操作系统,显卡被驱动接管。相对来说,独立显卡在PVE下直通点亮屏幕要容易些,前期我也出过提取独立显卡的rom,虚拟机通过加载rom实现点亮屏幕,附上链接:
2.核显亮机原理:
如果电脑有只有核显,你的显示器接在核显上,电脑采用UEFI固件引导,从开机通电到点亮屏幕,电脑启动的流程为:主板UEFI为核显初始化内存空间,读取内置的GOP固件,并利用GOP固件驱动核显,点亮屏幕。之后加载操作系统,显卡被驱动接管。
3.PVE虚拟机亮机原理:
虚拟机开机后,主板UEFI不会为核显初始化内存空间,并尝试读取内置的GOP固件,但虚拟机的UEFI没有GOP固件,加之没有初始化内存空间,无法点亮屏幕。之后加载操作系统,显卡被驱动接管,操作系统的显卡驱动重新初始化内存空间并驱动屏幕。因此屏幕会在操作系统驱动加载后启动。这也就是为什么网上有很多教程是进系统添加显卡驱动才可以点亮屏幕。
如果我们想要虚拟机UEFI点亮核显连接的屏幕,就需要按照上述方式,为核显外挂VBIOS初始化内存空间,并为虚拟机的UEFI集成GOP固件。核显外挂VBIOS初始化内存空间,主板UEFI读取内置的GOP固件,并利用GOP固件驱动显卡,点亮屏幕。之后加载操作系统,显卡被驱动接管。
核显外挂VBIOS已是一个十分成熟的技术,因此我们的重点就是为虚拟机的UEFI集成GOP固件。
获取 BIOS
并提取 VBT/GOP
编译
1.获取物理机BIOS
如果你的电脑设备型号官网提供bios下载,请直接下载使用(无需提取设备的bios)
如果你的设备官网不提供bios下载(或者你找不到同设备的bios),那就使用AFUWIN5.12提取设备bios
建议使用AFUWIN5.12(win10完美运行)版本,下载后并在win10系统(已经测试在winpe也行)上提取bios,运行软件点下存储就可以。因为软件是win10或winpe环境才可以运行,所以你需要在设备上安装个win10或者用winpe系统环境下运行提取。不管是安装win10或者用winpe系统都比较简单,我这里就不介绍安装方式了。下载文件中包含了winpe的dmg文件,可以使用balenaEtcher写入到你的U盘中使用。(AFUWIN软件运行经过我测试,他不支持根目录文件夹名称有中文字符的情况运行,所以我们将文件夹重新命名为英文字符)
在win10上运行这个软件点“储存”就能获取物理机的bios文件
把存储的bios文件命名为bios.rom
2.从bios.rom中提取intel核显相关的IntelGopDriver.efi和vbt.bin模块
把下载UBU 1.79.17工具解压,把存储的bios.rom拷贝进ubu软件目录下(直接网站下载的bios不需要命名拉进ubu目录)
接着运行UBU.bat(如果显示卡住不动的话多敲两次回车或者空格),打开你下载的BIOS文件。(如果UBU.bat程序cmd中没找到或者检测到bios,需要手动选择打开bios文件)

UBU会自动分析你的bios文件。
根据提示按2,再按S提取VBT和GOP。GOP如上文所说的,是用于UEFI固件点亮显示器的。VBT是用于传统BIOS模式的。为了更好的兼容性,这里我们选择同时集成两个文件。
在ubu的Extracted目录下有个GOP文件夹,里面最终目录分别有IntelGopDriver.efi文件和vbt.bin文件。这两个文件就是我们需要的IntelGopDriver.efi和vbt.bin。
3.IntelGopDriver.efi和vbt.bin文件分别转ffs
打开并解压ffs工具,把IntelGopDriver.efi和vbt.bin文件拷贝进ffs的目录下
目录中PlatformGOPPolicy.ffs文件也在本文下载地址中下载,下载好也一起放到ffs目录下:
Windows系统下打开cmd(或者powershell都行),进入到ffs目录下运行下面两个命令:
我这里开的powershell运行的命令。
.\GenMod.cmd .\IntelGopDriver.efi

.\GenMod.cmd .\vbt.bin
运行之后,ffs目录下会得到IntelGopDriver.ffs和vbt.ffs这两个文件。
确认你的ffs目录下有下图这些文件,IntelGopDriver.ffs、PlatformGOPPolicy.ffs和vbt.ffs,这3个文件分别是:编译过的GOP段,加载GOP需要的段和VBT段。
4.使用MMTool工具定制你的OVMF_CODE
把pve里面的OVMF_CODE拷贝出来,win下可以用winscp软件,Mac下可使用Transmit软件等,进入PVE的目录 /usr/share/pve-edk2-firmware,把里面的1.87M的OVMF_CODE.fd拷贝到本地,如果要用到安全引导,下载OVMF_CODE_4M.fd 和 OVMF_CODE_4M.secboot.fd 4M的两个。
我们这里保险起见,将OVMF_CODE.fd、OVMF_CODE_4M.fd 和 OVMF_CODE_4M.secboot.fd同步拷贝出来,拷贝出来后记得备一份,防止后续修改失误备用,需要将IntelGopDriver.ffs、PlatformGOPPolicy.ffs和vbt.ffs插入这三个.fd文件中。
接下来用mmtool打开OVMF_CODE.fd,在卷索引02:00-00按顺序插入3个文件(IntelGopDriver.ffs、PlatformGOPPolicy.ffs和vbt.ffs),插入选项选择不压缩,按照下图操作即可。
注意别忘了保存映像文件,最好直接“另存为”出去,另两个OVMF_CODE_4M.fd 和 OVMF_CODE_4M.secboot.fd也如法炮制。
最后将文件复制回PVE并替换原有文件,同时将下载的vbios_gvt_uefi.rom 也上传到PVE的 /usr/share/kvm/ 目录下。
PVE开启iommu直通
1.打开PVE节点的shell,输入命令:
要忽略 dmesg 输出中的一些烦人的错误, 请运行以下命令(# 这一步对于直通来说不是必需的,但有助于保持干净。)
nano /etc/modprobe.d/kvm.conf options kvm ignore_msrs=Y report_ignored_msrs=0 # 按 Ctrl + X,然后按 Y + Enter 保存更改。
2.启动内核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 允许将此空间映射到内存以便更简单地访问。
3.使用以下命令更新 grub
update-grub
更新后可以重启电脑
4.主机启动并运行后,运行以下命令,验证是否开启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 # 出现很多直通组,就代表成功了。如果没有任何东西,就是没有开启
5.对于某些平台,可能需要允许不安全中断。运行以下命令
nano /etc/modprobe.d/iommu_unsafe_interrupts.conf # 添加以下行;请注意,此选项可能会使您的系统不稳定。 options vfio_iommu_type1 allow_unsafe_interrupts=1
6.启用必要的内核模块,运行以下命令
nano /etc/modules # 添加以下行; vfio vfio_iommu_type1 vfio_pci vfio_virqfd
7.更改任何相关模块后,您需要刷新 initramfs。 运行以下命令
update-initramfs -u -k all
8.现在检查是否已启用重新映射, 运行以下命令
dmesg | grep remapping # 应该输出类似这样的内容; “AMD-Vi: Interrupt remapping enabled” “DMAR-IR: Enabled IRQ remapping in x2apic mode” # 'x2apic' 在旧 CPU 上可能有所不同,但应该仍然可以工作。
9.将驱动程序模块列入黑名单,以使虚拟机能够完全访问显卡等。运行以下命令
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
10.重新启动主机以应用更改
reboot
11.注意:
我这里分享一下我在直通的时候遇到的一个问题,大家一定要注意,我们在没有做PVE直通的操作前,PVE画面的输出是会显示像这张图片上的样式
有PVE登录的IP地址,一旦你做了PVE直通的操作后,重启PVE,如果直通操作成功的话,是一定不会看到PVE登录的IP地址,我这里,操作直通成功重启后的画面是如下图这样的
也许你的直通操作成功后,画面样式与我的会有一定的区别,但是请记住,如果你操作直通后通过上述介绍的,在PVE的Shell节点下验证成功了,但是PVE开机画面还是会显示登录的IP地址,这种情况一定是直通的启动内核IOMMU支持代码不对,换一种写法继续尝试,直到PVE重启看不到登录的IP地址才算成功。
虚拟机创建注意事项
1.【重要】准备事项提醒
正如前言说的一样,本文是基于你已经安装了PVE基础上介绍
如果你还没有安装PVE,可以参考我前几期的教程附上链接:
Proxmox(PVE)系统环境搭建安装教程:https://imacos.top/2023/07/18/pve/
PVE下如何启用 PCI直通显卡GPU/iGPU/USB/声卡AUDIO等硬件直通教程:https://imacos.top/2023/07/31/pci/
PVE下macOS苹果系统PCI直通AMD 580显卡硬件直通实例提取显卡rom教程:https://imacos.top/2023/08/01/580/
2.关于虚拟机创建配置
直通Intel核显
所选的虚拟机类型必须为i440fx 7.2版本或者最新以上机型(不能选q35!)
系统类型必须为Linux(一定不要选Windows,否则Windows系统装驱动后会可能会出现冻屏死机,二者传递的虚拟CPU参数不同)
固件类型选择ovmf UEFI
TPM选择开启,安全启动随意
CPU类型选HOST,否则可能会出现装不上驱动
光驱选择ide,硬盘选择sata硬盘或者也可以scsi(选择ide和sata是为了核显直通打游戏需要,你也可以坚持选其他),其他保持默认设置
创建后进入Options,打开QEMUGuestAgent和UseLocalTimeforUTC以获得更好体验
3.直通虚拟机环境设置
虚拟机创建后先不要启动,为创建的虚拟机添加核显pcie,将显示设置为无 none。并同时添加负责声音的pcie设备。在PVE的SHell节点下执行命令
nano /etc/pve/qemu-server/200.conf
200是你创建直通核显虚拟机的ID
进入后在配置文件中增加一行,这行用于设置核显额外参数,包括把设备地址设置为02.0,设置x-igd-gms大小并启用x-igd-opregion。
args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=1 -set device.hostpci0.x-igd-opregion=on
同时修改hostpci0开头的这一行,这行用于添加核显,开启 legacy-igd 模式,加载 romfile。
hostpci0: 0000:00:02,legacy-igd=1,romfile=vbios_gvt_uefi.rom
然后,一定记得把虚拟机的 显卡改为 None,避免虚拟显卡和直通的核显争抢总线地址。
这里上一下我完整的虚拟机配置,可以参考一下
agent: 1 args: -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=6 -set device.hostpci0.x-igd-opregion=on balloon: 0 bios: ovmf cores: 8 cpu: host efidisk0: local:200/vm-200-disk-0.qcow2,efitype=4m,pre-enrolled-keys=1,size=528K hookscript: local:snippets/hooks-igpupt.pl hostpci0: 0000:00:02,legacy-igd=1,romfile=vbios_gvt_uefi.rom kvm: 1 localtime: 1 memory: 32768 meta: creation-qemu=8.0.2,ctime=1690013047 name: WinDE net0: virtio=C2:38:CF:B1:8C:F8,bridge=vmbr0,firewall=1 numa: 0 ostype: l26 scsihw: virtio-scsi-single smbios1: uuid=b99591a9-ec26-4171-9754-da593fa04e70 sockets: 1 startup: up=5 tablet: 0 tpmstate0: local:200/vm-200-disk-1.raw,size=4M,version=v2.0 vga: none vmgenid: 20ae49f0-385a-4bcb-a14c-13e96af30625
启动虚拟机后,正常就可以看到PVE BIOS的开机画面,此时你可直通USB键盘,并按ESC进入UEFI设置,所有直通的操作就完成了。
4.补充拓展独立使用OVMF_CODE.fd文件直通
其实本文介绍的这种方式,还有另外一种使用方法,就是在上述讲解的步骤中,只用修改OVMF_CODE.fd这一个文件,这种方式可以将修改好的OVMF_CODE.fd上传到放在pve系统的 root目录下
将虚拟机的配置文件第一行修改为如下所示
args: -bios /root/OVMF_CODE.fd -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on
删除 bios: ovmf 这一行,代表不使用pve自带的bios,其他的配置不变
这里上一下我完整的虚拟机配置,可以参考一下
agent: 1 args: -bios /root/OVMF_CODE.fd -set device.hostpci0.addr=02.0 -set device.hostpci0.x-igd-gms=0x2 -set device.hostpci0.x-igd-opregion=on balloon: 0 bios: ovmf cores: 8 cpu: host efidisk0: local:200/vm-200-disk-0.qcow2,efitype=4m,pre-enrolled-keys=1,size=528K hookscript: local:snippets/hooks-igpupt.pl hostpci0: 0000:00:02,legacy-igd=1,romfile=vbios_gvt_uefi.rom kvm: 1 localtime: 1 memory: 32768 meta: creation-qemu=8.0.2,ctime=1690013047 name: WinDE net0: virtio=C2:38:CF:B1:8C:F8,bridge=vmbr0,firewall=1 numa: 0 ostype: l26 scsihw: virtio-scsi-single smbios1: uuid=b99591a9-ec26-4171-9754-da593fa04e70 sockets: 1 startup: up=5 tablet: 0 tpmstate0: local:200/vm-200-disk-1.raw,size=4M,version=v2.0 vga: none vmgenid: 20ae49f0-385a-4bcb-a14c-13e96af30625
这种方式的好处是可以不用替换原有的OVMF_CODE.fd、OVMF_CODE_4M.fd 和 OVMF_CODE_4M.secboot.fd文件.
结束语
正常情况操作完后,不管后续要安装Liunx、win、mac或其他系统,直通出画面就都没有问题了,只不过安装不同的操纵系统,在配置上会有一定的变动。
关于win系统安装,我自己测试的安装成功后,直接安装显卡驱动,没有什么问题,显卡工作正常。win系统安装请看我之前发布的教程(https://imacos.top/2023/09/07/pve-windows-11/)
关于黑苹果系统的安装,前期给大家介绍PVE安装macOS系统(https://imacos.top/2023/07/29/pve-macos/),机型选择的是q35,但是本文介绍的核显直通必须选择i440fx,经过站长的测试,选择i440fx也一样可以安装macOS系统,大致思路就是将dmg带OC引导的镜像写入U盘中,直接直通U盘后使用U盘安装,这种方式与安装黑苹果的方式完全一致。具体详细的教程,预计后续会出一期,专门来讲这个点。
文件解压密码:imacos.top
评论0