keiko blog
Load MMD

Intel GVT-g 显卡虚拟化技术体验

GVT-g在Proxmox VE下的使用,还可以修改BIOS获得新姿势。

Intel GVT-g 显卡虚拟化技术体验

第一步、修改BIOS选项

在BIOS开启VT-x、VT-D等你觉得需要开启的功能,开启iGFX核心显卡,DVMT显存64M即可 (后续会解释),并且建议使用UEFI启动。

第二步、修改GRUB启动项

启用iommu、GVT-g

编辑 /etc/default/grub ,找到 GRUB_CMDLINE_LINUX_DEFAULT ,并添加 intel_iommu=on i915.enable_gvt=1 选项,修改完成后如下。

shell
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_gvt=1"

更近一步可以添加 video=vesafb:off video=efifb:off video=simplefb:off 屏蔽显示输出。

shell
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_gvt=1 video=vesafb:off video=efifb:off video=simplefb:off"

保存后shell输入 update-grub 更新 GRUB。

加载直通相关的内核模块

复制后到shell中运行即可。

shell
echo vfio >> /etc/modules
echo vfio_iommu_type1 >> /etc/modules
echo vfio_pci >> /etc/modules
echo vfio_virqfd >> /etc/modules
echo kvmgt >> /etc/modules

最后使用 update-initramfs -u,重启电脑使其生效。

第三步、开机检查

验证 GVT-g 是否开启

首先确定你的PCI设备ID,一般情况下Intel核显都是 0000:00:02.0,不确定的可以使用 lspci 查看,你需要输入 ls /sys/bus/pci/devices/<你的PCI ID>/mdev_supported_types/

如果你的设备为UHD630,无误的情况下你将看到下面的结果。

shell
root@pve:~# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
i915-GVTg_V5_4	i915-GVTg_V5_8

这里需要解释一下

如果你的设备是UHD630,那么一般情况你将和我一样看到 i915-GVTg_V5_4i915-GVTg_V5_8,这两个结果。

如果你的设备是UHD610,那么你应该可以看到 i915-GVTg_V5_1 i915-GVTg_V5_2 i915-GVTg_V5_4 i915-GVTg_V5_8 这四种设备。

原因是Intel给UHD610设备分配了1024M的 Aperture memory size,而UHD630只有256M。注意这里的 Aperture memory size 并不是BIOS中的 DVMT Gfx Mem 动态显存,两者不是一个东西。而一般厂商的BIOS不会给用户修改 Aperture memory size 的权限,所以在文末我会提供一些小技巧教大家修改 Aperture memory size 让UHD630获取更多的MDev类型。

经过我的测试,不同设备的Aperture memory size和支持的vGPU数量整理出以下表格。

显卡Aperture memoryi915-GVTg_V5_1i915-GVTg_V5_2i915-GVTg_V5_4i915-GVTg_V5_8
UHD630256M0012
UHD630512M0136
UHD6301024M1248
UHD6101024M1248

第四步、创建MDev设备

如果你已经得到了GVT-g的返回值,那么就可以开始对虚拟机添加设备了。操作过程中需要注意以下几点。

  1. 虚拟机需要BIOS需要设置为UEFI;
  2. 机型需要设置为q35;

点击添加PCI设备,勾选上高级,选择你的核显设备。

再选择 MDev 设备,这里的选项就是刚刚我们的输出值。

从字面意思不难看出,i915-GVTg_V5_4i915-GVTg_V5_8 是存在性能差别的,而 i915-GVTg_V5_4 明显比 i915-GVTg_V5_8 的规格高出一截。

但是这时候你需要注意,表格中间还有一个可用数量,一般来说UHD630支持一个 i915-GVTg_V5_4 或者两个 i915-GVTg_V5_8。我认为如果只用一个 i915-GVTg_V5_8 设备我还不如核显直通给一个机器,这样性能反而更好。所以我选择使用 i915-GVTg_V5_4,这样我就可以获得两个虚拟GPU了。

