在 Linux 虚拟机里跑 GPU:ExHyperV SSH 自动化部署 GPU-PV 全流程
【免费下载链接】ExHyperVThe Excalibur of Hyper-V / Hyper-V 神器项目地址: https://gitcode.com/gh_mirrors/ex/ExHyperV
在 Hyper-V 的 Linux 虚拟机里用上物理显卡,一直是折腾党的"高难度副本":要改 MMIO 间隙、要准备 dxgkrnl 内核模块、还要手动上传整包驱动。而ExHyperV(Hyper-V 神器)把这一切封装成了一条 SSH 自动化流水线——你在图形界面里选好显卡和脚本、填好 SSH 密码,剩下的驱动解析、SFTP 上传、脚本执行、重启续跑全部由程序代劳。本文带你走一遍 ExHyperV 部署 Linux GPU-PV 的完整流程,零基础也能照着做。
一、GPU-PV 是什么?为什么 Linux 能用上显卡
Hyper-V 的 GPU 直通并非"物理直通",而是GPU 分区(GPU Partition)+ WDDM 半虚拟化:主机侧的物理驱动负责渲染,虚拟机内通过 VMBus 通道与一个虚拟显卡设备对话,Linux 里则由dxgkrnl内核模块扮演"翻译官",让 Mesa / Dozen 等用户态栈把 OpenGL、Vulkan、D3D12 请求转发到主机。
这套机制的关键在于:Linux 部署 =主机驱动包 + dxgkrnl 内核模块 + WSL 运行时库,三样缺一不可。手动做非常繁琐,而这正是 ExHyperV 自动化的价值所在。
二、部署前的两个前置条件
在打开 ExHyperV 之前,先确认两件事:
- GPU 可分区:NVIDIA 30/40/50 系、AMD 部分独显支持
Msvm_PartitionableGpu分区,Intel 核显走的是另一条 WDDM 直通路线(本文不展开)。 - 虚拟机满足 GPU 要求:需要开启「来宾控制缓存类型」(GuestControlledCacheTypes)并放大高位 MMIO 间隙(通常 64GB 起步)。
好消息是这两项ExHyperV 都会自动检查与优化:
- 检查逻辑:VmGpuService.cs 中的
CheckVmForGpuAsync直接读 WMI 的HighMmioGapSize与GuestControlledCacheTypes,不达标时调用OptimizeVmForGpuAsync自动改写配置。 - 主机策略:HyperVGpuPolicyService.cs 负责放开"不支持 GPU 分配"的拦截,让非官方显卡也能上机。
⚠️ 小提示:如果虚拟机里还装着 NVIDIA 官方驱动,建议先卸载——它会和
dxgkrnl抢占 GPU 访问权,导致nvidia-smi报GPU access blocked by the operating system。
三、开始部署:图形界面四步走
1️⃣ 打开 GPU 设置,选择脚本
进入目标 Linux 虚拟机的显卡设置页,点击「添加 GPU」。程序会列出主机所有显卡:
选中要分配的显卡后,Linux 部署面板会让你选择部署脚本。内置脚本清单来自 src/Linux/script/index.json,目前有:
| 脚本 | 特性 |
|---|---|
| Ubuntu-22.04-Official | CUDA ✅ / Mesa ✅,版本 1.1.0 |
| Ubuntu-24.04-Official | CUDA ✅ / Mesa ❌,版本 1.0.2 |
| fnOS-HyperV-GPU-PV | fnOS 定制版(Win10 22H2 实测可用) |
脚本本体在 src/Linux/script/ 目录,例如 Ubuntu-22.04-Official.sh 会自动识别 x64/arm64 架构、安装依赖、带 5 次重试机制,并支持传入代理参数。
2️⃣ 填写 SSH 凭据
填入虚拟机的SSH 用户名 / 密码,并决定:
- 安装 OpenGL/Vulkan 图形驱动(勾选后额外执行图形栈配置,Mesa/Vulkan ICD 都会配好)
- 代理设置(可选,国内下载脚本和依赖时可填 HTTP 代理,程序会注入
http_proxy环境变量)
虚拟机可以处于关机状态,ExHyperV 会自动开机。
3️⃣ 一键启动,全程无需手动干预
点击部署后,程序在 VmGpuService.cs 的ProvisionLinuxGpuAsync中按四阶段状态机执行:
| 阶段 | 动作 | 实现 |
|---|---|---|
| ① 准备 | 开机(如需)、按 MAC 嗅探 IP、探测 SSH 端口就绪 | VmIpService.cs + 端口轮询 |
| ② 上传 | 把主机 GPU 驱动的完整 FileRepository + WSL 运行库(libd3d12等)经 SFTP 推到/tmp/exhyperv_deploy/ | SshService.cs 的UploadDirectoryAsync;WSL 库见 src/Linux/lib/x64/ |
| ③ 脚本 | 在虚拟机内wget/curl下载所选脚本并chmod +x(可走代理) | 同 SSH 会话内执行 |
| ④ 执行 | sudo运行脚本,解析[STATUS: SUCCESS]/[STATUS: REBOOT_REQUIRED]信号 | 最多 3 轮「执行 → 重启 → 重连 → 续跑」 |
其中最巧妙的就是重启循环:dxgkrnl内核模块编译安装后需要重启才生效,脚本会打印REBOOT_REQUIRED,ExHyperV 捕获该信号后自动重启虚拟机、等待 SSH 恢复、再执行同一脚本直到SUCCESS——全程你只需要看着日志滚。
🔍 驱动包如何"精确解析"?GpuDriverPackageResolver.cs 会从注册表定位所选显卡的 INF,在 DriverStore 的 FileRepository 中精确匹配主包及 AMD 的 OpenCL/AMDWIN 伴生包,防止同名文件链接到别的显卡版本——这也是"整目录上传 + 精确链接"策略的由来。
4️⃣ 验证:在 Ubuntu 里跑 CUDA
部署完成后登录虚拟机,lsmod | grep dxgkrnl、/dev/dxg存在即代表 dxg 通道就绪;Vulkan 用户运行vulkaninfo --summary,看到driverName = Dozen、deviceName = Microsoft Direct3D12 (...)就是大功告成。
最终效果:Ubuntu 22.04 虚拟机内,Blender 的 CUDA 渲染设备里赫然出现物理显卡 RTX 4080 SUPER——这就是 GPU-PV 的威力:
部署完成后,虚拟机仪表盘还会实时展示显卡的 3D 渲染、视频编解码负载:
四、常见问题速查
| 症状 | 原因与处理 |
|---|---|
nvidia-smi报 GPU access blocked | 检查/dev/dxg与load-dxg-late.service是否就绪;先卸载 NVIDIA 官方驱动 |
| SDDM 报 Failed to read display number | Xorgkmsdev选错,脚本在 Arch + 图形模式下会自动写入 modesetting 配置 |
| Vulkan 报 Found no drivers | ICD 选错,检查VK_ICD_FILENAMES是否指向 Dozen 的dzn_icd.json |
SSH 下glxinfo报 unable to open display | 无图形会话DISPLAY未设置,属正常现象,不影响 Vulkan/D3D12 |
更完整的手动部署对照、主机侧 PowerShell 命令与验证方法,可查阅项目内的 doc/Linux.md;内核补丁参考 src/Linux/script/patches/ 下的 WSL 5.15 / 6.6 GPU-PV 支持补丁。
五、写在最后
ExHyperV 把"GPU 分区 → MMIO 优化 → 驱动解析 → SFTP 上传 → SSH 脚本执行 → 重启续跑"这条原本要写几十行脚本的链路,压缩成了图形界面的几次点击。对新手而言,你只需要记住三句话:选显卡、填 SSH、看日志,然后享受在 Linux 虚拟机里跑 CUDA 和 Vulkan 的乐趣吧 🎮
【免费下载链接】ExHyperVThe Excalibur of Hyper-V / Hyper-V 神器项目地址: https://gitcode.com/gh_mirrors/ex/ExHyperV
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考