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用以下的脚本会快些