基于Intel GVT-g技术实现gpu虚拟化

在虚拟化领域,gpu的虚拟化是一个很头疼的问题,因为各显卡厂家的gpu虚拟化方案各不相同,导致必须得针对每种方案做个性化处理,从宏观上看,有3种虚拟化模式

  1. passthrough直通模式
    在直通模式下,显卡硬件完全由1个虚拟机独占,宿主机无法使用此设备,也无法提供给多个虚拟机使用
  2. virtio-gpu模式
    严格意义上,这不属于gpu虚拟化方案,virtio-gpu是一种GPU分时复用方案,优点是具有通用性,缺点是因为GPU需要处理更多的请求,调度上的损耗大,牺牲了较多GPU的性能,导致在使用3D渲染等场景下表现极差
  3. vGPU模式
    通过显卡硬件及驱动的支持,将1个显卡拆分成多个虚拟显卡,虚拟机内使用的是虚拟显卡,此时可以实现多个虚拟机及宿主机共用一块物理显卡

大多数场景下,如果要满足3D渲染需要,vGPU模式是不二之选,但是,Nvidia、AMD和Intel各自的方案又彼此不同,且依旧在不断的技术演进中,对于期望轻量3D渲染的场景,直接利用Intel CPU内置的GPU来实现可以理解为是最实惠的方案。

Intel的gpu虚拟化技术,也因架构的升级而经历了从GVT-g到SR-IOV的发展,从6代Skylake到11代Rocket Lake架构,采用的是GVT-g,而从11代的Tiger Lake后,采用的则是SR-IOV。具体的支持信息可以从网址https://www.intel.com/content/www/us/en/support/articles/000093216/graphics.html获得

intel关于GVT-g的项目地址是https://github.com/intel/gvt-linux,可以从其wikihttps://github.com/intel/gvt-linux/wiki/GVTg_Setup_Guide中获取到较多的安装及操作信息

本文讲述在linux环境下,利用qemu + GVT-g技术实现虚拟机内对intel gpu的支持,本文内容的验证环境是:

  • Asus PRIME Z370-A
  • Intel i7-8700
  • Fedora 37
  • QEMU x86_64 7.2.0
  1. 首先,升级主板bios为最新版本(成文时为3004),此操作非必需,但强烈建议以避免出现各种无意义的坑。
  2. 确认bios已正确开启虚拟化支持,bios界面,Advanced Mode模式,Advanced => CPU Configuration,设置Intel Virtulazition Technology为Enabled。
  3. 配置内核参数
    因为Fedora 37使用的是6.0+内核,已经包含了对intel gvt-g的支持,故不再需要自行构建内核,只需要添加内核参数即可,具体操作为:
  • 修改/etc/default/grub中GRUB_CMDLINE_LINUX条目,在原有参数基础上添加如下参数i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=igfx_off
  • 执行命令,grub2-mkconfig -o /boot/grub2/grub.cfg,以重建grub.cfg配置文件
  • 重启操作系统,执行dmesg | grep "Command line" 确认添加的参数已经存在
  1. 加载必需的kernel module
    实测加载模块并不需要通过dracut重新生成/boot/initramfs.img来完成,只需要将模块列表以配置文件形式添加到/etc/modules-load.d目录下即可
cat <<EOF>/etc/modules-load.d/gvt-g.conf
vfio
mdev
kvmgt
vfio_iommu_type1
vfio_virqfd
vfio_pci
EOF

重启机器,通过lsmod确认上述module已被加载

  1. 创建vGPU
    在修改内核启动参数及加载必需模块后,我们能够在内核目录/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types看到所支持的vGPU类型,支持类型和硬件及bios有关,ASUS Z370-A缺省支持2种类型:
[root@fedora ~]# ls -lF /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types
total 0
drwxr-xr-x. 3 root root 0  4月15日 12:05 i915-GVTg_V5_4/
drwxr-xr-x. 3 root root 0  4月15日 12:05 i915-GVTg_V5_8/

i915-GVTg_V5_4是vGPU的类型名称。名称i915-GVTg_Vx_y用于表示不同的vGPU类型:“x”表示英特尔GPU工艺级别。V4是英特尔GPU GEN8,V5是英特尔GPU GEN9;“y”是类型ID。ID越小,类型拥有的资源就越多。下表中提供了资源映射信息。每种类型也有权重设置。权重值较高的vGPU将获得更多物理GPU时间片

y aperture memory size hidden memory size fence size weight
8 64 384 4 2
4 128 512 4 4
2 256 1024 4 8
1 512 2048 4 16

