VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
  • 使用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显卡驱动。

__EOF__


  • 本文作者: kagamirr
  • 本文链接: https://www.cnblogs.com/kagamirr/p/15451409.htm
    l

    
    相关教程