添加 dumped rom 时出现 gpu 直通问题

添加 dumped rom 时出现 gpu 直通问题

我正在尝试在 Lubuntu 17.10 上qemu-kvm使用gpu 直通virsh

我安装了 Windows 7 (UEFI),它运行正常,但设备驱动程序没有安装,提示

资源不足(错误 12)。

所以我放弃了 gpu rom 并添加了

<rom bar='on' file='/home/gpu.dump'/>

<hostdev>gpu pci 中。

我做到了

chmod 777 /home 

gpu.dump, user = "root" group = "root" 

提前

每当我在 virsh 脚本中添加 rom... 行时,我都会遇到这样的错误消息

############################################################################### "Error starting domain: internal error: process exited while connecting to monitor: 2017-12-13T09:45:38.629221Z qemu-system-x86_64:
-chardev pty,id=charserial0: char device redirected to /dev/pts/2 (label charserial0) 2017-12-13T09:45:39.146358Z qemu-system-x86_64:
-device vfio-pci,host=03:00.0,id=hostdev0,bus=pci.0,addr=0x7,romfile=/home/gt710.dump: failed to find romfile "/home/gt710.dump"

Traceback (most recent call last):   File "/usr/share/virt-manager/virtManager/asyncjob.py", line 88, in cb_wrapper
    callback(asyncjob, *args, **kwargs)   File "/usr/share/virt-manager/virtManager/asyncjob.py", line 124, in tmpcb
    callback(*args, **kwargs)   File "/usr/share/virt-manager/virtManager/libvirtobject.py", line 83, in newfn
    ret = fn(self, *args, **kwargs)   File "/usr/share/virt-manager/virtManager/domain.py", line 1405, in startup
    self._backend.create()   File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1062, in create
    if ret == -1: raise libvirtError ('virDomainCreate() failed', dom=self) libvirtError: internal error: process exited while connecting to monitor: 2017-12-13T09:45:38.629221Z qemu-system-x86_64:
-chardev pty,id=charserial0: char device redirected to /dev/pts/2 (label charserial0) 2017-12-13T09:45:39.146358Z qemu-system-x86_64:
-device vfio-pci,host=03:00.0,id=hostdev0,bus=pci.0,addr=0x7,romfile=/home/gt710.dump: failed to find romfile "/home/gt710.dump"
###############################################################################

我现在该怎么办?我已经 30 个小时没睡觉了 :-(

答案1

如果此错误是由 AppArmor 引起的,只需将 ROM 文件移动到/usr/share/vgabios(如果不存在则创建此目录)。默认情况下,apparmor 配置文件允许从 kvm-qemu 读取此路径。

其他一些默认允许的路径:

  # access to firmware's etc
  /usr/share/kvm/** r,
  /usr/share/qemu/** r,
  /usr/share/qemu-kvm/** r,
  /usr/share/bochs/** r,
  /usr/share/openbios/** r,
  /usr/share/openhackware/** r,
  /usr/share/proll/** r,
  /usr/share/vgabios/** r,
  /usr/share/seabios/** r,
  /usr/share/misc/sgabios.bin r,
  /usr/share/ovmf/** r,
  /usr/share/OVMF/** r,
  /usr/share/AAVMF/** r,
  /usr/share/qemu-efi/** r,
  /usr/share/slof/** r,

答案2

出现“无法找到 romfile”错误很可能是因为 Ubuntu 中默认启用了 AppArmor(至少在 Ubuntu 桌面/服务器中,否则问题很可能是 SELinux,类似于以下针对 AppArmor 的解决方案):

解决方案

libvirt 自动创建/管理/etc/apparmor.d/libvirt/每个虚拟机中存储的 AppArmor 配置文件。该过程为绑定到虚拟机的某些设备添加文件例外(我不是这方面的专家,但似乎它不计算 rom 文件)。

但是您可以通过添加任何类型的文件源设备来强制它为 rom 文件添加例外。我使用如下所示的假 cd 驱动器:

将以下代码添加到您的 xml 配置中:

<devices>
...
<disk type='file' device='cdrom'>
    <driver name='qemu' type='raw'/>
    <source file='/path/to/the.rom'/>
    <target dev='sdb' bus='sata'/>
    <readonly/>
</disk>
...
</devices>

如果你仍然有问题

通常不建议这样做,因为它将完全禁用该虚拟机的 AppArmor 保护。

  1. 查看你的配置:virsh edit VMNAME

  2. 找到如下 uuid 行:<uuid>YOUR-UUID</uuid>

  3. 运行sudo aa-complain /etc/apparmor.d/libvirt/libvirt-YOUR-UUId以禁用该策略的执行

相关内容