2024年10月

宿主机环境:
windows service 2025 数据中心版

虚拟机:ubuntu 22.04

注:
1、测试过ubuntu 24.04,但是微软官方的WSL2-Linux-Kernel暂未支持到24.04,折腾失败,用22.04可正常使用

2、暂时略过怎么安装Hyper-V的过程,网上资料很多

踩坑点:

1、Hyper-V安装Linux虚拟机,需要关闭设置=>安全=>启用安全启动
2、windows service配置直通后,可能会出现虚拟机无法启动的情况
3、出现错误:/sbin/ldconfig.real: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link,需要重新生成软连接,正文会详细讲解

步骤

1. 在 Windows 上添加 GPU 分区到虚拟机

使用管理员权限打开 PowerShell,执行下面命令。将 <vmname> 替换为 Hyper-V 虚拟机的名字。

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

执行完上面的命令后,可以在你的虚拟机执行下面的命令查看设备,如果能正确看到有设备列出,说明 GPU 分区已经添加成功了。

sudo lspci -v

2. 安装 dxgkrnl 驱动

参考 Ubuntu 21.04 VM with GPU acceleration under Hyper-V…?

创建一个脚本文件,例如 driver.sh,内容如下:

#!/bin/bash -e
BRANCH=linux-msft-wsl-5.10.y

if [ "$EUID" -ne 0 ]; then
    echo "Swithing to root..."
    exec sudo $0 "$@"
fi

apt-get install -y git dkms

git clone -b $BRANCH --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel
cd WSL2-Linux-Kernel
VERSION=$(git rev-parse --short HEAD)

cp -r drivers/hv/dxgkrnl /usr/src/dxgkrnl-$VERSION
mkdir -p /usr/src/dxgkrnl-$VERSION/inc/{uapi/misc,linux}
cp include/uapi/misc/d3dkmthk.h /usr/src/dxgkrnl-$VERSION/inc/uapi/misc/d3dkmthk.h
cp include/linux/hyperv.h /usr/src/dxgkrnl-$VERSION/inc/linux/hyperv_dxgkrnl.h
sed -i 's/\$(CONFIG_DXGKRNL)/m/' /usr/src/dxgkrnl-$VERSION/Makefile
sed -i 's#linux/hyperv.h#linux/hyperv_dxgkrnl.h#' /usr/src/dxgkrnl-$VERSION/dxgmodule.c
echo "EXTRA_CFLAGS=-I\$(PWD)/inc" >> /usr/src/dxgkrnl-$VERSION/Makefile

cat > /usr/src/dxgkrnl-$VERSION/dkms.conf <<EOF
PACKAGE_NAME="dxgkrnl"
PACKAGE_VERSION="$VERSION"
BUILT_MODULE_NAME="dxgkrnl"
DEST_MODULE_LOCATION="/kernel/drivers/hv/dxgkrnl/"
AUTOINSTALL="yes"
EOF

dkms add dxgkrnl/$VERSION
dkms build dxgkrnl/$VERSION
dkms install dxgkrnl/$VERSION

注意:BRANCH 的值根据你的系统进行替换,可以执行 uname -a 查看具体需要替换的版本。

然后执行下面的命令安装驱动:

bash driver.sh

3. 从宿主机中拷贝 GPU 驱动到虚拟机

这里主要有两部分的驱动需要拷贝:

  1. 将宿主机中 xxx/Windows/System32/lxss/lib/* 的文件拷贝到虚拟机中的 /usr/lib/wsl/lib/
  2. 将宿主机中 xxx/Windows/System32/DriverStore/FileRepository/nvmdsi.inf_amd64_* 的目录拷贝到虚拟机中的 /usr/lib/wsl/drivers/

这是正常的copy的方式,当然,如果你本机已经安装了wsl,可以直接copy wsl的/usr/lib/wsl/直接到虚拟机中的/usr/lib/wsl/

copy完成后修改驱动的权限:

chmod -R 0555 /usr/lib/wsl

4. 配置动态链接库搜索路径并更新

直接copy过来的libcuda.so.1软链接是不能使用的,需要删除重新生成软连接

sudo rm /usr/lib/wsl/lib/libcuda.so.1
sudo ln -s libcuda.so /usr/lib/wsl/lib/libcuda.so.1

之后配置动态链接库搜索路径并更新

echo "/usr/lib/wsl/lib" > /etc/ld.so.conf.d/ld.wsl.conf
ldconfig

5. 重启虚拟机

【重启,到这没报错就重启虚拟机】
重启后执行下面的命令,查看能否正常输出:

ls -l /dev/dxg
/usr/lib/wsl/lib/nvidia-smi

如果输出正常的话,说明 GPU 直通成功了。(也可以将 nvidia-smi 直接软连接到 /usr/bin/ 目录下,这样就可以直接输入 nvidia-smi 执行)




参考资料:

https://blog.vogelcs.com/2024/05/21/Windows%E4%B8%8B%E7%9B%B4%E9%80%9AGPU%E8%AE%BE%E5%A4%87%E5%88%B0Hyper-V%E7%9A%84Ubuntu%E8%99%9A%E6%8B%9F%E6%9C%BA/

【hyper-v虚拟机安装ubuntu,免费开源linux桌面操作系统,详细安装教程】 https://www.bilibili.com/video/BV1QG411e7pn/?share_source=copy_web&vd_source=a8cb3aa675ec9bad747e8b96437b52da

【虚拟机打游戏,Hyper-V使用独立显卡教程】 https://www.bilibili.com/video/BV1o84y1y7i3/?share_source=copy_web&vd_source=a8cb3aa675ec9bad747e8b96437b52da