Я пытаюсь выполнить gpu passthrough с qemu-kvm
, используя virsh
в Lubuntu 17.10
Я установил 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"
заранее
Всякий раз, когда я добавляю строку rom ... в скрипт virsh, я сталкиваюсь с сообщением об ошибке вроде это
############################################################################### "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 часов: - (
Ошибка «не удалось найти romfile», скорее всего, связана с тем, что AppArmor должен быть включен по умолчанию в Ubuntu (по крайней мере, в Ubuntu Desktop / Server, в противном случае проблема, вероятно, SELinux аналогична приведенному ниже решению для AppArmor):
Решение
libvirt автоматически создает / управляет профилями AppArmor, хранящимися в /etc/apparmor.d/libvirt/
для каждого vm. Процесс добавляет исключения файлов для определенных устройств, связанных с виртуальной машиной (я не эксперт по этому вопросу, но, похоже, он не считает файл 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 для этой одной виртуальной машины.
Посмотрите на вашу конфигурацию: virsh edit VMNAME
Найдите строку uuid, которая выглядит следующим образом: <uuid>YOUR-UUID</uuid>
Запустите sudo aa-complain /etc/apparmor.d/libvirt/libvirt-YOUR-UUId
, чтобы отключить принудительное применение политики
Если эта ошибка из-за AppArmor, просто переместитесь, файл ROM к /usr/share/vgabios
(сделайте этот dir, если это не существует). Этому пути позволяют быть считанным из kvm-qemu по умолчанию apparmor профиль.
Некоторый другой разрешенный путями по умолчанию:
# 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,