安装
执行下面的代码:
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 的一项虚拟显卡功能,可以将一个物理显卡虚拟成多个显卡并供给虚拟机使用
添加内核参数
i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=igfx_off
创建文件
/etc/modules-load.d/kvmgt.conf
并写入内容 kvmgt 后重启重启后执行
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
不应当为空根据 指导 创建 rc.local 文件并写入一下内容
$ echo "97709d2e-39ff-11ec-bf01-54b203028f37" > "/sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V5_4/create"
打开虚拟机的 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 的远程桌面 |
硬件加速
开启硬件加速的完整步骤为:
在显卡处选择 VirtIO,并勾选 3D 加速
在显示协议 Spice 处设置监听类型为无,并勾选 OpenGL。之后下面的显卡选择集成显卡
在虚拟机安装 VirtIO 驱动
第二步是最关键的。之所以如此设置是因为:
Spice 只支持本地加速,不支持网络。因此监听类型需要设置为无
对于笔记本而言,OpenGL 的显卡两个都需要试试才行
将显卡设置为 VirtIO 会导致鼠标漂移。解决的办法是将其设置为 QXL,但是这样就没办法使用硬件加速了 |
显卡直通
显卡直通需要以下几个步骤:
启用 IOMMU
将 intel_iommu=on iommu=pt
添加到内核参数
参数 |
隔离显卡
首先查看需要隔离的 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
如果编辑文件的方式不行,那么也可以通过内核参数 |
之后对于 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。这时, 显卡已经被隔离,不能再被宿主机使用
虚拟机设置
要在虚拟机中使用独显,需要:
使用
sudo virsh edit virt_name
将 channel type="spicevmc" 节删掉。否则虚拟机启动后鼠标不可用这部分的内容删除后虚拟机无法再与宿主机交换剪贴板等内容
将上面隔离的 PCI 设备添加到虚拟机中
在虚拟机中安装显卡驱动
最后,你需要手动为程序指定 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,需要进行以下步骤:
在 kvm 中使用 virtio 挂载文件系统。目标路径会被映射为 Label,可以任意填。
在 Windows 中安装 WinFsp。
在 Windows 启动服务 VirtioFsSvc 服务。
使用 WebDav 进行文件共享
实际上,Spice 使用的是 WebDav 进行文件共享。要使用此功能,需要:
下载 Spice WebDav Guest 工具并在客户机上安装
宿主机安安装 spice-webdavd,并启动 spice-webdavd.service 服务
虚拟机的 XML 文件配置中添加以下内容:
<devices> ...... <channel type='spiceport'> <source channel='org.spice-space.webdav.0'/> <target type='virtio' name='org.spice-space.webdav.0'/> </channel> ...... </devices>
使用 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