在每种vGPU类型目录下,均存在description和available_instances文件,前者描述了vGPU的规格,后者说明可创建vGPU的数量

[root@fedora ~]# cat /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/description
low_gm_size: 128MB
high_gm_size: 512MB
fence: 4
resolution: 1920x1200
weight: 4

[root@fedora ~]# cat /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/available_instances
1

[root@fedora ~]# cat /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_8/description
low_gm_size: 64MB
high_gm_size: 384MB
fence: 4
resolution: 1024x768
weight: 2

[root@fedora ~]# cat /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_8/available_instances
2
vGPU类型查看.png.png

此时能够看到,我们可以创建1个最大分辨率为1920x1200或者2个最大分辨率为1024x768的vGPU。
是不是瞬间感觉很鸡肋了?1024x768分辨率太小,而1920x1200则只能创建1个,太太太少了,没问题,预期我形成的下一篇文章会说明如何将这个限制拓宽

我们先来看如何创建vGPU吧,在vGPU类型目录下,还有一个名称为create的具有只写权限的文件,向此文件写入uuid,则会创建对应类型的vGPU设备

uuid可以通过系统命令uuidgen生成,也可以自行设置,但是必需满足uuid规则

创建类型为i915-GVTg_V5_4的vGPU

echo 62039957-a278-4d7a-878c-fb0b522a9c8c > /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create

此时该vGPU设备将出现在/sys/bus/pci/devices/0000:00:02.0/62039957-a278-4d7a-878c-fb0b522a9c8c下,向该设备目录的remove文件写入1,则删除该设备

echo 1 > /sys/bus/pci/devices/0000:00:02.0/62039957-a278-4d7a-878c-fb0b522a9c8c/remove

因为所有vGPU共享同一个物理GPU,可创建vGPU总数受名称为GPU Aperture size的bios参数限制,如本实验机,在创建1个i915-GVTg_V5_4型号的vGPU后,就无法再创建其他vGPU了,此时创建会出现“设备上没有空间”的提示

vGPU的创建与删除.png
  1. 创建虚拟机
    在vGPU准备好后,接下就是创建虚拟机了,因为edk2同igd之间的一些兼容性问题,要做到普适并不是一件很容易的事情,为了更突出本文主题,此处暂以最简单的ubuntu为例来说明可用性,相关运行命令如下
# 生成uuid
uuid=$(uuidgen)
# 创建vGPU
echo ${uuid} > /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create
# 创建磁盘镜像
qemu-img create -f qcow2 system.qcow2 64G

# 运行虚拟机
qemu-system-x86_64 \
 --nodefaults \
 -machine q35,accel=kvm \
 -cpu host \
 -m 8192 -smp 2 \
 -display egl-headless \
 -device vfio-pci-nohotplug,sysfsdev=/sys/bus/pci/devices/0000:00:02.0/${uuid},display=on,x-igd-opregion=on,ramfb=on \
 -display vnc=:0 \
 -cdrom ./ubuntu-22.04.2-desktop-amd64.iso \
 -hda ./system.qcow2 \
 -netdev bridge,id=nic0,br=br0 -device virtio-net-pci,netdev=nic0,mac=52:54:00:12:34:56 \
 -device qemu-xhci -device usb-tablet

# 移除vGPU
echo 1 > /sys/bus/pci/devices/0000:00:02.0/${uuid}/remove

关于此虚拟机,有如下注意点:

  • 使用bios而非uefi模式启动
  • 为摈除缺省硬件干扰,使用了--nodefaults参数
  • 运行时需要mesa-libEGL库的支持
  • 为安装操作系统,当前目录下需要存在ubuntu的系统iso文件ubuntu-22.04.2-desktop-amd64.iso,如已经存在操作系统,则该行可以去除(无光驱)
  • 网络部分使用了网桥模式,设备为br0,需要额外自行创建,如果仅为验证gpu支持,可以去掉此行(无网卡)

安装并进入ubuntu系统后,终端内执行lspci,能够看到00:01.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630],表示已经正确的实现显卡虚拟化

虚拟机内pci设备信息.png

终于写完一版了,同时也遗留了2个问题

  • 在Z370-A主板bios并未将相关参数提供给用户的情况下,如何在一个物理机上支持更多的vGPU?
  • 如何让vGPU支持多种操作系统,尤其是windows操作系统?

后面,如果老苍子有精力,会就这两个话题分享一下我的进展信息

为了写完这篇文章,做了很多验证,也查了不少资料,将最为重要的罗列一下:

老苍子,完稿于2023年4月17日

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容