Использование 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 не отказано в ВМ?

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 = к следующему

user = "root"
группа = "корень"

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

2. AppArmor

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

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

Другие вопросы по тегам