Использование IVSHMEM с libvirt virt-manager

Для использования ivshmem в qemu необходимо выполнить следующие шаги.

  1. Запустите сервер ivshmem на хосте ./ivshmem_server, который создаст доменный сокет unix /tmp/ivshmem_socket.
  2. Запустите qemu со следующими параметрами командной строки: -chardev socket,path=/tmp/ivshmem_socket,id=ivshmem_socket -device ivshmem,chardev=ivshmem_socket,size=1m

Теперь, если мы делаем lspci в гостевой системе, в ней отображается устройство ivshmem pci.

Как я могу сделать то же самое в virt-manager? В частности, я хочу сделать 2 вещи.

  • Передайте указанный выше параметр командной строки в qemu, когда virt-manager запустит его.
  • libvirt virt-manager использует apparmor для изоляции гостей. Как убедиться, что доступ к /tmp/ivshmem_socket не запрещен виртуальной машине?

person Sahil Singh    schedule 06.08.2016    source источник


Ответы (1)


Передача параметров командной строки

Передача параметра командной строки в qemu из virt-manager требует следующих шагов.

  • virsh edit <name of vm> или напрямую изменить файл с помощью vim /etc/libvirt/qemu/<name of virtual machine>.xml
  • изменить <domain type='kvm'> на <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  • добавить теги для параметров командной строки
<qemu:commandline>
    <qemu:arg value='-chardev'/>
    <qemu:arg value='socket,path=/tmp/ivshmem_socket,id=ivshmem_socket'/>
    <qemu:arg value='-device'/>
    <qemu:arg value='ivshmem,chardev=ivshmem_socket,size=1m'/>
</qemu:commandline>

После этого qemu попытается получить доступ к /tmp/ivshmem_socket, и из-за apparmor (в моем случае libvirt использовал apparmor, он может также использовать SeLinux) доступ будет запрещен, и будет показана ошибка, подобная следующей.

error starting domain: internal error: process exited while connecting to monitor:
  ...
virt-manager Failed to connect socket: Permission denied

AppArmor

Чтобы исправить эту ошибку, необходимо выполнить следующие два шага.

1. Запустите qemu от имени пользователя root (этот шаг – optional, и он может вам не понадобиться, перейдите ко второму шагу)

  • вим /etc/libvirt/qemu.conf
  • измените строки user = и group = на следующие

пользователь = "корень"
группа = "корень"

Перезагрузите компьютер или демон libvirt.

2. AppArmor

  • найдите uuid гостя из его файла конфигурации xml (используйте virsh edit и найдите тег)
  • cd /etc/apparmor.d/libvirt
  • проверьте, присутствует ли файл libvirt-<uuid>, замените <uuid> на uuid vm
  • Измените режим AppArmor на жалобу вместо принудительного, что позволит разрешить все действия виртуальной машины и регистрировать те, которые должны были быть заблокированы.

    sudo aa-complain libvirt-<uuid> //replace <uuid> with uuid of vm

person Sahil Singh    schedule 06.08.2016