WSL2 默认已经使用了 GPU 半虚拟化(GPU-PV)来进行 3D 加速,GPU-PV 是 RemoteFX 的替代品,但是 GPU-PV 在 Hyper-V 虚拟机启用却比较复杂,Windows 的教程已经有人写了,所以分享下 Hyper-V Linux 虚拟机配置 GPU-PV 的教程

准备

  • 一个 Hyper-V Linux 虚拟机,内核版本是 5.15 或 6.0 或 6.1,内核头已安装
  • 一个 WSL 2 虚拟机(提取驱动用,提取后可删除,尽量和 Hyper-V 虚拟机使用相同的操作系统)
  • Windows 10 最新版本或 Windows 11,x86/x86-64 架构(似乎 ARM 做不到,我没测试)

测试环境

我会使用我喜欢的环境进行测试,如果你正在使用相同的环境,应该可以直接照抄我的命令,如果你正在使用其他发行版或其他硬件,操作步骤可能会有差别

  • Windows 11 22H2
  • Arch Linux VM,内核:linux-lts
  • NVIDIA GeForce RTX 4070 Ti

HV 虚拟机设置

1 - 关闭动态内存

开启动态内存后,GPU-PV 不能正常工作,所以直接为虚拟机设置足够的内存和 swap 并禁用动态内存,这一步骤应该比较简单
Disable dynamic memory hyperv

2 - 添加 GPU-PV 硬件

首先确保虚拟机已关机,然后按下 Win+X(或右键开始菜单),选择任意一个:

  • 命令提示符(管理员)
  • PowerShell(管理员)
  • 终端(管理员)
    terminal admin

在弹出的窗口中输入这三行命令,每一行结束后,都请按 Enter 键

  • pwsh
1
2
3
pwsh
Set-VM -VMName <vmname> -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1GB -HighMemoryMappedIoSpace 32GB
Add-VMGpuPartitionAdapter -VMName <vmname>

其中 <vmname> 替换为你虚拟机的名称。

完成此步骤后,打开虚拟机并执行 lspci 命令,检查 GPU-PV 设备是否已经成功安装

如果输出中包含 b98b:00:00.0 3D controller: Microsoft Corporation Basic Render Driver,则说明已正确安装设备

驱动安装

3 - WSL 驱动

进入 WSL 的终端,运行命令:

  • sh
1
tar -cvf - /usr/lib/wsl | zstd -T0 > drivers.tzst

将 drivers.tzst 拷贝至 Hyper-V 虚拟机根目录(使用任何你喜欢的方式),然后解压:

  • sh
1
2
unzstd drivers.tzst
tar xvf drivers.tar

然后复制驱动到 /lib:

  • sh
1
cp /usr/lib/wsl/lib/* /usr/lib

如果是 NVIDIA 显卡,还需要额外安装 nvidia-smi

  • sh
1
cp /usr/lib/wsl/lib/nvidia-smi /usr/bin

4 - 安装 DirectX 驱动

GPU-PV Linux 使用的 DirectX 驱动名为 dxgkrnl,直接使用 makepkg 进行安装:

  • sh
1
2
3
4
5
cd /tmp
git clone https://github.com/MBRjun/dxgkrnl-dkms-lts
cd dxgkrnl-dkms-lts
makepkg -si
modprobe dxgkrnl
  • 仅适用于 6.0 或 6.1 内核,如果是 5.15 内核,可以直接尝试 yay -Sy dxgkrnl-dkms-git 其他内核你需要自己搬驱动

5 - 安装 mesa

  • sh
1
pacman -Sy mesa mesa-utils

6 - 检查是否成功安装

完成上面五个步骤,需要先重启系统

  • sh
1
2
ls /dev/dxg -l
lspci -v

如果 /dev/dxg 存在,则 DX 驱动已正常安装

  • txt
1
2
3
4
5
6
7
crw-rw-rw- 1 root root 10, 119 Aug 26 18:24 /dev/dxg
b98b:00:00.0 3D controller: Microsoft Corporation Basic Render Driver
Physical Slot: 600853645
Flags: bus master, fast devsel, latency 0, NUMA node 0
Capabilities: [40] Null
Kernel driver in use: dxgkrnl
Kernel modules: dxgkrnl

7 - 检查 NVIDIA 显卡信息和 CUDA 信息

运行 nvidia-smi

nvidia-smi