在BIOS开启VT-x、VT-D等你觉得需要开启的功能,开启iGFX核心显卡,DVMT显存64M即可 (后续会解释),并且建议使用UEFI启动。
编辑 /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
,重启电脑使其生效。
首先确定你的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_4
和 i915-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 memory | i915-GVTg_V5_1 | i915-GVTg_V5_2 | i915-GVTg_V5_4 | i915-GVTg_V5_8 |
---|---|---|---|---|---|
UHD630 | 256M | 0 | 0 | 1 | 2 |
UHD630 | 512M | 0 | 1 | 3 | 6 |
UHD630 | 1024M | 1 | 2 | 4 | 8 |
UHD610 | 1024M | 1 | 2 | 4 | 8 |
如果你已经得到了GVT-g的返回值,那么就可以开始对虚拟机添加设备了。操作过程中需要注意以下几点。
点击添加PCI设备,勾选上高级,选择你的核显设备。
再选择 MDev 设备,这里的选项就是刚刚我们的输出值。
从字面意思不难看出,i915-GVTg_V5_4
和 i915-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只支持 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修改法。
下载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厂商使用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了。
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