在 Homelab 的世界里,如何榨干一台小主机的核显性能是一门必修课。
如果你的需求是:既要 Windows 虚拟机有图形加速(不卡顿、能跑轻量 3D),又要 Linux 虚拟机(如 Jellyfin/Plex)能同时进行硬件解码。那么,Intel 的 GVT-g(Graphics Virtualization Technology - g) 技术是 10 代及以前 Intel CPU 的最佳解法。它能将一个物理核显虚拟出多个虚拟 GPU(vGPU)分给不同的虚拟机,实现“一卡多用”。
然而,网上的教程大多语焉不详,甚至很多已经过时(特别是在 PVE 8.x 时代)。这篇指南将带你一步步走完配置流程,并把那些能让你排查到深夜的“深坑”一一刨开。
一、 核心前提:你的硬件和系统支持吗?
在动手前,请花一分钟核对以下硬性限制,否则后面全是无用功。
- CPU 代数限制:GVT-g 仅支持 Intel Broadwell (5代) 至 Comet Lake (10代) 的核心显卡。
- 5代以前:不支持。
- 11代及以后 (Rocket Lake, Alder Lake, Raptor Lake等):Intel 已经彻底废弃了 GVT-g,转而采用 SR-IOV 技术。如果你是 12 代、13 代 CPU,请直接出门右转找
i915-sriov-dkms的教程,本文不适用。
- PVE 系统版本警告:
- PVE 7.x (Kernel 5.15 及以下):完美支持 GVT-g。
- PVE 8.x (Kernel 6.2 及以上):极其不推荐在此版本强行折腾 GVT-g。因为 Linux 内核在 6.2 之后已经彻底移除了 GVT-g 的上游代码。如果你强行在 PVE 8 上降级内核或者找补丁,系统稳定性会大打折扣。建议 10 代及以下 CPU 的用户,为了稳定的 GVT-g,将 PVE 维持在 7.4 版本。
二、 详细配置步骤
以下步骤以 PVE 7.4 环境、Intel 10 代 CPU (UHD 630) 为主线进行演示。
第一步:开启主板 BIOS 设置
重启电脑进入 BIOS,找到以下选项并开启:
- VT-d (Intel Virtualization Technology for Directed I/O): 必须设置为 Enabled。
- Internal Graphics (核显/集显): 强制设置为 Enabled(不要设为 Auto,防止插了独显后核显被禁用)。
- DVMT Pre-Allocated: 建议设为 64M 或更高。
第二步:配置 PVE 宿主机内核参数
我们需要告诉内核,启动 IOMMU 并加载 Intel 核显的 GVT 驱动。
编辑 Grub 配置文件(如果你使用的是 systemd-boot,请直接修改
/etc/kernel/cmdline):nano /etc/default/grub找到
GRUB_CMDLINE_LINUX_DEFAULT这一行,修改为:GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_gvt=1"注意:如果你的主板不需要显卡欺骗,不需要加
pcie_acs_override,保持精简最好。保存并更新 Grub:
update-grub
第三步:添加引导所需的内核模块
系统启动时需要加载一些虚拟化相关的模块。
- 编辑
modules文件:nano /etc/modules - 在文件末尾添加以下四行:
kvmgt vfio vfio_iommu_type1 vfio_mdev - 保存退出,然后更新 initramfs:
update-initramfs -u -k all - 重启 PVE 宿主机。
第四步:验证 GVT-g 是否成功启用
重启后,登录 PVE 的 SSH 后台,运行以下命令:
ls /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
(注:0000:00:02.0 通常是 Intel 核显的 PCI 地址。如果你的地址不同,请先用 lspci | grep VGA 确认。)
如果命令返回了类似 i915-builtin-i915_bdf_xxx 的文件夹列表,说明 GVT-g 已经成功启用!
常见的虚拟类型有:
- i915-gvt-g_V5_4:分辨率低一些,分配显存少,适合给轻量 Linux 虚拟机。
- i915-gvt-g_V5_8:分辨率高(可达 1080P/2K),分配显存多,适合给 Windows 桌面虚拟机。
三、 在虚拟机(VM)中挂载 vGPU
这里以配置一个 Windows 10 虚拟机为例。
- 创建 VM:正常创建虚拟机,机型(Machine)建议选择 q35(兼容性更好,虽然 i440fx 也能用,但 q35 对 PCIe 设备更友好)。BIOS 推荐使用 OVMF (UEFI)。
- 添加 PCI 设备:
- 进入虚拟机的 Hardware (硬件) 选项卡,点击 Add -> PCI Device。
- 选择
0000:00:02.0(核显)。 - 重点:在下方勾选 MDev Type,然后在下拉菜单中选择你需要的 vGPU 类型(例如
i915-gvt-g_V5_8)。 - 不要 勾选
All Functions、Primary GPU或ROM-Bar(初次配置时,这些勾选极易导致启动黑屏)。
- 显示设置:
- 虚拟机的 Display (显示) 保持默认的 Standard VGA 或 VirtIO-GPU。
- 注意:千万不要在第一步就直接把虚拟机显示改成 None。我们需要先通过标准控制台进系统装好显卡驱动,才能切换显示输出。
四、 避坑指南:折腾中的血泪教训
配置 GVT-g 看起来简单,但稍有不慎就会卡在某个玄学环节。以下是社区里被问过无数次的典型坑:
坑 1:误把核显拉入了黑名单 (Blacklist i915)
网上很多关于“独显直通”或“核显直通(GVT-d)”的教程,会让你去 /etc/modprobe.d/ 里建立 pve-blacklist.conf 并写入 blacklist i915。
- 后果:一旦你黑名单了
i915,PVE 宿主机就无法驱动核显,自然也就无法将其切割虚拟化。 - 解决办法:检查
/etc/modprobe.d/下的所有.conf文件,确保没有任何禁用i915或intel显卡驱动的条目。
坑 2:Windows 虚拟机装完驱动显示“设备错误(代码 43)”
这是最经典的恶梦。
- 可能原因 A:你的虚拟机使用了 Seabios (Legacy) 引导,而驱动程序需要 UEFI 引导。
- 解决:重建 VM,使用 OVMF (UEFI) 引导。
- 可能原因 B:Windows 自动推来的显卡驱动版本不对。
- 解决:不要让 Windows Update 自动装驱动。去 Intel 官网下载对应你 CPU 代数的旧版/稳定版 DCH 驱动程序,断网安装,并使用
DDU(Display Driver Uninstaller)清理残留。
- 解决:不要让 Windows Update 自动装驱动。去 Intel 官网下载对应你 CPU 代数的旧版/稳定版 DCH 驱动程序,断网安装,并使用
坑 3:Jellyfin/Plex 容器无法硬解
如果你把 vGPU 分配给了一个 Linux 虚拟机(比如 Ubuntu),然后在里面跑 Docker 版的 Jellyfin,发现无法硬解。
- 原因:宿主机的
/dev/dri设备没有正确映射到 Docker 容器内,或者权限不足。 - 解决:
- 在 Linux 虚拟机内确保
ls /dev/dri能看到renderD128。 - Docker-compose 文件中必须加入:
devices: - /dev/dri:/dev/dri - 确保容器运行用户(通常是 root 或具有 video/render 组权限的用户)对
/dev/dri有读写权限:chmod 777 /dev/dri/renderD128。
- 在 Linux 虚拟机内确保
坑 4:物理输出接口(HDMI/DP)没有画面
“我配好了 GVT-g,为什么把显示器插到小主机的 HDMI 接口上,虚拟机里没有输出?”
- 硬伤:GVT-g 虚拟出来的 GPU 是没有物理输出通路的。物理 HDMI/DP 接口依然归宿主机所有(或者处于无信号状态)。
- 解决办法:虚拟机内请使用 RDP (远程桌面)、NoMachine、Moonlight/Sunshine 或者 Parsec 等远程推流软件来获取丝滑的图形加速画面。如果你必须让物理接口输出虚拟机的画面,请使用 GVT-d (独占直通)。
总结
对于 5代到10代 Intel CPU 的用户,GVT-g 是兼顾多媒体转码和轻量虚拟机图形加速的“神器”。只要严格遵守 “不黑名单驱动 -> 正确配置内核参数 -> 选用合适的 mdev 类型 -> 虚拟机 UEFI 启动 -> 官网手动装驱动” 这一套链路,它的稳定性是非常可靠的。
至于 11 代及以上的主机,就让我们在 SR-IOV 的折腾路上再见吧!