我已成功传递给 vm pci-e 和 pci pure 设备。我想将 scsi 控制器传递给虚拟机
操作系统可以看到控制器
06:06.0 SCSI storage controller [0100]: BusLogic BT-946C (BA80C30) [MultiMaster 10] [104b:1040]
Kernel driver in use: vfio-pci
Kernel modules: BusLogic
我拆下控制器
virsh nodedev-detach pci_0000_06_06_0
我启动虚拟机
qemu-system-i386 -boot a -fda boot_install.img -m 128 -no-fd-bootchk --enable-kvm -device pcnet,netdev=network0 -netdev tap,id=network0,ifname=tap1,script=no,downscript=no -device vfio-pci,host=06:06.0
和...
qemu-system-i386: -device vfio-pci,host=06:06.0: VFIO_MAP_DMA failed: Cannot allocate memory
qemu-system-i386: -device vfio-pci,host=06:06.0: VFIO_MAP_DMA failed: Cannot allocate memory
qemu-system-i386: -device vfio-pci,host=06:06.0: vfio 0000:06:06.0: failed to setup container for group 12: memory listener initialization failed: Region pc.ram: vfio_dma_map(0x7fadc1bccc00, 0x0, 0xa0000, 0x7fadb5200000) = -12 (Cannot allocate memory)
怎么解决?谢谢
答案1
您需要使用udev
规则来更改您希望传递给用户的设备的所有权。为了避免出现此内存错误,您还需要增加用户能够分配的内存限制。
我使用 Arch Linux,因此这些文件可能位于您的发行版的不同位置。
创建该组
kvm
(如果尚不存在),并将其添加到用户的补充组中。如果您不打算以其他用户身份运行虚拟机,您也可以使用自己的用户组。Udev规则:
创建文件
/etc/udev/rules.d/99-vm.rules
SUBSYSTEM=="vfio", OWNER="root", GROUP="kvm" SUBSYSTEM=="***", ATTR{idVendor}=="***", ATTR{idProduct}=="***" OWNER="root", GROUP="kvm"
编辑第二行并为您希望直通的每个设备添加类似的行
vfio
,在本示例中,我使用供应商和产品 ID 来匹配设备。内存限制:
将以下行添加到文件中
/etc/security/limits.conf
@kvm soft memlock 150000 @kvm hard memlock 150000
在这里,我们将组的限制设置
kvm
为 150000KB,这对于 128MB 的 VM 来说应该足够了,但如果您增加 VM 的内存分配,则应该增加。
来源: https://www.evonide.com/non-root-gpu-passthrough-setup/(设置有点不同,因为他为虚拟机使用单独的用户)
答案2
找到解决方法。由于 root 有效,所以可能是权限问题