在 Linux 虚拟机里跑 GPU:ExHyperV SSH 自动化部署 GPU-PV 全流程
2026/9/17 10:33:48 网站建设 项目流程

在 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 之前,先确认两件事:

  1. GPU 可分区:NVIDIA 30/40/50 系、AMD 部分独显支持Msvm_PartitionableGpu分区,Intel 核显走的是另一条 WDDM 直通路线(本文不展开)。
  2. 虚拟机满足 GPU 要求:需要开启「来宾控制缓存类型」(GuestControlledCacheTypes)并放大高位 MMIO 间隙(通常 64GB 起步)。

好消息是这两项ExHyperV 都会自动检查与优化

  • 检查逻辑:VmGpuService.cs 中的CheckVmForGpuAsync直接读 WMI 的HighMmioGapSizeGuestControlledCacheTypes,不达标时调用OptimizeVmForGpuAsync自动改写配置。
  • 主机策略:HyperVGpuPolicyService.cs 负责放开"不支持 GPU 分配"的拦截,让非官方显卡也能上机。

⚠️ 小提示:如果虚拟机里还装着 NVIDIA 官方驱动,建议先卸载——它会和dxgkrnl抢占 GPU 访问权,导致nvidia-smiGPU access blocked by the operating system

三、开始部署:图形界面四步走

1️⃣ 打开 GPU 设置,选择脚本

进入目标 Linux 虚拟机的显卡设置页,点击「添加 GPU」。程序会列出主机所有显卡:

选中要分配的显卡后,Linux 部署面板会让你选择部署脚本。内置脚本清单来自 src/Linux/script/index.json,目前有:

脚本特性
Ubuntu-22.04-OfficialCUDA ✅ / Mesa ✅,版本 1.1.0
Ubuntu-24.04-OfficialCUDA ✅ / Mesa ❌,版本 1.0.2
fnOS-HyperV-GPU-PVfnOS 定制版(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 = DozendeviceName = Microsoft Direct3D12 (...)就是大功告成。

最终效果:Ubuntu 22.04 虚拟机内,Blender 的 CUDA 渲染设备里赫然出现物理显卡 RTX 4080 SUPER——这就是 GPU-PV 的威力:

部署完成后,虚拟机仪表盘还会实时展示显卡的 3D 渲染、视频编解码负载:

四、常见问题速查

症状原因与处理
nvidia-smi报 GPU access blocked检查/dev/dxgload-dxg-late.service是否就绪;先卸载 NVIDIA 官方驱动
SDDM 报 Failed to read display numberXorgkmsdev选错,脚本在 Arch + 图形模式下会自动写入 modesetting 配置
Vulkan 报 Found no driversICD 选错,检查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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询