Windows下直通GPU设备到Hyper-V的Ubuntu虚拟机
本文最后更新于:2024年5月21日 晚上
前言
在Windows下安装了一个基于Hyper-V的Ubuntu作为服务器,前段时间在该服务器上有使用GPU的需求,于是开始研究如何将Windwos的GPU设备直通到虚拟机上。
步骤
在Windows上添加GPU分区到虚拟机
使用管理员权限打开PowerShell,执行下面命令。将
替换为Hyper-V虚拟机的名字。 1
2Set-VM -VMName <vmname> -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1GB -HighMemoryMappedIoSpace 32GB
Add-VMGpuPartitionAdapter -VMName <vmname>执行完上面的命令后,可以在你的虚拟机执行下面的命令查看设备,如果能正确看到有设备列出,说明GPU分区已经添加成功了。
1
sudo lspci -v
安装dxgkrnl驱动
参考 Ubuntu 21.04 VM with GPU acceleration under Hyper-V…?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#!/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在虚拟机里,将上面的sh代码写到一个文件,比如driver.sh。BRANCH的值根据你的系统进行替换,可以执行uname -a查看具体需要替换的版本。然后执行下面的命令安装驱动
1
bash driver.sh
从宿主机中拷贝GPU驱动到虚拟机
这里主要有两部分的驱动需要拷贝
- 将宿主机中 xxx/Windows/System32/lxss/lib/* 的文件拷贝到虚拟机中的 /usr/lib/wsl/lib/
- 将宿主机中 xxx/Windows/System32/DriverStore/FileRepository/nvmdsi.inf_amd64_* 的目录拷贝到虚拟机中的 /usr/lib/wsl/drivers/
然后修改驱动的权限
1
chmod -R 0555 /usr/lib/wsl
配置动态链接库搜索路径并更新
1
2echo "/usr/lib/wsl/lib" > /etc/ld.so.conf.d/ld.wsl.conf
ldconfig重启虚拟机
1
2ls -l /dev/dxg
/usr/lib/wsl/lib/nvidia-smi重启后执行上面的命令,查看能否正常输出。如果输出正常的话,说明GPU直通成功了。(也可以将nvidia-smi直接拷贝到/usr/lib/ 目录下,这样就可以直接输入nvidia-smi执行)
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!