在Arch Linux上使用GVT-g直通Intel核显至Windows虚拟机
NOTE本文记录在 Arch Linux 主机上用 QEMU/KVM 将 Intel 核显以 GVT-g vGPU 形式分配给虚拟机的完整过程。写作时间为 2026-05,GVT-g 已经是维护状态很差的旧技术,但胜在操作简单、适合老平台折腾,作为在Arch Linux上Wine运行异常、或者必须使用Windows时的一种高性能且体验优秀的解决方案(GVT-g vGPU性能远超过其他虚拟机显卡),并不适合把它当作新硬件的长期方案。
先说结论和限制
Intel GVT-g 是 Intel i915 驱动里的 vGPU/mdev 方案。它不是把整块核显独占直通给虚拟机,而是在宿主机继续使用核显的同时,把核显资源切成一个或多个 mediated device,再通过 VFIO 交给虚拟机。虚拟机里看到的是一块 Intel 显卡,可以安装 Intel 官方驱动,性能通常比 QXL、virtio-gpu 或纯软件渲染好得多。
但是它有几个必须先接受的限制:
- GVT-g 主要支持 Broadwell 到 Comet Lake 这一代区间的 Intel iGPU。Ice Lake 移动平台、Gen11 以及更新的 Xe/Gen12 架构通常不支持 GVT-g。新平台应优先看 SR-IOV 或完整设备直通。
- Intel 的
intel/gvt-linux仓库已经在 2024-10-03 归档,并明确写明项目不再维护,且存在已知安全逃逸问题。因此不要把不可信虚拟机接到这个方案上。 - GVT-g 依赖
Intel VT-d/IOMMU、i915.enable_gvt=1、kvmgt、mdev、VFIO以及 libvirt/QEMU 对 mdev 的支持。少一个环节都会导致mdev_supported_types不出现。
本文的宿主机为 Intel CPU + Intel 核显,核显 PCI 地址为 0000:00:02.0。这是多数笔记本和台式机的默认地址,但不要盲信,实际应以 lspci -D -nn 为准。
一、BIOS/UEFI 固件设置
重启进入主板或笔记本固件设置,确认至少开启:
Intel Virtualization Technology或VT-x:KVM 虚拟化 CPU 需要。Intel VT-d:IOMMU/VFIO 需要,GVT-g 必须启用。- 核显保持启用:如果机器有独显,不要把 iGPU 完全禁用。
进入系统后可以先做硬件检查:
lscpu | grep -E 'Virtualization|Model name'lspci -D -nn | grep -Ei 'vga|3d|display'输出结果应类似,保证核显型号在上述允许范围内:
0000:00:02.0 VGA compatible controller [0300]: Intel Corporation UHD Graphics 620 [8086:5917]二、安装 QEMU/KVM、libvirt 和 virt-manager
先更新系统:
sudo pacman -Syyu安装 QEMU/KVM、libvirt 和 virt-manager 以及必要依赖:
sudo pacman -S qemu-full virt-manager libvirt ovmf dnsmasq vde2 iproute2这里需要注意一个 Arch 包名变化:当前 Arch 官方仓库中的 OVMF 包名是
edk2-ovmf,不是 ovmf (本文写作时间为2026年5月)。如果 pacman 报 target not found: ovmf,请使用:
sudo pacman -S qemu-full virt-manager libvirt edk2-ovmf dnsmasq vde2 iproute2各包的作用如下:
qemu-full:完整 QEMU 安装集合。提供qemu-system-x86_64、qemu-img、各类 block/audio/display 后端和桌面虚拟化常用模块。GVT-g 最终由 QEMU 的vfio-pci设备把 mdev 交给虚拟机。virt-manager:图形化虚拟机管理器。它调用 libvirt 创建、编辑、启动虚拟机,适合先完成 Windows/Linux 虚拟机基础配置,再手动补充 GVT-g XML。libvirt:虚拟机管理守护进程和 API。负责保存 domain XML、管理存储池、网络、权限、mdev/hostdev 设备,以及调用 QEMU。edk2-ovmf/ 老文档里的ovmf:虚拟机 UEFI 固件。Windows 11 基本应使用 OVMF;Secure Boot 相关固件文件通常位于/usr/share/edk2/x64/。dnsmasq:libvirt 默认 NAT 网络的 DHCP/DNS 后端。一般不要手动启动系统级dnsmasq.service,libvirt 会为每个虚拟网络启动自己的 dnsmasq 实例。vde2:Virtual Distributed Ethernet,QEMU 可用的虚拟以太网工具。普通 virt-manager/libvirt NAT 网络不一定直接用到它,但安装完整 QEMU 桌面环境时常见。iproute2:提供ip、ss、tc等网络工具。排查virbr0、tap、路由和地址时必备。
如果 libvirt 默认 NAT 网络报错,还可能需要额外安装:
sudo pacman -S iptables-nftlibvirt 把 dnsmasq 和 iptables-nft 都列为默认 NAT/DHCP 网络相关的可选依赖。
启用 libvirt:
sudo systemctl enable --now libvirtd把当前用户加入常用虚拟化组:
sudo usermod -aG libvirt,kvm "$USER"注销并重新登录,或者临时执行:
newgrp libvirt启动并设置默认 NAT 网络自启:
sudo virsh net-autostart defaultsudo virsh net-start defaultsudo virsh net-list --all如果 default 已经是 active,net-start 报错“already active”是正常现象。
三、设置 GRUB 内核参数
GVT-g 需要 IOMMU 和 i915 GVT 开关。编辑:
vim /etc/default/grub找到 GRUB_CMDLINE_LINUX_DEFAULT,加入下面这些参数:
intel_iommu=on iommu=pt i915.enable_gvt=1 i915.enable_guc=0 i915.enable_fbc=0一个完整例子:
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet intel_iommu=on iommu=pt i915.enable_gvt=1 i915.enable_guc=0 i915.enable_fbc=0"参数解释:
intel_iommu=on:启用 Intel VT-d/IOMMU。没有它,VFIO/mdev 设备无法安全分配给虚拟机。i915.enable_gvt=1:启用 i915 的 GVT-g 支持。没有它,通常不会出现/sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/。i915.enable_guc=0:关闭 GuC/HuC 固件加载。ArchWiki 中对 GVT-g 与 GuC/HuC 的组合有警告,为了稳定性这里按 GVT-g 文档关闭。i915.enable_fbc=0:可选,关闭 framebuffer compression。在使用 DMA-BUF 显示的场景下更稳定。iommu=pt:可选,把未直通设备放在 passthrough IOMMU 模式,可能降低宿主机 IOMMU 开销。
生成 GRUB 配置:
sudo grub-mkconfig -o /boot/grub/grub.cfg然后重启:
sudo reboot重启后确认参数生效:
cat /proc/cmdlinedmesg | grep -Ei 'DMAR|IOMMU|GVT|i915'能看到类似 Intel-IOMMU: enabled、DMAR、GVT、i915 的相关输出则证明配置成功。如果完全没有 IOMMU 信息,先参考第一步在 BIOS 检查 VT-d,再检查 GRUB 参数是否真的生效。
四. 启动 KVM、VFIO 和 mdev 模块
创建 /etc/modules-load.d/kvm.conf:
sudoedit /etc/modules-load.d/kvm.conf写入:
kvmkvm_intelkvmgtvfiovfio_iommu_type1mdev说明:
kvm:KVM 核心模块。kvm_intel:Intel CPU 的 KVM 加速模块。AMD 平台才是kvm_amd,但本文是 Intel GVT-g。kvmgt:Intel GVT-g 的 KVM 后端。vfio:VFIO 核心,用于直通设备到虚拟机。vfio_iommu_type1:VFIO IOMMU 后端,GVT-g mdev 需要它来分配给虚拟机。mdev:Linux mediated device 框架。
有些内核会把某些模块编译进内核,lsmod 看不到不一定是坏事;但如果systemd-modules-load 明确报模块不存在,要确认当前正在运行的内核和/usr/lib/modules/$(uname -r) 是否匹配。Arch 更新内核后未重启时,很容易出现“新模块目录已安装,当前运行旧内核加载不到模块”的现象。
立即加载一次,避免等待重启:
sudo modprobe kvmsudo modprobe kvm_intelsudo modprobe vfiosudo modprobe vfio_iommu_type1sudo modprobe mdevsudo modprobe kvmgt检查:
lsmod | grep -E 'kvm|kvm_intel|kvmgt|vfio|mdev'再检查核显是否暴露 mdev 类型:
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/如果目录不存在,优先排查:
- CPU/iGPU 是否在 GVT-g 支持范围内。
- BIOS 是否开启 VT-d。
/proc/cmdline是否真的有intel_iommu=on i915.enable_gvt=1 i915.enable_guc=0。kvmgt模块是否成功加载。dmesg | grep -i gvt是否出现Unsupported device. GVT-g is disabled。
五、安装并使用 mdevctl 创建 GVT-g vGPU
mdevctl 是 mediated device 的管理和持久化工具。它会把定义保存到 /etc/mdevctl.d/,并通过 udev 在父设备可用时自动创建设置为 auto 的 mdev。
安装 mdevctl 的 AUR 包:
yay -S mdevctl安装后列出可创建的 mdev 类型:
mdevctl types具体名字由平台决定,一般来说,同一平台内编号更低的类型分配更多显存、更高分辨率或更多 GPU 时间片,但可同时创建的实例更少。创建前可以看 mdevctl types 命令的输出:
例如:
0000:00:02.0 i915-GVTg_V5_4 Available instances: 0 Device API: vfio-pci Name: GVTg_V5_4 Description: low_gm_size: 128MB, high_gm_size: 512MB, fence: 4, resolution: 1920x1080, weight: 4 i915-GVTg_V5_8 Available instances: 0 Device API: vfio-pci Name: GVTg_V5_8 Description: low_gm_size: 64MB, high_gm_size: 384MB, fence: 4, resolution: 1024x768, weight: 2定义一个自动启动的 GVT-g vGPU:
sudo mdevctl define --auto --uuid $(uuidgen) --parent 0000:00:02.0 --type i915-GVTg_V5_4注意:define --auto 的含义是“创建持久化定义,并设置为父设备出现时自动启动”。它不会总是等价于“当前立刻创建一个已经运行的 mdev”。为了现在就用,继续执行:
sudo mdevctl start --uuid "$GVT_UUID"检查当前运行的 mdev:
mdevctl listmdevctl list -dls -l "/sys/bus/mdev/devices/$GVT_UUID"可以看到 GVT-g vGPU 设备成功创建,如果 virt-manager 或 libvirt 看不到新设备,重启 libvirt:
sudo systemctl restart libvirtd如果要删除设备:
sudo mdevctl stop --uuid "$GVT_UUID"sudo mdevctl undefine --uuid "$GVT_UUID"六、用 virt-manager 创建基础虚拟机
建议先创建一台普通虚拟机,安装好系统和驱动,再添加 GVT-g。这样排错简单,毕竟如果加 GVT-g vGPU 后黑屏,还能回退到普通显示设备。
6.1 新建虚拟机
打开 virt-manager (安装后在DE桌面环境中名字往往是 “虚拟系统管理器”) ,在界面中:
- 连接到
QEMU/KVM系统会话,不是用户会话。系统会话通常显示为qemu:///system,权限和 mdev/VFIO 配合更省事。 - 点击“新建虚拟机”。
- 选择本地 ISO,例如 Windows 11 的镜像文件。
- 选择系统类型。Windows 11 请选择 Windows 11,或至少 Windows 10/11 相近模板。
- 分配 CPU 和内存。示例:4 vCPU、8 GiB RAM。
- 创建 qcow2 磁盘。示例:60 GiB 或更大。
- 勾选“安装前自定义配置”。
6.2 配置基础硬件
在“概况”里调整:
- 芯片组:
Q35。 - 固件:
UEFI x86_64/ OVMF。Windows 11 推荐 UEFI + TPM 2.0。 - CPU:
host-passthrough。注意在拓扑中勾选手动设置CPU拓扑,例如设置 sockets=1(插槽数)、cores=2(核心数)、threads=2(线程数)即表示共分配 1x2x2=4 个CPU核心。 - 磁盘总线:新装系统推荐
VirtIO,但 Windows 安装时要加载 VirtIO 驱动 ISO;为了省事也可以先用 SATA,安装完再迁移。 - 网卡:
virtio性能最好;若安装阶段缺驱动,可临时用e1000e。 - 显示:初始安装阶段先保留
SPICE+Video QXL或Virtio,安装完系统和远程访问后再移除。 - Windows 11:添加
TPM,型号选CRB,版本2.0。
启动虚拟机,完成系统安装。Windows 客户机里建议安装:
- VirtIO 驱动:磁盘、网卡、balloon、qemu guest agendt 等客户机驱动,可以点击下载链接跳转至Fedora People的virtio-win.iso最新版下载页面。
- Intel 核显驱动:添加 GVT-g 后需要它接管 vGPU,可以先在 Intel 官网下载驱动程序
在虚拟机下载 virtio-win.iso 后可以直接在资源管理器中双击打开,之后分别安装 virtio-win-gt-x64.msi(图形相关驱动)和 virtio-win-guest-tools-x64.msi(增强功能工具)。安装完成后重启虚拟机。


