在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 设备:

检查可以passthrough的设备
 vm passthru
  • 配置 /boot/loader.conf 屏蔽掉需要passthru的GPU :

屏蔽掉 Nvidia Tesla P10 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 ,则下载对应的源代码分支:

获取 freebsd 源代码
# 这步mv重命名会提示没有权限
mv /usr/src /usr/src.bak
git clone --branch releng/14.3 https://git.FreeBSD.org/src.git /usr/src
打上nvidia补丁
cd /usr/src
git apply --verbose nvidia.patch.txt
  • 编译和安装补丁过的内核:

编译安装补丁过的内核
sudo make -j8 buildkernel
sudo make installkernel
  • 编译和安装 include, vmm, bhyve, bhyvectl, bhyveload:

编译安装include, vmm, bhyve, bhyvectl, bhyveloa
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
执行 build_branch.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无法初始化的问题。

我可能还需要继续找寻方法:

BIOS尝试

google AI提到bhyve不支持Linux中使用的 pci=realloc 内核配置,建议设置 pci=realloc=off 。我尝试了在Ubuntu虚拟机中配置 pci=reallocpci=realloc=off 都没有解决无法初始化 Nvidia Tesla P4 GPU运算卡 驱动的问题,同样也没有启动 Nvidia Tesla P10 GPU运算卡 的虚拟机。

我也尝试关闭 Above 4G Decoding BIOS设置 :

总之,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

参考