用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

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

如果有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)

最终效果:
效果

萌ICP备20241614号