用Virt-manager安装带有gvt-g的win虚拟机

因为某些国内厂商的问题,一直无法完全使用Linux,还是需要一个win虚拟机来跑win下的软件,(不要说用什么wine,wine跑起来真的是依托答辩!)
尝试了vbox和vmware的win7虚拟机但性能一直无法很好,比如没办法有一个显卡,显示性能不佳。(
最终,我们选择了使用qemu/kvm作为跑win虚拟机的软件,并且直通了Inrel核显。

环境

操作系统:Arch Linux
核显:Intel WhiskeyLake-U GT2 [UHD Graphics 620]
虚拟机软件:Virt-manager(libvirt的gui前端)
……

Virt-manager的安装

1
sudo pacman -S virt-manager 

virt-manager简单配置

  • /etc/libvirt/libvirt.conf加入
    1
    2
    unix_sock_group = 'libvirt'
    unix_sock_rw_perms = '0770'
  • /etc/libvirt/qemu.conf加入
    1
    2
    3
    4
    5
    6
    vram = [
    "/usr/share/ovmf/x64/OVMF_CODE.fd:/usr/share/ovmf/x64/OVMF_VARS.fd"
    ]

    user = "username"
    group = "username"

username是你的用户名!!!

  • 开启并自启libvirtd服务

    1
    systemctl enable libvirtd --now
  • 将用户添加到libvirt

    1
    2
    sudo usermod -a -G libvirt $(whoami)
    reboot

编译qemu

因为我在使用qemu的过程中,如果直接用arch的qemu会有很多错误,所以我选择自己编译一个。在选定好编译参数后,用不了多少时间。

  • 下载qemu源码:

    1
    2
    git clone https://mirrors.bfsu.edu.cn/git/qemu.git
    cd qemu
  • 选择编译参数
    我们只编译x86-64的qemu,其它架构全部舍弃:
    configure参数脚本看这!

只要跑这个所只要直通要的东西,其他架构舍弃,若有需要,请自行添加

如果有spice参数依赖报错下载:
sudo pacman -S spice spice-gtk spice-protocol

  • 编译qemu
    1
    2
    make -j8
    sudo make install
    这里的-j8依你的CPU而定
    如果你跑qemu-system-x86_64 --version
    输出类似:
1
2
QEMU emulator version 7.2.50 (v7.2.0-347-gcb9c6a8e5a)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers

就证明qemu已经安装了!

启动GVT-g

  • 添加内核参数
    编辑/etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT添加 intel_iommu=on i915.enable_guc=0
    注意空格与引号!!!

  • 启动内核模块
    编辑/etc/modules-load.d/kvm.conf添加:

    1
    2
    3
    kvmgt
    vfio-mdev
    vfio-iommu-type1
  • 添加内核模块参数
    编辑 /etc/modprobe.d/gvt-g.conf添加:

    1
    options i915 enable_gvt=1

    然后重启系统

  • 查询显卡GUID

    1
    lspci -D -nn

    找到显卡的GUID,类似0000:00:02.0

    以后出现的0000:00:02.0就是这个GUID请不一样的自行修改

  • 查看mdev支持的类型

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

    如果出现文件夹就说明启动成功了!
    如果没有文件,那就再重试一遍吧看看是不是哪里漏了还是我写错了……

创建一个虚拟显卡

1
uuidgen

输出如:5e85791a-76ae-4e8d-a855-2ae2621dbfb3
记住输出的内容以后要用
创建设备,如用i915-GVTg_V5_4:

1
2
su
echo "5e85791a-76ae-4e8d-a855-2ae2621dbfb3" > "/sys/devices/pci0000:00/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"

注:
这里切换成su是因为用sudo我这里显示权限不够……

创建虚拟机

在virt-manager内创建一个win10虚拟机
硬盘选择virtio
win的virtio驱动下载:

1
sudo pacman -S virtio-win

其保存在/var/lib/libvirt/images/virtio-win.iso
新建一个CD加入这个即可获得virtio硬盘驱动,否则win安装程序无法加载硬盘
引导选择uefi
显卡选择VGA
…………

添加虚拟显卡

安装完成后在xml下在<devices>元素中添加:

1
2
3
4
5
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'>
<source>
<address uuid='5e85791a-76ae-4e8d-a855-2ae2621dbfb3'/>
</source>
</hostdev>

显示设置

<graphics type='spice'>下添加:

1
<gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>

<domain type='kvm'>修改为:

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

在上面添加:

1
2
3
4
5
6
7
8
  <qemu:override>
<qemu:device alias="hostdev0">
<qemu:frontend>
<qemu:property name="x-igd-opregion" type="bool" value="true"/>
</qemu:frontend>
</qemu:device>
</qemu:override>
</domain>

添加 IVSHMEM 设备

1
2
3
4
<shmem name='looking-glass'>
<model type='ivshmem-plain'/>
<size unit='M'>32</size>
</shmem>

32使用1080p分辨率

安装显卡驱动

到Intel官网找吧,到这一步相信你可以的!!!
安装完后应该能在任务管理器看到GPU0了

安装virtio driver驱动

之前挂了个virtio的CD,去里面下载就好了

安装spice tools

下载spicetools包

1
yay -S spice-guest-tools-windows

镜像保存在:/usr/share/spice-guest-tools/spice-guest-tools.iso
挂载后安装就好了

安装virtiofs

https://github.com/winfsp/winfsp下载个msi安装程序,然后在win下安装

  • 启动服务
    打开cmd输入:
    1
    sc create VirtioFsSvc binpath="C:\Program Files\Virtio-Win\VioFS\virtiofs.exe"
    到服务那里去把这个服务设置成自动即可
    然后virt-manager添加一个叫文件系统的硬件
    就完成共享文件夹啦!

自启虚拟显卡

编辑 /etc/libvirt/hooks/qemu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
GVT_PCI="0000:00:02.0"
GVT_GUID="5e85791a-76ae-4e8d-a855-2ae2621dbfb3"
MDEV_TYPE="i915-GVTg_V5_4"
WIN="win10"
LINUX="archlinux"
if [ $# -ge 3 ]; then
if [ $1 = "$WIN" -a $2 = "prepare" -a $3 = "begin" ]; then
echo "$GVT_GUID" > "/sys/devices/pci0000:00/$GVT_PCI/mdev_supported_types/$MDEV_TYPE/create"
elif [ $1 = "$WIN" -a $2 = "release" -a $3 = "end" ]; then
echo 1 > /sys/bus/pci/devices/$GVT_PCI/$GVT_GUID/remove
fi
fi

if [ $# -ge 3 ]; then
if [ $1 = "$LINUX" -a $2 = "prepare" -a $3 = "begin" ]; then
echo "$GVT_GUID" > "/sys/devices/pci0000:00/$GVT_PCI/mdev_supported_types/$MDEV_TYPE/create"
elif [ $1 = "$LINUX" -a $2 = "release" -a $3 = "end" ]; then
echo 1 > /sys/bus/pci/devices/$GVT_PCI/$GVT_GUID/remove
fi
fi

加入如下内容,注意GUID和虚拟机名称(win10)

最终效果:
效果


用Virt-manager安装带有gvt-g的win虚拟机
http://storm-1614.github.io/20230108/064539/
作者
storm1614
发布于
2023年1月8日
许可协议