使用GVT-g為KVM添加虛擬顯卡渲染3D圖形


0x00 前言

可以在KVM虛擬機看電影、玩游戲哦。

我的環境如下:

  • Kernel: 5.14.12-arch1-1
  • CPU: Intel i5-8250U
  • GPU: Intel UHD Graphics 620
  • QEMU: 6.1.0

0x01 啟動GVT-g

1. 添加內核參數

要啟用IOMMU、i915,編輯grub文件:

$ sudo vim /etc/default/grub

找到GRUB_CMDLINE_LINUX_DEFAULT的參數,在后面添加intel_iommu=oni915.enable_guc=0

GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 intel_iommu=on i915.enable_guc=0"

2. 啟用內核模塊

要啟用kvmgtvfio-iommu-typ1mdev

$ sudo modprobe kvmgt vfio-iommu-type1 mdev

3. 添加內核模塊參數

/etc/modprobe.d/目錄下創建配置文件來打開GPU虛擬化

$ sudo echo "options i915 enable_gvt=1" >> /etc/modprobe.d/gvt-g.conf

至此,重新啟動系統。

$ reboot

4. 查詢顯卡的GUID

$ lspci -D -nn

找到顯卡的GUID,例如 0000:00:02.0

5. 查看mdev支持的類型

$ ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
i915-GVTg_V5_4  i915-GVTg_V5_8

例如,顯示如下兩個文件夾,說明啟動成功

i915-GVTg_V5_4  i915-GVTg_V5_8

若文件夾為空說明GVT-g沒有成功啟動。

進入對應目錄,查看description文件獲取信息

$ cat /sys/bus/pci/devices/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

說明i915-GVTg_V5_4最大支持分辨率1920x1200,顯存占用128MB~512MB。

Arch wiki還描述了其他類型:

i915-GVTg_V5_1 # Video memory: <512MB, 2048MB>, resolution: up to 1920x1200
i915-GVTg_V5_2 # Video memory: <256MB, 1024MB>, resolution: up to 1920x1200
i915-GVTg_V5_4 # Video memory: <128MB, 512MB>, resolution: up to 1920x1200
i915-GVTg_V5_8 # Video memory: <64MB, 384MB>, resolution: up to 1024x768

6. 創建一個虛擬GPU設備

使用

$ uuidgen
7d6cff35-231d-4ad2-a9b7-aa53d4d51b1f

來生成一個UUID,用它來標識新建的虛擬顯卡

創建設備,這里我選擇i915-GVTg_V5_4:

$ echo "7d6cff35-231d-4ad2-a9b7-aa53d4d51b1f" > "/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"

其中GUID編號mdev類型根據實際情況修改。

0x02 創建虛擬機

1. 使用通常方法創建一個普通虛擬機

使用virtio設備。虛擬機命名為vmname。

2. 添加虛擬顯卡

使用

$ virsh edit vmname

vmname替換成創建虛擬機的名稱,在<devices>元素中添加

    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'>
      <source>
        <address uuid='7d6cff35-231d-4ad2-a9b7-aa53d4d51b1f'/>
      </source>
    </hostdev>

uuid要修改成創建虛擬顯卡的UUID

3. 圖像顯示設置

找到<graphics><video>元素,刪除默認,修改為:

    <graphics type='spice'>
      <listen type='none'/>
      <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
    </graphics>
    <video>
      <model type='none'/>
    </video>

pci-后面編號根據實際情況修改。

接着,修改

<domain type='kvm'>

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

<domain>元素中,在</domain>上方添加:

  <qemu:commandline>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.ramfb=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.display=on'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.driver=vfio-pci-nohotplug'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.xres=1920'/>
    <qemu:arg value='-set'/>
    <qemu:arg value='device.hostdev0.yres=1080'/>
  </qemu:commandline>

device.hostdev0.xresdevice.hostdev0.yres選項可根據需要調整分辨率,要小於mdev支持的分辨率。

之后啟動虛擬機看看。

4. GVT-g自動啟動

為了每次啟動虛擬都自動啟動虛擬顯卡,故使用qemu的hook功能。

創建/etc/libvirt/hooks/目錄。創建qemu文件,內容如下:

#!/bin/bash
GVT_PCI="0000:00:02.0"
GVT_GUID="7d6cff35-231d-4ad2-a9b7-aa53d4d51b1f"
MDEV_TYPE="i915-GVTg_V5_4"
DOMAIN="vmname"
if [ $# -ge 3 ]; then
    if [ $1 = "$DOMAIN" -a $2 = "prepare" -a $3 = "begin" ]; then
        echo "$GVT_GUID" > "/sys/bus/pci/devices/$GVT_PCI/mdev_supported_types/$MDEV_TYPE/create"
    elif [ $1 = "$DOMAIN" -a $2 = "release" -a $3 = "end" ]; then
        echo 1 > /sys/bus/pci/devices/$GVT_PCI/$GVT_GUID/remove
    fi
fi

其中變量根據實際情況修改

0x03 尾聲

在windows中安裝virtio客戶端程序。

硬件管理器里面更新顯卡驅動,來獲得intel顯卡驅動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM