基于Intel GVT-g技術(shù)實(shí)現(xiàn)gpu虛擬化

在虛擬化領(lǐng)域,gpu的虛擬化是一個(gè)很頭疼的問(wèn)題,因?yàn)楦黠@卡廠家的gpu虛擬化方案各不相同,導(dǎo)致必須得針對(duì)每種方案做個(gè)性化處理,從宏觀上看,有3種虛擬化模式

  1. passthrough直通模式
    在直通模式下,顯卡硬件完全由1個(gè)虛擬機(jī)獨(dú)占,宿主機(jī)無(wú)法使用此設(shè)備,也無(wú)法提供給多個(gè)虛擬機(jī)使用
  2. 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)極差
  3. 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
  1. 首先,升級(jí)主板bios為最新版本(成文時(shí)為3004),此操作非必需,但強(qiáng)烈建議以避免出現(xiàn)各種無(wú)意義的坑。
  2. 確認(rèn)bios已正確開(kāi)啟虛擬化支持,bios界面,Advanced Mode模式,Advanced => CPU Configuration,設(shè)置Intel Virtulazition Technology為Enabled。
  3. 配置內(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)存在
  1. 加載必需的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已被加載

  1. 創(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
vGPU類型查看.png.png

此時(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)有空間”的提示

vGPU的創(chuàng)建與刪除.png
  1. 創(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)顯卡虛擬化

虛擬機(jī)內(nèi)pci設(shè)備信息.png

終于寫完一版了,同時(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)證,也查了不少資料,將最為重要的羅列一下:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容