在bhyve中实现NVIDIA GPU passthrough
备注
NVIDIA官方提供了 FreeBSD x64 Graphics Driver Archive ,即最新的FreeBSD显卡驱动。但是很不幸,CUDA并不支持FreeBSD,所以无法直接将FreeBSD作为 Machine Learning 平台。
警告
本文记录的通过补丁方式来解决NVIDIA GPU passthrough可能不是我遇到问题的解决方法:
我使用了发行版原生的 bhyve
,也尝试了本文记录的补丁方式,但是都 没有解决 Nvidia Tesla P10 GPU运算卡 passthrough 给 bhyve 虚拟机时无法启动虚拟机的问题
但是我硬件改成 Nvidia Tesla P4 GPU运算卡 ,结果就成功启动了虚拟机,然而很不幸,不能正常初始化驱动,所以最终还是没有能够正常使用。目前使用了补丁版本( 我准备回滚到发行版本再重新尝试 ),但是我目前暂时放弃。准备等年底 RELEASE 15 再重新尝试。
目前我没有能够完成 bhyve NVIDIA GPU passthru
我在尝试 bhyve PCI Passthrough快速起步 将 Nvidia Tesla P10 GPU运算卡 passthrough 给 bhyve 虚拟机,但是遇到无法启动虚拟机的问题,不论是直接使用 bhyve
命令还是通过 vm-bhyve 管理工具。这个问题困挠了我很久...
GPU passthrough for bhyve on FreeBSD 14 解释了为何网上说 "bhyve支持PCI设备passthrough,但是不支持GPU passthru" 是一个误解: 真实原因是NVIDIA驱动仅支持KVM信号的hypervisor,对于bhyve则需要补丁才行。
bhyve Current state of bhyve Nvidia passthrough? 也提示采用 GPU passthrough for bhyve on FreeBSD 14 介绍的补丁方法,有人验证在 14.3 上也能工作。这个讨论线索中 原帖讨论中 c-c-c-c 提供的patch文件 ,可以直接应用到14.3
但是,但是... 上述补丁是针对bhyve上运行的不同虚拟机传递 KVMKVMKVM
或者其他字符串,这个解决方法需要根据不同的NVIDIA硬件结合Guest系统进行调整,看起来并不是通用的方法。我在本文中尝试在 Nvidia Tesla P10 GPU运算卡 上实施就没有成功,让人非常迷惘。
警告
我在 Nvidia Tesla P10 GPU运算卡 实践本文的补丁方法没有成功,但是不代表此方法不能适用于你的NVIDIA设备,所以本文笔记或许也有参考价值。请自行验证...
另外,我 remake
新补丁方法,采用 使用INIPIN补丁在bhyve中实现NVIDIA GPU passthrough
很不幸,我最终实践没有成功passthru Nvidia Tesla P10 GPU运算卡 ,但是同样GPU核心但是内存和频率降级的 Nvidia Tesla P4 GPU运算卡 就非常成功使用 表现能启动虚拟机但无法初始化。我感觉这两款NVIDIA GPU在处理hypvervisor时候有一些区别
备注
在bhyve中实现Intel GPU passthrough 实现非常简单,标准方法操作就可以,不需要补丁(不过我还没有验证是否实际工作,所以还不能确定)
vm-bhyve
备注
使用 vm-bhyve 作为管理器来完成部署
安装
vm-bhyve
vm-bhyve
pkg install vm-bhyve bhyve-firmware
创建
vm-bhyve
使用的存储:
zfs create zdata/vms
#zfs set recordsize=64K zdata/vms
zfs create zdata/vms/.config
zfs create zdata/vms/.img
zfs create zdata/vms/.iso
zfs create zdata/vms/.templates
在
/etc/rc.conf
中设置虚拟化支持:
/etc/rc.conf
支持虚拟化# needed for virtualization support
vm_enable="YES"
vm_dir="zfs:zdata/vms"
在
/boot/loader.conf
添加:
/boot/loader.conf
# needed for virtualization support
vmm_load="YES"
初始化:
vm init
PCI passthru
检查 PCI 设备:
vm passthru
配置
/boot/loader.conf
屏蔽掉需要passthru的GPU :
1/0/0
和 Intel UHD Graphics P630 0/2/0
pptdevs="0/2/0 1/0/0"
重启系统
nvidia补丁(尝试一)
警告
我实践还存在问题,补丁和编译似乎没有问题,但是没有解决 passthru NVIDIA GPU 之后无法启动虚拟机的问题,VNC显示还是黑屏
警告
我这里使用的源代码可能搞错了,看起来应该使用 Backhoff自动化公司 freebsd-src 源代码的 phab/corvink/14.2/nvidia-wip
分支
我在 使用INIPIN补丁在bhyve中实现NVIDIA GPU passthrough 重新实践了一遍拉取代码 <= 请参考这篇实践笔记
参考 26.6.3. Updating the Source 根据
uname -r
获取当前安装的RELEASE,例如14.3-RELEASE
,则下载对应的源代码分支:
# 这步mv重命名会提示没有权限
mv /usr/src /usr/src.bak
git clone --branch releng/14.3 https://git.FreeBSD.org/src.git /usr/src
下载补丁
nvidia.patch.txt
(或者下载 原帖讨论中 c-c-c-c 提供的patch文件 ) 存放到/usr/src
目录中打上补丁:
cd /usr/src
git apply --verbose nvidia.patch.txt
编译和安装补丁过的内核:
sudo make -j8 buildkernel
sudo make installkernel
编译和安装 include, vmm, bhyve, bhyvectl, bhyveload:
cd /usr/src/include
make -j8
make install
cd /usr/src/sys/modules/vmm
make -j8
make install
cd /usr/src/usr.sbin/bhyve
make -j8
make install
cd /usr/src/usr.sbin/bhyvectl
make -j8
make install
cd /usr/src/usr.sbin/bhyveload
make -j8
make install
重启系统
nvidia补丁(尝试二)
ZioMario提供了一个编译安装脚本 我准备重新尝试一下
准备目录
cd /usr/
# 重命名目录可能不行,需要cp然后清空目录
#mv src src-old
#
mkdir bechoff-src
git clone https://github.com/beckhoff/freebsd-src /usr/bechoff-src
将下载的
setup.txt
build_branch.txt
build.txt
存放到一个目录下,并将后缀名修订为.sh
,然后执行:
./build_branch.sh origin/phab/corvink/14.2/nvidia-wip --without-bhf --verbose
备注
到这里,我发现我的 Nvidia Tesla P4 GPU运算卡 能够启动,但是 Nvidia Tesla P10 GPU运算卡 不能启动虚拟机。不过 Bhyve环境Ubuntu虚拟机运行Tesla P4 GPU的Docker 还是遇到passthru的GPU无法初始化的问题。
我可能还需要继续找寻方法:
GPU passthrough with bhyve - Corvin Köhne - EuroBSDcon 2023 演讲者就是开发bhyve passthru的Corvin Köhne,上述补丁应该是他提供的。我准备仔细看看视频
更换PCIe转接板,关闭 PCIe bifurcation 采用直接安装 Nvidia Tesla P10 GPU运算卡 (不太可能?)
等待年底 RELEASE 15 重新尝试
bhyve passthru
BIOS尝试
google AI提到bhyve不支持Linux中使用的 pci=realloc
内核配置,建议设置 pci=realloc=off
。我尝试了在Ubuntu虚拟机中配置 pci=realloc
或 pci=realloc=off
都没有解决无法初始化 Nvidia Tesla P4 GPU运算卡 驱动的问题,同样也没有启动 Nvidia Tesla P10 GPU运算卡 的虚拟机。
我也尝试关闭 Above 4G Decoding BIOS设置 :
之前为了能够实现和 HP DL360 Gen9 Large Bar Memory(Tesla P10) 效果,我特意配置 纳斯NASSE C246 ITX主板 BIOS 激活了:
Above 4G Decoding
(在 Advanced 菜单中)above 4GB mmio BIOS Assignment
(在 chipset 菜单中)
上述两个 Above 4G Decoding BIOS设置 不能disable,否则安装的 Nvidia Tesla P10 GPU运算卡 启动时BIOS会告警提示PCIE配置不满足设备要求,所以这两个配置看起来是正确的
我尝试了
Re-Size BAR Support
(该配置是为了加速NVIDIA性能,默认开启)关闭和开启都没有解决
总之,BIOS符合NVIDIA GPU的要求,看起来还是需要从 bhyve
这里寻找解决方法
配置
配置
/zdata/vms/.templates/x-vm.conf
(修订使用1/0/0
作为passthru
,以及使用tap0
作为网络接口, VNC使用5900端口):
/zdata/vms/.templates/x-vm.conf
loader="uefi"
cpu=4
memory=16G
wired_memory="yes"
network0_type="virtio-net"
network0_switch="igc0bridge"
network0_device="tap0"
disk0_name="disk0"
disk0_dev="sparse-zvol"
disk0_type="virtio-blk"
disk0_size="50G"
passthru0="1/0/0"
graphics="yes"
graphics_listen="0.0.0.0"
graphics_port="5900"
创建虚拟机
xdev
:
xdev
vm create -t x-vm -s 60G xdev
安装ubuntu:
vm install xdev ubuntu-24.04.2-live-server-amd64.iso
参考
bhyve Current state of bhyve Nvidia passthrough? 也提示采用 GPU passthrough for bhyve on FreeBSD 14 介绍的补丁方法,有人验证在 14.3 上也能工作。这个讨论线索中 原帖讨论中 c-c-c-c 提供的patch文件 ,可以直接应用到14.3
Nvidia gpu passthru in bhyve reddit上讨论上述补丁方法
bhyve Experience from bhyve (FreeBSD 14.1) GPU passthrough with Windows 10 guest 经验是使用Intel显卡,似乎不需要patch就可以直接passthru,后续我准备验证测试一下