安装

执行下面的代码:

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 文件并写入一下内容

    $ echo "97709d2e-39ff-11ec-bf01-54b203028f37" > "/sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"
  5. 打开虚拟机的 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,但是这样就没办法使用硬件加速了

显卡直通

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

启用 IOMMU

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

参数 nvidia-drm.modeset=1 对直通结果没有任何影响

隔离显卡

首先查看需要隔离的 PCI 设备:

#!/bin/bash
shopt -s nullglob
for g in $(find /sys/kernel/iommu_groups/* -maxdepth 0 -type d | sort -V); do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

例如我的电脑上独显在 IOMMU Group16,我需要将这个组的两个设备都进行隔离 :

IOMMU Group 16:
   01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA106M [GeForce RTX 3060 Mobile / Max-Q] [10de:2560] (rev a1)
   01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:228e] (rev a1)

这里记住两个设备中括号中的内容,它是设备的 pic id

然后编辑 /etc/modprobe.d/vfio.conf 文件,并写入 options vfio-pci ids=10de:2560,10de:228e

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

之后对于 ArchLinux :

编辑 :file:`/etc/mkinitcpio.conf` ,并在 MODULES 中添加 *vfio_pci  vfio  vfio_iommu_type1  vfio_virqfd* 四个模块。之后执行 :command:`sudo mkinitcpio -P`

对于 Fedora :

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

      vfio_pci
      vfio
      vfio_iommu_type1
      vfio_virqfd

执行 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。这时, 显卡已经被隔离,不能再被宿主机使用

虚拟机设置

要在虚拟机中使用独显,需要:

  1. 使用 sudo virsh edit virt_namechannel type="spicevmc" 节删掉。否则虚拟机启动后鼠标不可用

    这部分的内容删除后虚拟机无法再与宿主机交换剪贴板等内容

  2. 将上面隔离的 PCI 设备添加到虚拟机中

  3. 在虚拟机中安装显卡驱动

最后,你需要手动为程序指定 GPU 运行。尽管它自由一个 GPU,但是有些程序会优先使用 CPU。

其它注意事项

  • UEFI 的使用 /usr/share/edk2-ovmf/x64/OVMF_CODE.fd 而不是 /usr/share/edk2-ovmf/x64/OVMF_CODE.secboot.fd 。否者 loader 改成 rom 后虚拟机黑屏

  • 将 CPU 的型号设置为 host-passthrough

文件共享

使用 virtio 进行文件共享

要使用 virtio,需要进行以下步骤:

  1. 在 kvm 中使用 virtio 挂载文件系统。目标路径会被映射为 Label,可以任意填。

  2. 在 Windows 中安装 WinFsp

  3. 在 Windows 启动服务 VirtioFsSvc 服务。

使用 WebDav 进行文件共享

实际上,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 自身的局限性,要打开一个文件需要先将文件完整地下载下来

网络连接问题

如果虚拟机可以 ping 通 1.1.1.1 但是却无法上网。那么很可能是 DNS 服务器的问题。检查宿主机的 /etc/resolv.conf 发现是一个符号链接。也就是说系统使用了 systemd-resolved 作为 DNS 解析软件

但是由于 systemd-resolved 监听的是内网地址,对于虚拟机是不可见的,所以需要手动设置 DNS 服务器地址。一个可行的 DNS 服务器地址是腾讯 DNS:119.29.29.29

Last moify: 2024-10-22 02:01:54
Build time:2025-07-18 09:41:42
Powered By asphinx