安装 virtio-win 驱动后主机便可以与虚拟机共享剪贴板、传输文件、调整分辨率(但其驱动的 QXL 虚拟显卡性能远远不如接下来将要添加的 GVT-g vGPU)。
七、在 virt-manager 中添加 GVT-g vGPU
关闭虚拟机,注意不要挂起,而是完全关闭虚拟机。
- 打开虚拟机“详细信息”。
- 点击“添加硬件”。
- 选择
MDEV主机设备。 - 找到刚创建的 GVT-g vGPU mdev 设备,名称通常包含 UUID,或显示为
mdev_...。 - 添加到虚拟机。

添加后启动虚拟机,如果一切顺利,客户机里应该能看到新的 Intel 显卡设备(或除了已经添加的QXL显卡外,额外显示一个 Microsoft 标准显示适配器),安装官方的 Intel 显卡驱动后就可以使用了。
八、显示输出:使用 Looking Glass 标准共享内存
安装好 Intel 显卡驱动后,虚拟机里通常会同时看到 QXL/virtio 虚拟显卡和 Intel GVT-g vGPU。为了让 Windows 桌面真正跑在 Intel vGPU 上,同时获得比 SPICE/QXL 更流畅的低延迟画面,本文使用 Looking Glass 作为显示输出方案。
NOTE需要特别说明的是:Looking Glass 官方更推荐
KVMFR模块,因为KVMFR可以让 GPU 通过 DMA 访问共享内存,性能更好。但经过实测KVMFR方式会与virtiofs冲突,无法将Arch Linux主机的文件夹共享至虚拟机,原因是virtiofs依赖虚拟机内存共享来完成零拷贝的数据读写,但是virtiofs无法将KVMFR模块创建的设备的内存共享,造成冲突。因此本文按照 Looking Glass B7 文档中的 IVSHMEM 共享内存方式 方式配置,也就是使用/dev/shm/looking-glass作为标准共享内存后端。
8.1 在 Windows 虚拟机中安装 Looking Glass Host
安装步骤:
- 在 Windows 虚拟机里打开 Looking Glass 下载页:https://looking-glass.io/downloads。
- 下载与宿主机客户端版本一致的
looking-glass-host-setup.exe,例如 B7 对 B7。 - 右键安装器,选择“以管理员身份运行”。
- 按安装向导一路继续。默认选项适合大多数场景,安装器会安装 IVSHMEM 驱动和 Looking Glass Host 服务。
- 安装完成后,Looking Glass Host 会作为 Windows 服务运行。
安装完成后关闭虚拟机,继续下面的显示设备调整和共享内存配置。
8.2 调整虚拟机显示设备
先关闭虚拟机,不要挂起。
打开 virt-manager(虚拟系统管理器),选择已经创建的 Windows 虚拟机,进入“虚拟机详情”:
- 左侧找到“显卡”设备,通常是“显卡 QXL”,点击进入。
- 将视频型号改为
None。这样 Windows 启动后主要显示设备就是 Intel GVT-g vGPU。 - 如想要保留Windows启动前的BIOS画面,把上述的视频型号改为
Ramfb即可。

