在虛擬化領(lǐng)域,gpu的虛擬化是一個(gè)很頭疼的問(wèn)題,因?yàn)楦黠@卡廠家的gpu虛擬化方案各不相同,導(dǎo)致必須得針對(duì)每種方案做個(gè)性化處理,從宏觀上看,有3種虛擬化模式
- passthrough直通模式
在直通模式下,顯卡硬件完全由1個(gè)虛擬機(jī)獨(dú)占,宿主機(jī)無(wú)法使用此設(shè)備,也無(wú)法提供給多個(gè)虛擬機(jī)使用 - virtio-gpu模式
嚴(yán)格意義上,這不屬于gpu虛擬化方案,virtio-gpu是一種GPU分時(shí)復(fù)用方案,優(yōu)點(diǎn)是具有通用性,缺點(diǎn)是因?yàn)镚PU需要處理更多的請(qǐng)求,調(diào)度上的損耗大,犧牲了較多GPU的性能,導(dǎo)致在使用3D渲染等場(chǎng)景下表現(xiàn)極差 - vGPU模式
通過(guò)顯卡硬件及驅(qū)動(dòng)的支持,將1個(gè)顯卡拆分成多個(gè)虛擬顯卡,虛擬機(jī)內(nèi)使用的是虛擬顯卡,此時(shí)可以實(shí)現(xiàn)多個(gè)虛擬機(jī)及宿主機(jī)共用一塊物理顯卡
大多數(shù)場(chǎng)景下,如果要滿足3D渲染需要,vGPU模式是不二之選,但是,Nvidia、AMD和Intel各自的方案又彼此不同,且依舊在不斷的技術(shù)演進(jìn)中,對(duì)于期望輕量3D渲染的場(chǎng)景,直接利用Intel CPU內(nèi)置的GPU來(lái)實(shí)現(xiàn)可以理解為是最實(shí)惠的方案。
Intel的gpu虛擬化技術(shù),也因架構(gòu)的升級(jí)而經(jīng)歷了從GVT-g到SR-IOV的發(fā)展,從6代Skylake到11代Rocket Lake架構(gòu),采用的是GVT-g,而從11代的Tiger Lake后,采用的則是SR-IOV。具體的支持信息可以從網(wǎng)址https://www.intel.com/content/www/us/en/support/articles/000093216/graphics.html獲得
intel關(guān)于GVT-g的項(xiàng)目地址是https://github.com/intel/gvt-linux,可以從其wikihttps://github.com/intel/gvt-linux/wiki/GVTg_Setup_Guide中獲取到較多的安裝及操作信息
本文講述在linux環(huán)境下,利用qemu + GVT-g技術(shù)實(shí)現(xiàn)虛擬機(jī)內(nèi)對(duì)intel gpu的支持,本文內(nèi)容的驗(yàn)證環(huán)境是:
- Asus PRIME Z370-A
- Intel i7-8700
- Fedora 37
- QEMU x86_64 7.2.0
- 首先,升級(jí)主板bios為最新版本(成文時(shí)為3004),此操作非必需,但強(qiáng)烈建議以避免出現(xiàn)各種無(wú)意義的坑。
- 確認(rèn)bios已正確開(kāi)啟虛擬化支持,bios界面,Advanced Mode模式,Advanced => CPU Configuration,設(shè)置Intel Virtulazition Technology為Enabled。
- 配置內(nèi)核參數(shù)
因?yàn)镕edora 37使用的是6.0+內(nèi)核,已經(jīng)包含了對(duì)intel gvt-g的支持,故不再需要自行構(gòu)建內(nèi)核,只需要添加內(nèi)核參數(shù)即可,具體操作為:
- 修改/etc/default/grub中GRUB_CMDLINE_LINUX條目,在原有參數(shù)基礎(chǔ)上添加如下參數(shù)
i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=igfx_off - 執(zhí)行命令,
grub2-mkconfig -o /boot/grub2/grub.cfg,以重建grub.cfg配置文件 - 重啟操作系統(tǒng),執(zhí)行
dmesg | grep "Command line"確認(rèn)添加的參數(shù)已經(jīng)存在
- 加載必需的kernel module
實(shí)測(cè)加載模塊并不需要通過(guò)dracut重新生成/boot/initramfs.img來(lái)完成,只需要將模塊列表以配置文件形式添加到/etc/modules-load.d目錄下即可
cat <<EOF>/etc/modules-load.d/gvt-g.conf
vfio
mdev
kvmgt
vfio_iommu_type1
vfio_virqfd
vfio_pci
EOF
重啟機(jī)器,通過(guò)lsmod確認(rèn)上述module已被加載
- 創(chuàng)建vGPU
在修改內(nèi)核啟動(dòng)參數(shù)及加載必需模塊后,我們能夠在內(nèi)核目錄/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types看到所支持的vGPU類型,支持類型和硬件及bios有關(guān),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工藝級(jí)別。V4是英特爾GPU GEN8,V5是英特爾GPU GEN9;“y”是類型ID。ID越小,類型擁有的資源就越多。下表中提供了資源映射信息。每種類型也有權(quán)重設(shè)置。權(quán)重值較高的vGPU將獲得更多物理GPU時(shí)間片
| 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的規(guī)格,后者說(shuō)明可創(chuàng)建vGPU的數(shù)量
[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

此時(shí)能夠看到,我們可以創(chuàng)建1個(gè)最大分辨率為1920x1200或者2個(gè)最大分辨率為1024x768的vGPU。
是不是瞬間感覺(jué)很雞肋了?1024x768分辨率太小,而1920x1200則只能創(chuàng)建1個(gè),太太太少了,沒(méi)問(wèn)題,預(yù)期我形成的下一篇文章會(huì)說(shuō)明如何將這個(gè)限制拓寬
我們先來(lái)看如何創(chuàng)建vGPU吧,在vGPU類型目錄下,還有一個(gè)名稱為create的具有只寫權(quán)限的文件,向此文件寫入uuid,則會(huì)創(chuàng)建對(duì)應(yīng)類型的vGPU設(shè)備
uuid可以通過(guò)系統(tǒng)命令uuidgen生成,也可以自行設(shè)置,但是必需滿足uuid規(guī)則
創(chuàng)建類型為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
此時(shí)該vGPU設(shè)備將出現(xiàn)在/sys/bus/pci/devices/0000:00:02.0/62039957-a278-4d7a-878c-fb0b522a9c8c下,向該設(shè)備目錄的remove文件寫入1,則刪除該設(shè)備
echo 1 > /sys/bus/pci/devices/0000:00:02.0/62039957-a278-4d7a-878c-fb0b522a9c8c/remove
因?yàn)樗衯GPU共享同一個(gè)物理GPU,可創(chuàng)建vGPU總數(shù)受名稱為GPU Aperture size的bios參數(shù)限制,如本實(shí)驗(yàn)機(jī),在創(chuàng)建1個(gè)i915-GVTg_V5_4型號(hào)的vGPU后,就無(wú)法再創(chuàng)建其他vGPU了,此時(shí)創(chuàng)建會(huì)出現(xiàn)“設(shè)備上沒(méi)有空間”的提示

