安装

1
sudo pacman -S --needed qemu-desktop virt-manager dnsmasq swtpm
  • qemu-desktop: 与 kvm 搭配使用, kvm 只负责 cpu 和 内存的虚拟化, 其他虚拟化 qemu 负责. 相比 qemu-base 补充了图形相关内容, 相比 qemu-full 削减了不必要的其他 cpu 架构的模拟. 包含了 edk2-ovmf 软件包
  • virt-manager: libvirt 的 gui 前端, 包含了 libvirt 软件包
  • dnsmasq: nat 模式下提供 dhcp 和 dns 服务
  • swtpm: tpm 模拟, windows 11 可能需要

配置

自启动 libvirt 服务

根据 libvirt 官方说明, 此方法未来会被弃用, 转变为模块化守护进程

启动模块化守护进程命令:

1
2
3
4
5
for drv in qemu interface network nodedev nwfilter secret storage
do
systemctl enable virt${drv}d.service
systemctl enable virt${drv}d{,-ro,-admin}.socket
done
1
sudo systemctl enable libvirtd.service

启动默认 nat 网卡

1
2
sudo virsh net-start default
sudo virsh net-autostart default

如果默认 nat 网卡无法联网, 则可能是防火墙阻拦了流量转发, 需要防火墙放行

ufw需要添加如下规则:

1
2
3
4
5
6
7
8
# 1. 允许虚拟机通过 virbr0 向宿主机发送请求(如获取 DHCP 的 IP、DNS 解析)
sudo ufw allow in on virbr0

# 2. 允许流量从 virbr0 转发出去(让虚拟机可以访问外网)
sudo ufw route allow in on virbr0

# 3. 允许外网返回的流量转发回 virbr0(让虚拟机可以收到下载/网页数据)
sudo ufw route allow out on virbr0

或者防火墙换用 firewalld, libvirt 会自动进行配置

配置完后建议重启

创建虚拟机

通常配置

固件选择 UEFI

所有硬件部分若能选择 Virtio 就选择这个

virtio gpu 配置

由于 nvidia 显卡驱动的特殊性, 常规配置方法无法正常启用 virtio gpu 的 3d 加速, 具体配置如下:

显示协议 Spice 修改:

1
2
3
<graphics type="spice">
<listen type="none"/>
</graphics>

添加 egl-headless 显示协议如下, rendernode 的值要选择 nvidia 显卡对应的值:

1
2
3
<graphics type="egl-headless">
<gl rendernode="/dev/dri/renderD129"/>
</graphics>

显卡 Virtio 修改:

1
2
3
4
5
6
<video>
<model type="virtio" heads="1" primary="yes">
<acceleration accel3d="yes"/>
</model>
<address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x0"/>
</video>

仅修改 xml 后的 virtio gpu 3d 加速, 由于权限问题, 只能在 QEMU/KVM 用户会话创建的虚拟机使用, 在系统会话下使用会报错 EGL_NOT_INITIALIZED, 还需如下配置:

修改 /etc/libvirt/qemu.conf, 取消注释 cgroup_device_acl 变量, 增加 /dev/kvm, /dev/dri/renderD129 (具体为 rendernode 的值), 以及执行 ls /dev | grep nvidia 的所有结果, 具体内容如下 (具体内容可能会不同):

1
2
3
4
5
6
7
8
9
10
11
12
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/userfaultfd",
"/dev/kvm",
"/dev/dri/renderD129",
"/dev/nvidia0",
"/dev/nvidiactl",
"/dev/nvidia-modeset",
"/dev/nvidia-uvm",
"/dev/nvidia-uvm-tools"
]

将 qemu 加入 render 和 kvm 组确保有访问显卡的权限:

1
sudo usermod -aG render,kvm qemu

最后重启 libvirtd 服务

1
sudo systemctl restart libvirtd.service

一些问题

虚拟机自动调节分辨率失效

官方为了 vnc 的兼容性, 通过 virtio-win.iso 安装驱动时, 默认不会安装 vgpu 相关服务, 安装时要额外勾选相关内容, 或者单独执行 virtio-win.iso 里面的 vgpusrv.exe -i, vgpusrv 位于 viogpudo 目录

虚拟机内分辨率要明显大于实际窗口对应的分辨率, 导致的显示异常

kde 桌面缩放不为 100% 就会出现这个问题, 临时解决方法是设置相关环境变量 GDK_BACKEND=x11, GDK_SCALE=1, GDK_DPI_SCALE=0, 由于 kde
桌面相关功能的缺陷暂无较好的解决办法

无法启用系统托盘图标

安装 libayatana-appindicator (其他应用若缺失系统托盘图标也会依赖该软件包, 建议在 arch linux 安装时就安装)

无法启用 libguestfs 虚拟机自检

安装 libguestfs (暂时可能用不到)

参考链接