最后,别忘记勾选 PCI-Express

第五步、安装驱动使用

完成以上操作后,直接开机就可以使用了,Windows用户需要安装驱动,驱动从官网下载即可,Linux用户也是直接安装官方的驱动即可。

番外篇、UHD630获取更多MDev

上面我提到过,UHD630只支持 i915-GVTg_V5_4 i915-GVTg_V5_8 两种虚拟GPU,而性能更低的UHD610支持 i915-GVTg_V5_1 i915-GVTg_V5_2 i915-GVTg_V5_4 i915-GVTg_V5_8 四种虚拟GPU,且同规格下可以分配的数量更多,显然这是非常不合理的。

我们需要对 Aperture memory size 进行修改。但是大部分厂商都隐藏了相关设置,目前已知的有精粤H610i和部分Intel NUC开启了用户修改权限。

修改 Aperture memory size 有两种方法,分别是OEM厂商BIOS修改法和AMI公版BIOS修改法。

AMI公版BIOS

下载AMIBCP软件运行。

工具名下载链接
AMIBCP本站缓存

打开软件后,点击左上角的File->Open打开你的BIOS文件,在Setup configuration中找到 Aperture memory size 选项。由于每一个OEM厂商会对BIOS进行不同程度的修改,这里我只演示技嘉Z170X Gaming Pro 3的路径。

在根菜单中展开Setup。

找到 System Agent (SA) Configuration 并展开。可以看到 Graphics Configuration,点击它即可在右侧的编辑区编辑。

找到 Aperture Size 选项,我们可以看到默认为256M,和意料中的一样。

部分主板在1024M或以上会无法启动,我这里我修改为1024M。需要注意两项都需要修改。

当然你可以进一步修改用户权限为USER,这样我们不用每次都是用软件而直接在BIOS就可以直接对他进行修改。需要注意的是,你要确保上级菜单也是USER权限,不然将无法显示下级菜单的内容。

到这里就修改为完成啦,点击左上角File->Save as另存为一份,稍后刷入即可食用。

OEM厂商BIOS

由于直接对OEM厂商使用AMIBCP修改BIOS可能会造成无法启动等问题,而 Aperture memory size 始终只是被隐藏起来的一个选项,我们可以直接在本机修改。

我们需要用到带有setup_var的GRUB,https://github.com/datasone/grub-mod-setup_var;

还有UEFITool,https://github.com/LongSoft/UEFITool;

以及IRFExtractor,https://github.com/LongSoft/Universal-IFR-Extractor/releases/tag/v0.3.6

GRUB下载后我们拷贝到U盘FAT32分区/EFI/BOOT的路径下,并改名bootx64.efi

接着使用UEFITool打开你的BIOS文件,Ctrl+F点击Text栏,搜索aperture。

在下方可以看到搜索结果,双击后定位位置。

右键定位到的选项,点击Extract Body,保存。

使用IRFExtractor打开导出的efi文件,保存为txt。

使用编辑器打开刚刚导出的txt,搜索Aperture。

这里我们可以看到 Aperture size 的 VarStoreInfo 为 Ox6FA ,且 VarStore 值为 0x1。再从下方的 One Of Option 选项可以看得出 VarStore 值为 0x1 就是256M大小,这里我们准备修改为 0x7 也就是 1024M。

目标已经非常明确,修改 Ox6FA 为 0x7。

插上刚刚准备好的U盘,开机进入GRUB命令行,输入 setup_var Ox6FA 0x7 即可完成修改,重起生效。

验证成果

这时候我们可以进系统使用 lspci -vs 00:02.0 查看GPU信息。

看到 Memory at 80000000 (64-bit, prefetchable) [size=1G] 就说明修改成功了。

1024M显存就可以使用全部的VGPU了。

shell
root@pve:~# ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
i915-GVTg_V5_1	i915-GVTg_V5_2	i915-GVTg_V5_4	i915-GVTg_V5_8