[Hyper-V] [Ubuntu] vGPU 半虚拟化
Hyper-V vGPU 半虚拟化 (Windows) 教程
网上中文的Windows的vGPU半虚拟化教程挺多的, 但是Linux却非常少, 写的也基本不太清楚, 所以自己写一个教程. 如果需要其他Linux发行版的vGPU半虚拟化也是类似的思路.
添加 vGPU
首先, 创建一个Hyper-V Ubuntu虚拟机. 这里以 Ubuntu2204
为例
创建并安装完成虚拟机后关机, 关闭检查点/动态内存/安全启动
使用管理员身份打开Powershell. 输入以下代码(添加GPU分区后无法修改内存分配大小, 如果需要更改内存分配, 先执行Remove-VMGpuPartitionAdapter -VMName $vmName
再修改, 修改后再执行下面的代码)
$vmName = "Ubuntu2204" # 这里替换成你的虚拟机名称
Set-VM -GuestControlledCacheTypes $true -VMName $vmName
Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vmName
Set-VM -HighMemoryMappedIoSpace 32Gb -VMName $vmName
Add-VMGpuPartitionAdapter -VMName $vmName
提取 WSL2驱动
因为WSL2有官方的vGPU驱动, 所以使用同版本(Ubuntu2204)WSL2提取vGPU驱动
打开WSL2, 输入指令提取vGPU驱动, 同时查看WSL2 的 Linux内核版本, 待会要用
tar -cvf - /usr/lib/wsl | zstd -T0 > drivers.tzst
uname -r
安装 WSL2驱动
转到Hyper-V Ubuntu2204 虚拟机, 复制drivers.tzst到根目录下
sudo mv drivers.tzst /
解压并复制WSL2驱动
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驱动
安装 自定义内核
DierctX驱动(dxgkrnl)需要根据Linux内核版本来安装(支持的内核列表), 而ubuntu2204默认的内核为最新的6.8.0, 所以需要给Hyper-V虚拟机安装一个支持DierctX驱动的内核(建议直接安装WSL2的同款内核).
在 Hyper-V Ubuntu2204 虚拟机 中输入以下指令查看Linux内核
uname -r
可以看到官方镜像的内核太新了, 现在给 Hyper-V Ubuntu2204 虚拟机 编译一个WSL2同版本内核.
转到Ubuntu的内核网站
https://kernel.ubuntu.com/mainline/v5.15.153/ # 替换为你的WSL2内核版本
复制这4个包的地址, wget下载下来
wget https://kernel.ubuntu.com/mainline/v5.15.153/amd64/linux-headers-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb
wget https://kernel.ubuntu.com/mainline/v5.15.153/amd64/linux-headers-5.15.153-0515153_5.15.153-0515153.202403262020_all.deb
wget https://kernel.ubuntu.com/mainline/v5.15.153/amd64/linux-image-unsigned-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb
wget https://kernel.ubuntu.com/mainline/v5.15.153/amd64/linux-modules-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb
安装这个版本的内核
sudo dpkg -i linux-headers-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb \
linux-headers-5.15.153-0515153_5.15.153-0515153.202403262020_all.deb \
linux-image-unsigned-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb \
linux-modules-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb
rm -rf linux-headers-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb \
linux-headers-5.15.153-0515153_5.15.153-0515153.202403262020_all.deb \
linux-image-unsigned-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb \
linux-modules-5.15.153-0515153-generic_5.15.153-0515153.202403262020_amd64.deb
输入以下指令查看已安装的内核
dpkg --list | grep linux-image
可以看到5.15的内核已经成功安装了
启动 自定义内核
sudo nano /etc/default/grub
修改内容为
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.153-0515153-generic"
更新grub
sudo update-grub
重启 Hyper-V Ubuntu2204 虚拟机, 查看内核版本, 可以看到已经切换到5.15.153了
uname -r
安装 DierctX驱动
新建一个脚本
sudo nano driver.sh
填入以下内容
#!/bin/bash -e
BRANCH=linux-msft-wsl-5.15.153.1
# 你的内核版本
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
运行这个脚本
sudo bash driver.sh
rm -rf WSL2-Linux-Kernel/
rm -rf driver.sh
重启 Hyper-V Ubuntu2204 虚拟机, 输入以下命令检查vGPU是否正常工作
lspci -v
ls /dev/dxg -l
nvidia-smi
如何看到正常输入则说明vGPU半虚拟化工作正常.
修复 WSL2 驱动 SSH BUG
编辑.bashrc 添加环境变量
nano /root/.bashrc
添加以下内容
export PATH=/usr/lib/wsl/lib:$PATH
更新环境变量
source ~/.bashrc