linux GPU分区(失败)
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...
- 二代的,也就是EFI的
- 不要使用动态内存
- 不要启动自动快照(检测点?)
- 关闭安全引导
复制主机中的显卡驱动到虚拟机中,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用以下的脚本会快些