«

linux GPU分区(失败)

学长 发布于 阅读:462 硬件


GPU Paravirtualization Hyper-V with Linux Guest - Hardware Hub / GPU - Level1Techs Forums

Discrete Device Assignment -- GPUs | Microsoft Community Hub

Ubuntu 21.04 VM with GPU acceleration under Hyper-V...? · GitHub

最终采用的是这个。。。staralt/dxgkrnl-dkms: GPU-P (dxgkrnl) on Hyper-V Linux VM with Latest Kernel

第一步:

Get-VMPartitionableGpu

当然会提醒现在最新的指令是这个名字:Get-VMHostPartitionableGpu

GPU可以分

我的是

ValidPartitionCounts    : {32}
PartitionCount          : 32

接着确定

Use Generation 2
DISABLE dynamic memory (it interferes with vGPU on Windows so it probably won't work on Linux either, I didn't check this yet though)
DISABLE automatic snapshots (they are not supported with vGPU and will only cause problems)
DISABLE secure boot (we'll need custom kernel drivers, and I never tried to make this work with secure boot)
Don't forget to add more CPU cores because the stupid wizard still adds only one vCPU...
  1. 二代的,也就是EFI的
  2. 不要使用动态内存
  3. 不要启动自动快照(检测点?)
  4. 关闭安全引导

复制主机中的显卡驱动到虚拟机中,linux这步无法实现。。。

第二步:

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

lspci可以看到具体添加的显卡但是没有驱动。。。

查看添加状况,执行一次 Add-VMGpuPartitionAdapter -VMName <vmname>就会分配一个 PartitionId

Get-VMGpuPartitionAdapter -VMName <vmname>
查看具体分配了几个,一般是从0开始
分配多了就
`Remove-VMGpuPartitionAdapter -VMName <vmname>`
但这样会删除全部分配给该VM的GPU 分区 ID
通过 `Get-VMGpuPartitionAdapter -VMName <vmname>`获得对应虚拟机分配出去的GPU分区的Id 然后复制给下面的
通常格式是跟在 `Id :`后面 `Microsoft:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` 微软后面加上8-4-4-4-12\8-4-4-4-12的16进制编码的结构。。。这个复制下来作为 `<IDString>`
对应的Id的有三四个,找起来最快的是加上 `|findstr "Microsoft:"`
Remove-VMGpuPartitionAdapter -VMName <vmname> -AdapterId <IDString>

就可以移除具体分配多的显卡分区
具体的VRAM限定通过这个
Set-VMGpuPartitionAdapter (Hyper-V)
对应的是字节,默认的 1000000000就是1G
具体例子:

Set-VMGpuPartitionAdapter -VMName <vmname> -AdapterId <IDString> -MaxPartitionVRAM 2000000000

诶。。。只有 -MinPartitionVRAM -MaxPartitionVRAM并没有 CurrentPartitionEncode的选项。。。别问我为什么。。。微软这样做的。。。具体参考上面微软的指令。。。

下面就是怎么给虚拟机安装微软的驱动了

第三步

我把这个文件保存成wsl2.sh

#!/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

运行前先改变分区读写

mount |grep ro, |grep boot|awk '{print $1}'| xargs -i sudo mount -o remount,rw '{}'

然后再运行这个脚本

sudo bash wsl2.sh
有错误。。。
大概是因为有依赖包 apt-get install -y git dkms没有真正的执行起来

sudo apt install --no-install-recommends

嗯。。。为unbuntu21.04准备的。。。还是自己安装GitHub - microsoft/WSL2-Linux-Kernel: The source for the Linux kernel used in Windows Subsystem for Linux 2 (WSL2)???

所以
再来个

第三步

下载最新的
wsl2-linux-kernel
我开启了 smb直接复制到 linux下了,因为。。。
git太慢了。。。

试着 make了下需要生成

config make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl

缺一堆文件

sudo apt install pkg-config libncurses-dev flex bison

额。。。其实就是个 tui的编辑 config编辑器。。。如果不改变。。。删掉config的支持文件: sudo apt remove pkg-config libncurses-dev flex bison直接 make KCONFIG_CONFIG=Microsoft/config-wsl && make INSTALL_MOD_PATH="$PWD/modules" modules_install呃。。。bison flex还是是需要的。。。还有bc, gelf.h 来自libelf-dev 诶。。。一样一堆错误。。。 还是试试给的linux-msft-wsl-5.10.y吧。。。把 VERSION=$(git rev-parse --short HEAD)改成 git做版本号没法拿到对应的。。。VERSION=$(uname -r)

因为安装了 sudo apt install bison flex bc libelf-dev错误少了很多。。。
但是

Sign command: /lib/modules/6.6.44-production+truenas/build/scripts/sign-file

这个错误。。。众所周知。。。debian干嘛要给驱动签名呢?大家都不是 secure boot。。。所以我看看看怎么把这个通过 config去掉。。。

跑了几遍那个脚本发现,安装 wsl2 kernel并不重要,他的目的是把 wsl2带的驱动打包到 linux的内核中,并且不是通过 make微软的那个包,而是直接 cp ln过去。然后具体的打包到 kernel的办法是通过 dkms,也就是说报没有签名是 dkms报的。。。也就是说只要把 dkms 对应的 dkms.conf配合号不签名就行?我不知道是不是可行的。已经在其论坛上询问。。。Try to install hyper v driver to Truenas scale再搜索下dkms.conf相关的设置不需要签名的内核驱动

Enabling SecureBoot on TrueNAS SCALE | TrueNAS Community

Any possible way of installing a driver. | TrueNAS Community

然后在其官方github中发现了些好玩的:

linux/drivers/hv at truenas/linux-6.6 · truenas/linux · GitHub hyper v的驱动,显然没有显卡分区的

GitHub - truenas/truenas-installer: Repo with scripts for TrueNAS installation on Debian 在debian上安装truenas

还有更简便的:

staralt/dxgkrnl-dkms: GPU-P (dxgkrnl) on Hyper-V Linux VM with Latest Kernel

最后还是用了上面的这个


虚拟机是Windows用以下的脚本会快些

GitHub - jamesstringerparsec/Easy-GPU-PV: A Project dedicated to making GPU Partitioning on Windows easier!

GitHub - timminator/Enhanced-GPU-PV: A Project dedicated to making GPU Partitioning on Windows easier! Now with Sunshine and Virtual Display Driver support!


扫描二维码,在手机上阅读