Windows直通GPU到Hyper-V的Ubuntu虚拟机
宿主机环境:
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 驱动到虚拟机
这里主要有两部分的驱动需要拷贝:
- 将宿主机中
xxx/Windows/System32/lxss/lib/*
的文件拷贝到虚拟机中的/usr/lib/wsl/lib/
- 将宿主机中
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