前期準備

  1. 添加內核參數 i915.enable_gvt=1

    如果是 Grub,那就添加到 /etc/default/grubGRUB_CMDLINE_LINUX= 當中,然後執行一下:

    1
    # grub-mkconfig

    如果是 systemd-boot,那就是:

    1
    options i915.enable_gvt=1

    然後執行一下:

    1
    # bootctl update
  2. kvmgtvfio-iommu-type1vfio-mdev 添加到 /etc/mkinitcpio.confMODULES=() 當中,然後執行 mkinitcpio -P 重新生成 initramfs。

libvirt

掛個 hook

將以下內容1寫入 /etc/libvirt/hooks/qemu

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

GVT_PCI=<GVT_PCI>
GVT_GUID=<GVT_GUID>
MDEV_TYPE=<GVT_TYPE>
DOMAIN=<DOMAIN name>
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

其中的:

1
2
GVT_PCI=<GVT_PCI>
MDEV_TYPE=<GVT_TYPE>

該部分請對照 /sys/ 下的目錄檔填寫。

1
GVT_GUID=<GVT_GUID>

該部分請使用任意 UUID。

記得添加可執行權限:

1
# chmod +x /etc/libvirt/hooks/qemu

修改虛擬機配置檔案

1
# virsh edit <DOMAIN name>

檔案首行修改爲:

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

</devices> 前添加:

1
2
3
4
5
<hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='off'>
<source>
<address uuid='a6bc35ff-42e8-48bd-ba5c-0e3b397fd326'/>
</source>
</hostdev>

此處的 UUID 系任意生成,需和上文中的 GVT_GUID 一致。

然後啓動虛擬機,檢查虛擬機是否有監測到新的顯示設備(如果是 Windows,應同時檢查是否有安裝相應驅動)。

僅使用 Intel GVT-g

將上文中的 display='off' 修改爲 display='on'

刪除原有的 <graphics>...</graphics><video>...</video>,用以下內容代替:

1
2
3
4
<graphics type='spice'>
<listen type='none'/>
<gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>
</graphics>
1
2
3
<video>
<model type='none'/>
</video>

此處的 PCI 0000:00:02.0,需和上文中的 GVT_PCI 一致。

</domain> 前添加2

1
2
3
4
5
6
7
8
9
10
11
<qemu:commandline>
<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:arg value='-set'/>
<qemu:arg value='device.hostdev0.x-igd-opregion=on'/>
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev0.romfile=/vbios_gvt_uefi.rom'/>
<qemu:env name='MESA_LOADER_DRIVER_OVERRIDE' value='i965'/>
</qemu:commandline>

需要注意的是:

1
2
<qemu:arg value='-set'/>
<qemu:arg value='device.hostdev0.romfile=/vbios_gvt_uefi.rom'/>

當虛擬機使用 Linux 系統時,該部分可以移除。

並且,其中的 vbios_gvt_uefi.rom 僅在虛擬機爲 UEFI 環境的情況下使用,需要前往

http://120.25.59.132:3000/vbios_gvt_uefi.rom

下載並放到指定路徑。

參考