使用GVT-g显卡虚拟化

为内核添加参数

比如grub/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT=中添加

intel_iommu=on i915.enable_gvt=1 i915.enable_guc=0

启用modules

/etc/mkinitcpio.conf的MODULES=()`中添加:

# linux 5.14后,arch的linux内核模块已经不会勾选vfio-mdev,自测不影响gvt-g
kvmgt vfio vfio-iommu-type1s

然后运行,我用的zen内核所以是linux-zen,默认内核是linux

sudo mkinitcpio -p linux-zen

重启计算机

查看/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types可以看见类似如下的目录

# ls /sys/devices/pci${GVT_DOM}/$GVT_PCI/mdev_supported_types
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

向create文件中写入uuid(自己生成)就会创建相应的虚拟显卡

echo "$GVT_GUID" > "/sys/devices/pci${GVT_DOM}/$GVT_PCI/mdev_supported_types/$GVT_TYPE/create"

移除

echo 1 > /sys/bus/pci/devices/$GVT_PCI/$GVT_GUID/remove

qemu添加钩子, 启动虚拟机时自动创建虚拟显卡

/etc/libvirt/hooks/qemu中, 沒有则自己创建

#!/bin/bash
GVT_PCI=<GVT_PCI> # 这里为显卡的地址, 比如 0000:00:02.0
GVT_GUID=<GVT_GUID> # 这里为自己生成的uuid
MDEV_TYPE=<GVT_TYPE> # 这里为要使用的虚拟的类型, 比如 i915-GVTg_V5_8
DOMAIN=<DOMAIN name> # qemu虚拟机的名字
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

这样启动虚拟机时会自动创建, 停止后会自动删除

生成虚拟机配置

可以使用virt-manager先生成一个虚拟机, 再修改相应的配置, 默认配置文件在/etc/libvirt/qemu/
需要添加/修改的配置:

<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.driver=vfio-pci-nohotplug'/>
  <qemu:env name='MESA_LOADER_DRIVER_OVERRIDE' value='i965'/> <!--intel启用OpenGL可能会花屏, 不会就不要加这一条-->
</qemu:commandline>

hostdev配置可以在添加硬件(PCI HOST Devices)的界面直接修改xml, 更方便一点

<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
  <source>
    <address uuid='93397e71-15bf-4889-98b7-aa2d735e6260'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</hostdev>
<video>
  <model type='none'/>
</video>
<graphics type='spice'>
        <listen type='none'/>
        <image compression='off'/>
        <jpeg compression='never'/>
        <zlib compression='never'/>
        <playback compression='off'/>
        <streaming mode='off'/>
  <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
</graphics>
<vcpu placement='static'>2</vcpu>
<cputune>
  <vcpupin vcpu='0' cpuset='1'/>
  <vcpupin vcpu='1' cpuset='2'/>
</cputune>

结尾

启动虚拟机后, 进入虚拟机安装相应的显卡驱动就行了.
这样就快很多了, 比软件渲染快多了, 这样用linux也能愉快的使用其他系统了.


Intel_GVT-g
让 KVM 上的 Windows 虚拟机插上GVT-g 的翅膀
libvirt hooks
Intel Gvt