之前一致使用ESXI跑linux虚拟机来学习,最近添了一张显卡,只拿来在linux环境下跑AI有点浪费,偶尔还希望用来开发项目或打会游戏。所以折腾了两三天,把系统装回了win10系统,虽然在win10系统中,利用WSL2也可以使用显卡,但WSL2功能有所裁剪,很多场景无法满足使用。经过参考了别人的一些成功经验,最终在hyper-v中安装了ubuntu-server-24.04版本,使用vGPU直通显卡,可以正常跑AI应用。这里记录一下,供以后再安装的时候参考。

第一步、启用hyper-v

启用hyper-v,首先需要你的处理器和操作系统支持hyper-v。处理器至少需要64位处理器,并且支持硬件虚拟化技术(IntelVT-x或AMD-V)。在BIOS或UEFI设置中启用虚拟化功能。windows10或者windows11的专业版或者企业版均支持hyper-v,win10家庭版默认不支持,网络上也可以搜到开启的方法。

在程序和功能中,勾选上hyper-v,即可启用hyper-v功能。

image-20250614163649459

第二步、安装wsl2并导出显卡驱动

安装wsl2是为了导出其中的显卡驱动,如果hyper-v中的虚拟机显卡使用正常,之后使用过程中又不需要wsl2,则可关闭掉wsl2功能。

启用WSL2功能

打开“适用于Linux的Windows子系统”(Windows Subsystem for Linux)和“虚拟机平台”(Virtual Machine Platform)两个功能。可直接使用以下命令实现:

1
2
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

安装ubuntu24.04

在powershell中依次执行下面的命令,来安装wsl版本的ubuntu24.04

1
2
3
wsl --update
wsl --set-default-version 2
wsl --install -d Ubuntu-24.04

执行下面的命令来启动ubuntu24.04。首次启动时,系统会引导创建用户名和密码。

1
wsl -d Ubuntu-24.04

进入wsl2的ubuntu24.04后,执行下面的命令查看WSL2的内核版本,这个版本的信息后面会使用到。

1
uname -r

导出显卡驱动

进入wsl2的ubuntu24.04,执行下面的命令,将WSL2中的显卡驱动导出。

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

导出来的文件在wsl2的目录下,可以把这个文件拷贝到本机的硬盘中,方便后面的操作。

image-20250613182342083

安装ubuntu虚拟机

通过Hyper-V管理器安装ubuntu虚拟机,所安装的ubuntu版本需要与WSL2中支持的版本一致(不一致的情况下能不能跑通,并没有尝试过,大概率是不行)。我这里安装的是 ubuntu-server-24.04,iso文件可以从ubuntu官网下载。之前尝试过 ubuntu-server-22.04,但是内核版本在升级到与WSL2的6.6.87一致的时候有很多依赖冲突,不太好处理,因此放弃了,最终选择了24.04版本。

https://ubuntu.com/download/server

安装过程就不赘述了,注意需要禁用检查点。

切换虚拟机内核

需要将虚拟机的内核版本更换为与WSL2的内核版本一致,比如目前(2025年6月)安装的WSL2内核版本是6.6.87.1,而ubuntu-server 24.04默认安装的内核版本是6.8,因此需要在虚拟机中安装一个6.6.87.1的内核版本并使用这个内核版本。WSL2的内核版本就是第二步中“安装ubuntu24.04”章节执行 uname -r 所查看到的版本信息。

可以从下面的链接下载内核文件:

https://kernel.ubuntu.com/mainline/v6.6.87/

1
2
3
4
wget https://kernel.ubuntu.com/mainline/v6.6.87/amd64/linux-headers-6.6.87-060687-generic_6.6.87-060687.202504101344_amd64.deb
wget https://kernel.ubuntu.com/mainline/v6.6.87/amd64/linux-headers-6.6.87-060687_6.6.87-060687.202504101344_all.deb
wget https://kernel.ubuntu.com/mainline/v6.6.87/amd64/linux-image-unsigned-6.6.87-060687-generic_6.6.87-060687.202504101344_amd64.deb
wget https://kernel.ubuntu.com/mainline/v6.6.87/amd64/linux-modules-6.6.87-060687-generic_6.6.87-060687.202504101344_amd64.deb

安装刚才下载下来的4个内核安装包。

