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=on 和i915.enable_guc=0
GRUB_CMDLINE_LINUX_DEFAULT ="loglevel=3 intel_iommu=on i915.enable_guc=0"
2. 启用内核模块
要启用kvmgt 、vfio-iommu-typ1 、mdev
$ 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
至此,重新启动 系统。
4. 查询显卡的GUID
找到显卡的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. 添加虚拟显卡
使用
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' 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.xres 和device.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__