GPU Passthrough in Bhyve

所谓 GPU Passthrough 其实就是把一个 GPU 扔给虚拟机用。众所周知,虚拟机没法打游戏的主要问题就是显示性能不行,因为基本上没有 3D 加速。如果能够把整个显卡直接扔进去,那当然性能应该和原生的差不多,就可以打游戏了……

所以因为懒得重启到 win 下面打游戏,就想尝试在 Bhyve 搞这个。Linux 下面这套东西其实很成熟,大家都用 KVM 搞个 windows 虚拟机然后传个显卡进去,然而 FreeBSD 底下这个 Bhyve 么…… 问题还不少。

首先是设置一些设备为 passthrough 设备,这样 host 就管不着它们了。这个是在 /boot/loader.conf 里面加上

pptdevs="1/0/0 1/0/1"

至于为啥是这俩,是因为这俩是我显卡搞出来的俩 PCI 设备。装了 vm-bhyve 之后,直接 vm passthru 就能看见对应的 Bhyve ID 了。

弄完之后,直接在 VM 的配置文件(vm configure <vm name>)里面加上

passthru0="1/0/0=10:0"
passthru1="1/0/1=10:1"

就可以让这俩设备传给 VM 了。

当然,以上只是最基本的…… 接着跑个 windows 就会发现显卡错误43,跑个 Linux 会和你说啥 PCI BAR 地址不对之类。

根据某些网上的帖子,这个原因是 bhyve 没检查 CPU 能支持的最大地址,于是分了个巨高的地址给某个 BAR,结果高过头了…… 这个可以通过篡改 bhyve 解决:

#define PCI_EMUL_MEMBASE64  0xD0000000UL
#define PCI_EMUL_MEMLIMIT64 0xFD000000UL

改完这个之后,跑个 Linux,里面用上 nouveau 驱动,就可以在 VM 里跑加速桌面了……

然而官方驱动还是不行。根据 Linux 各种帖子的说法,是因为 NV 会检测虚拟机,检测到就不让跑…… KVM 为此有个选项能隐藏 hypervisor 信息。然而我照着那个在 bhyve 抄了一份,依旧没法跑…… 不知道是不是抄得不对…… 官方驱动现在 Linux 里会说 RmInitAdapter Failed …… 还需要研究研究……

因为 nouveau 不支持 cuda,搞个 Linux 桌面最多也就能跑几个 Linux 游戏而已,最终目标还是要搞出来 windows 桌面……

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.