![Virtualbox 和 GPU 通道:主机 PCI 地址已连接到该虚拟机的设备](https://linux22.com/image/74749/Virtualbox%20%E5%92%8C%20GPU%20%E9%80%9A%E9%81%93%EF%BC%9A%E4%B8%BB%E6%9C%BA%20PCI%20%E5%9C%B0%E5%9D%80%E5%B7%B2%E8%BF%9E%E6%8E%A5%E5%88%B0%E8%AF%A5%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E8%AE%BE%E5%A4%87.png)
我的服务器有多个 GPU。我的想法是将它们附加到不同的虚拟机,以便在 CUDA(或 OpenCL)计算中使用这些虚拟机。
我的设置:
- CPU:英特尔至强E5-2670
GPU:
1 个 Radeon HD 7970
$ lspci -nn | grep Rad 83:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti XT [Radeon HD 7970/8970 OEM / R9 280X] [1002:6798] 83:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti XT HDMI Audio [Radeon HD 7970 Series] [1002:aaa0]
2 个 GeForce GTX 泰坦黑色
- Linux内核3.14.6
- VirtualBox 版本 4.3.28_OSEr100309
我希望能够连接任何 GPU,但我们先从 Radeon 开始。
我找到了几个指南。最有用的是来自 Arch Wiki:通过 OVMF 的 PCI 直通。
我在 BIOS 中启用了 VT-D:
$ grep 'vmx|svm|0xc0f' /proc/cpuinfo
flags : ... vme ... vmx ...
$ dmesg|grep -e DMAR -e IOMMU
[ 0.000000] Intel-IOMMU: enabled
[ 0.089689] dmar: IOMMU 0: reg_base_addr fbffe000 ver 1:0 cap d2078c106f0462 ecap f020fe
[ 0.089698] dmar: IOMMU 1: reg_base_addr ebffc000 ver 1:0 cap d2078c106f0462 ecap f020fe
[ 0.089833] IOAPIC id 2 under DRHD base 0xfbffe000 IOMMU 0
[ 0.089835] IOAPIC id 0 under DRHD base 0xebffc000 IOMMU 1
[ 0.089836] IOAPIC id 1 under DRHD base 0xebffc000 IOMMU 1
[ 1.440173] IOMMU 0 0xfbffe000: using Queued invalidation
[ 1.440176] IOMMU 1 0xebffc000: using Queued invalidation
[ 1.440191] IOMMU: Setting RMRR:
[ 1.440241] IOMMU: Setting identity map for device 0000:00:1d.0 [0xbddbf000 - 0xbddd5fff]
[ 1.440332] IOMMU: Setting identity map for device 0000:00:1a.0 [0xbddbf000 - 0xbddd5fff]
[ 1.440375] IOMMU: Prepare 0-16MiB unity mapping for LPC
[ 1.440413] IOMMU: Setting identity map for device 0000:00:1f.0 [0x0 - 0xffffff]
[ 5.356692] vboxpci: IOMMU found
我隔离 GPU和pci-stub
:
$ dmesg | grep pci-stub
[ 0.000000] Command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda1 ro nomodeset intel_iommu=on pci-stub.ids=1002:6798,1002:aaa0 initrd=../initramfs-linux.img
[ 0.000000] Kernel command line: BOOT_IMAGE=../vmlinuz-linux root=/dev/sda1 ro nomodeset intel_iommu=on pci-stub.ids=1002:6798,1002:aaa0 initrd=../initramfs-linux.img
[ 1.544921] pci-stub: add 1002:6798 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 1.545003] pci-stub 0000:83:00.0: claimed by stub
[ 1.545107] pci-stub: add 1002:AAA0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 1.545186] pci-stub 0000:83:00.1: claimed by stub
并且列入黑名单的模块并且fglrx
启动后未加载:
$ cat /etc/modprobe.d/blacklist-fglrx.conf
blacklist radeon
blacklist fglrx
当我尝试连接该 pci 时,出现以下错误:
VBoxManage: error: Device with host PCI address already attached to this VM
VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "AttachHostPCIDevice(iHostAddr, iGuestAddr, TRUE)" at line 2736 of file VBoxManageModifyVM.cpp
可能的原因是在 IOMMU 组中(因为我的 GPU 的音频和视频部分是一组):
$ find /sys/kernel/iommu_groups/ -type l | grep 22
/sys/kernel/iommu_groups/22/devices/0000:83:00.0
/sys/kernel/iommu_groups/22/devices/0000:83:00.1
但我不知道如何立即附加整个组。
有任何想法吗?
PS 我不坚持任何特定的虚拟机。如果可以不使用 VirtualBox 而是使用其他东西,我会很高兴。