Использование IVSHMEM с libvirt virt-manager
Использование ivshmem в qemu требует следующих шагов.
- Запустите сервер ivshmem на хосте
./ivshmem_server
который создаст сокет домена unix/tmp/ivshmem_socket
- Запустите 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