Windows下直通GPU设备到Hyper-V的Ubuntu虚拟机

本文最后更新于:2024年5月21日 晚上

前言

在Windows下安装了一个基于Hyper-V的Ubuntu作为服务器,前段时间在该服务器上有使用GPU的需求,于是开始研究如何将Windwos的GPU设备直通到虚拟机上。

步骤

  1. 在Windows上添加GPU分区到虚拟机

    使用管理员权限打开PowerShell,执行下面命令。将 替换为Hyper-V虚拟机的名字。

    1
    2
    Set-VM -VMName <vmname> -GuestControlledCacheTypes $true -LowMemoryMappedIoSpace 1GB -HighMemoryMappedIoSpace 32GB
    Add-VMGpuPartitionAdapter -VMName <vmname>

    执行完上面的命令后,可以在你的虚拟机执行下面的命令查看设备,如果能正确看到有设备列出,说明GPU分区已经添加成功了。

    1
    sudo lspci -v
  2. 安装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
  3. 从宿主机中拷贝GPU驱动到虚拟机

    这里主要有两部分的驱动需要拷贝

    1. 将宿主机中 xxx/Windows/System32/lxss/lib/* 的文件拷贝到虚拟机中的 /usr/lib/wsl/lib/
    2. 将宿主机中 xxx/Windows/System32/DriverStore/FileRepository/nvmdsi.inf_amd64_* 的目录拷贝到虚拟机中的 /usr/lib/wsl/drivers/

    然后修改驱动的权限

    1
    chmod -R 0555 /usr/lib/wsl

  4. 配置动态链接库搜索路径并更新

    1
    2
    echo "/usr/lib/wsl/lib" > /etc/ld.so.conf.d/ld.wsl.conf
    ldconfig
  5. 重启虚拟机

    1
    2
    ls -l /dev/dxg
    /usr/lib/wsl/lib/nvidia-smi

    重启后执行上面的命令,查看能否正常输出。如果输出正常的话,说明GPU直通成功了。(也可以将nvidia-smi直接拷贝到/usr/lib/ 目录下,这样就可以直接输入nvidia-smi执行)