8.3 添加 Looking Glass 标准共享内存设备
在 virt-manager 的虚拟机详情界面,点击第一个 概况 ,再点击 详情 旁的 XML,滚动到最后,在 <devices> 节点内加入一个新的共享内存设备:
<shmem name="looking-glass"> <model type="ivshmem-plain"/> <size unit="M">32</size></shmem>
其中 32M 适合 1920x1080 SDR。Looking Glass 官方给出的计算方式是:
宽度 x 高度 x BPP x 2 = frame size in bytesframe size / 1024 / 1024 = frame size in MiBframe size in MiB + 10 = required size in MiB向上取整到 2 的幂 = 最终大小其中 SDR 32-bit RGB 的 BPP 为 4,HDR 64-bit 为 8。常见取值可以直接按下面选择:
| 分辨率 | SDR | HDR |
|---|---|---|
| 1920x1080 | 32M | 64M |
| 1920x1200 | 32M | 64M |
| 2560x1440 | 64M | 128M |
| 3840x2160 | 128M | 256M |
这个值不是越大越好,设得过大只会固定占用宿主机内存。若设置太小,Looking Glass 会截断画面底部并提示需要增大共享内存。
8.4 设置 /dev/shm/looking-glass 权限
标准共享内存方式会使用 /dev/shm/looking-glass。默认情况下,这个文件可能由 QEMU 创建并归 QEMU 用户所有,普通用户运行 looking-glass-client 时无法读写。接下来我们使用 systemd-tmpfiles 预先创建并设置权限。
新建 /etc/tmpfiles.d/10-looking-glass.conf:
vim /etc/tmpfiles.d/10-looking-glass.conf写入:
# Type Path Mode UID GID Age Argumentf /dev/shm/looking-glass 0660 User kvm -把其中的 User 改成实际的 Arch Linux 用户名。然后执行:
sudo systemd-tmpfiles --create /etc/tmpfiles.d/10-looking-glass.confls -l /dev/shm/looking-glass输出中应能看到文件归 Arch Linux 所使用的用户和 kvm 组所有,权限为 rw-rw----。
如果后续修改了 <size unit='M'>...</size> 的大小,需要先关闭虚拟机,再删除旧共享内存文件再重新创建:
sudo rm -f /dev/shm/looking-glasssudo systemd-tmpfiles --create /etc/tmpfiles.d/10-looking-glass.conf8.5 在 Arch Linux 宿主机安装 Looking Glass Client
Arch 上可从 AUR 安装 Looking Glass 客户端。AUR 包名是 looking-glass,安装后提供的命令是 looking-glass-client:
yay -S looking-glass安装完成后在 virt-manager 启动 Windows 虚拟机,再打开桌面环境中的 Looking Glass Client 即可看到虚拟机画面,并且在安装 Intel 驱动后,直通的显卡也正常使用,其性能远超过普通的虚拟机自带显卡,完全可以作为在Arch Linux上必须使用Windows时的解决方案。

