[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


[Hyper-V] [Ubuntu] vGPU 半虚拟化
http://localhost:8090/archives/hypervgpulinux
作者
Gzcheng
发布于
2024年10月25日
更新于
2024年11月02日
许可协议