KVM

安装

执行下面的代码:

dnf install -y qemu-kvm virt-manager
gpasswd -a $USER libvirt
gpasswd -a $USER kvm

VirtIO

VirtIO 是一个增强虚拟机 IO 的工具,同时还提供了粘贴板的双向同步和屏幕自由缩放。对于虚拟机而言,Linux 需要从包管理器中安装特定的驱动,Windows 需要前往 Fedora 下载并安装驱动,MacOS 对 VirtIO 的支持有限。

以网卡为例,只需要进入 virt-manager 中将 NIC 的设备型号设置为 virtio 即可。对于磁盘而言,安装分区必须要在安装过程中选择为 virtio 并在安装过程中加载需要的驱动(例如 Windows)

GVT-g

GVT-g 是 Intel 的一项虚拟显卡功能,可以将一个物理显卡虚拟成多个显卡并供给虚拟机使用

  1. 添加内核参数 i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=igfx_off

  2. 创建文件 /etc/modules-load.d/kvmgt.conf 并写入内容 kvmgt 后重启

  3. 重启后执行 ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/ 不应当为空

  4. 根据 指导 创建 rc.local 文件并写入一下内容

#!/bin/bash
echo "97709d2e-39ff-11ec-bf01-54b203028f37" > "/sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"
  1. 打开虚拟机的 xml 文件(例如使用 sudo virsh edit win10)并在 devices 字段中添加以下内容

<hostdev mode="subsystem" type="mdev" managed="no" model="vfio-pci" display="off">
  <source>
    <address uuid="97709d2e-39ff-11ec-bf01-54b203028f37"/>
  </source>
</hostdev>

之后打开虚拟机,可以看到设备管理器中有一个 Intel GPU,等待 Win10 安装完驱动即可。

重要

使用 GVT-g 后虚拟机会黑屏,需要使用诸如 VNC 的远程桌面

硬件加速

开启硬件加速的完整步骤为:

  1. 在显卡处选择 VirtIO,并勾选 3D 加速

  2. 在显示协议 Spice 处设置监听类型为无,并勾选 OpenGL。之后下面的显卡选择集成显卡

  3. 在虚拟机安装 VirtIO 驱动

第二步是最关键的。之所以如此设置是因为:

  • Spice 只支持本地加速,不支持网络。因此监听类型需要设置为无

  • 对于笔记本而言,OpenGL 的显卡两个都需要试试才行

重要

将显卡设置为 VirtIO 会导致鼠标漂移。解决的办法是将其设置为 QXL,但是这样就没办法使用硬件加速了

显卡直通

显卡直通需要以下几个步骤:

  1. intel_iommu=on iommu=pt 添加到内核参数

  2. 编辑 /etc/modprobe.d/vfio.conf 文件,并写入 options vfio-pci ids=10de:2560,10de:228e 其中 ids 的值是由逗号分割的 PCI ID,可以使用 lspci -nn | grep NVIDIA 查看

    提示

    如果编辑文件的方式不行,那么也可以通过内核参数 pci-sub.ids= 实现

  3. 编辑 /etc/modules-load.d/vfio.conf 并写入以下内容

    vfio_pci
    vfio
    vfio_iommu_type1
    vfio_virqfd
    
  4. 使用 dracut -f –kver `uname -r` 将模块写入 initramfs

    备注

    经过此步骤重启后,使用 lspci -v | grep -A30 'NVIDIA' 查看信息可以看到

    01:00.0 VGA compatible controller: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] (rev a1) (prog-if 00 [VGA controller])
    ...
    Kernel driver in use: vfio-pci
    

    也就是说 NVIDIA 的驱动变成了 vfio-pci。这时, 显卡已经被隔离,不能再被宿主机使用

  5. 在 KVM 的设置中直接将显卡对应的 PCI 设备分配个虚拟机即可。当然,虚拟机需要安装对应的驱动

Spice 文件共享

实际上,Spice 使用的是 WebDav 进行文件共享。要使用此功能,需要:

  1. 下载 Spice WebDav Guest 工具并在客户机上安装

  2. 宿主机安安装 spice-webdavd,并启动 spice-webdavd.service 服务

  3. 虚拟机的 XML 文件配置中添加以下内容:

    <devices>
        ......
        <channel type='spiceport'>
            <source channel='org.spice-space.webdav.0'/>
            <target type='virtio' name='org.spice-space.webdav.0'/>
        </channel>
        ......
    </devices>
    
  4. 使用 virt-viewer -a virt_name 连接到虚拟机,并在偏好中设置需要共享的文件

备注

由于 WebDav 自身的局限性,要打开一个文件需要先将文件完整地下载下来