- 創(chuàng)建虛擬機(jī)
在vGPU準(zhǔn)備好后,接下就是創(chuàng)建虛擬機(jī)了,因?yàn)閑dk2同igd之間的一些兼容性問(wèn)題,要做到普適并不是一件很容易的事情,為了更突出本文主題,此處暫以最簡(jiǎn)單的ubuntu為例來(lái)說(shuō)明可用性,相關(guān)運(yùn)行命令如下
# 生成uuid
uuid=$(uuidgen)
# 創(chuàng)建vGPU
echo ${uuid} > /sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create
# 創(chuàng)建磁盤鏡像
qemu-img create -f qcow2 system.qcow2 64G
# 運(yùn)行虛擬機(jī)
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
關(guān)于此虛擬機(jī),有如下注意點(diǎn):
- 使用bios而非uefi模式啟動(dòng)
- 為擯除缺省硬件干擾,使用了--nodefaults參數(shù)
- 運(yùn)行時(shí)需要mesa-libEGL庫(kù)的支持
- 為安裝操作系統(tǒng),當(dāng)前目錄下需要存在ubuntu的系統(tǒng)iso文件ubuntu-22.04.2-desktop-amd64.iso,如已經(jīng)存在操作系統(tǒng),則該行可以去除(無(wú)光驅(qū))
- 網(wǎng)絡(luò)部分使用了網(wǎng)橋模式,設(shè)備為br0,需要額外自行創(chuàng)建,如果僅為驗(yàn)證gpu支持,可以去掉此行(無(wú)網(wǎng)卡)
安裝并進(jìn)入ubuntu系統(tǒng)后,終端內(nèi)執(zhí)行l(wèi)spci,能夠看到00:01.0 VGA compatible controller: Intel Corporation CoffeeLake-S GT2 [UHD Graphics 630],表示已經(jīng)正確的實(shí)現(xiàn)顯卡虛擬化

終于寫完一版了,同時(shí)也遺留了2個(gè)問(wèn)題
- 在Z370-A主板bios并未將相關(guān)參數(shù)提供給用戶的情況下,如何在一個(gè)物理機(jī)上支持更多的vGPU?
- 如何讓vGPU支持多種操作系統(tǒng),尤其是windows操作系統(tǒng)?
后面,如果老蒼子有精力,會(huì)就這兩個(gè)話題分享一下我的進(jìn)展信息
為了寫完這篇文章,做了很多驗(yàn)證,也查了不少資料,將最為重要的羅列一下:
- Graphics Virtualization Technologies Support for Each Intel? Graphics Family
- intel GVTg setup guide
- Intel GVT-g technical article from archlinux wiki
老蒼子,完稿于2023年4月17日