跳至主要內容

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

keiko233大约 6 分钟

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

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

第一步、修改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 选项,修改完成后如下。

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

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

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中运行即可。

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,无误的情况下你将看到下面的结果。

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设备,勾选上高级,选择你的核显设备。

alt image

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

alt image

从字面意思不难看出,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用户也是直接安装官方的驱动即可。

alt image

番外篇、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。

alt image

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

alt image

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

alt image

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

alt image

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

alt image

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

OEM厂商BIOS

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

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

还有UEFITool,https://github.com/LongSoft/UEFITool;open in new window

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

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

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

alt image

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

alt image

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

alt image

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

alt image

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

alt image

这里我们可以看到 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信息。

alt image

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

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

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
上次编辑于:
贡献者: keiko233