1
dpkg -i linux-*.deb

如果安装过程中没有异常,输入以下指令查看已安装的内核:

1
dpkg --list | grep linux-image

启动自定义内核

编辑 /etc/default/grub 文件,设置使用自定义的内核启动。

1
sudo vim /etc/default/grub

修改内容为,后面的 6.6.87-060687-generic 是内核的名称

1
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.6.87-060687-generic"

重启后检查一下内核版本是否切换完成。

1
uname -r

如果内核版本切换没有问题,可以先将虚拟机关机,进入下面设置虚拟机vGPU的步骤。

设置虚拟机vGPU

通过powershell设置下面的虚拟机参数,给虚拟机添加GPU分区适配。注意:

1、这些参数设置后,虚拟机内存参数将不能调整,需要通过“Remove-VMGpuPartitionAdapter -VMName $vmName”删除GPU分区后才能调整内存。 所以添加GPU分区前,最好把虚拟机内存设置好。

2、如果powershell执行过程中报错,请检查一下是否是用的管理员权限执行的。

下面是添加GPU分区适配的命令,在powershell中依次执行即可。

1
2
3
4
5
$vmName = "ubuntu2404"
Set-VM -GuestControlledCacheTypes $true -VMName $vmName
Set-VM -LowMemoryMappedIoSpace 1GB -VMName $vmName
Set-VM -HighMemoryMappedIoSpace 32GB -VMName $vmName
Add-VMGpuPartitionAdapter -VMName $vmName

安装驱动

将第二步导出来的 drivers.tzst 文件传到虚拟机内部,可以使用多种方式把文件传输到虚拟机,比如xftp,putty等工具。将文件传送到虚拟机后,移动drivers.tzst文件到根目录下,并执行下面的命令将文件解压到正确的位置。

1
sudo mv drivers.tzst /

解压并复制WSL2驱动:

1
2
3
4
5
6
7
8
sudo -i
cd /
unzstd drivers.tzst
tar xvf drivers.tar
cp /usr/lib/wsl/lib/* /usr/lib
cp /usr/lib/wsl/lib/nvidia-smi /usr/bin
rm -rf drivers.tzst
rm -rf drivers.tar

安装 DierctX驱动

在虚拟机中新建一个脚本,脚本内容如下,其中的 BRANCH 为 WSL2 仓库中所对应内核的分支名称,VERSION为内核的版本号。

注意:

如果虚拟机中无法访问github,可以先手动下载wsl2的release包,然后上传到虚拟机中,文件夹命名为WSL2-Linux-Kernel,然后将git clone那一行注释掉。

 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
#!/bin/bash -e
BRANCH=linux-msft-wsl-6.6.y
VERSION=6.6.87.1

apt-get install -y git dkms

git clone -b $BRANCH --depth=1 https://github.com/microsoft/WSL2-Linux-Kernel
cd WSL2-Linux-Kernel


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

运行上述脚本:

1
sudo bash driver.sh

验证效果

重启 Hyper-V Ubuntu2404 虚拟机, 输入以下命令检查vGPU是否正常工作:

1
2
3
lspci -v
ls /dev/dxg -l
nvidia-smi

如果出现类似下面的界面,则表示安装成功了。

image-20250621102904878

后记 - 安装CUDA环境

可以按照正常的ubuntu系统去安装cuda环境,比如上面驱动中的cuda版本是12.6,就去nvidia官方下载cuda-toolkit-12.6的版本。

https://developer.nvidia.com/cuda-12-6-0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=24.04&target_type=deb_local

image-20250613181558842

按照这里的指引来安装cuda-toolkit-12.6

1
2
3
4
5
6
7
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-ubuntu2404.pin
sudo mv cuda-ubuntu2404.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.6.0/local_installers/cuda-repo-ubuntu2404-12-6-local_12.6.0-560.28.03-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2404-12-6-local_12.6.0-560.28.03-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2404-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-6

设置CUDA_HOME

在 /etc/profile 最后添加下面的配置:

1
2
3
export CUDA_HOME=/usr/local/cuda-12.6
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH

添加完成后使用source命令更新一下:

1
source /etc/profile

验证一下命令是否正常。

1
nvcc -V

image-20250621103239777

参考文章

https://blog.onanii0721.website/archives/hypervgpulinux