九、验证虚拟机的 GVT-g vGPU 是否正常工作
虚拟机启动前确认 mdev 存在:
mdevctl listls /sys/bus/mdev/devices/启动虚拟机后查看 QEMU 日志:
sudo journalctl -u libvirtd -bsudo ls /var/log/libvirt/qemu/sudo tail -n 200 /var/log/libvirt/qemu/<虚拟机名称>.log虚拟机内验证:设备管理器中应出现 Intel 显卡;安装 Intel 驱动后不应是 Microsoft基本显示适配器。
宿主机验证 GPU 活动可用:
sudo pacman -S intel-gpu-toolssudo intel_gpu_top如果虚拟机观看视频时能看到 render/blitter/video 活动变化,说明 vGPU 在工作。
十、常见故障
10.1 /mdev_supported_types 不存在
检查:
cat /proc/cmdlinelsmod | grep -E 'kvmgt|mdev|vfio'dmesg | grep -Ei 'gvt|i915|dmar|iommu'lspci -D -nn | grep -Ei 'vga|display'常见原因:
- 硬件不是 Broadwell 到 Comet Lake 这类 GVT-g 支持平台。
- BIOS 没开 VT-d。
- GRUB 参数没有生效。
i915.enable_guc=0没设置,或 GuC/HuC 配置与 GVT-g 冲突。kvmgt没加载。- 内核升级后未重启,导致当前内核找不到匹配模块。
10.2 mdevctl define/start 报没有空间或没有实例
检查可用实例数:
cat /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/i915-GVTg_V4_1/available_instances如果是 0,说明该类型已经被占用,或显存资源不够。可以换更小类型,例如从 V4_1
换成 V4_2、V4_4,具体以 mdevctl types 输出为准。
10.3 virt-manager 看不到 mdev
先确认 mdev 已启动:
mdevctl list再重启 libvirt:
sudo systemctl restart libvirtd还可以用 libvirt 节点设备命令看:
virsh nodedev-list --cap mdevvirsh nodedev-list --cap mdev_types