在 qemu 中使用 ivshmem 需要执行以下步骤 .
-
在主机
./ivshmem_server
中启动ivshmem服务器,这将创建一个unix域套接字/tmp/ivshmem_socket
-
使用以下命令行选项启动qemu-
-chardev socket,path=/tmp/ivshmem_socket,id=ivshmem_socket -device ivshmem,chardev=ivshmem_socket,size=1m
现在,如果我们在guest中执行 lspci
,则会显示ivshmem pci设备 .
我怎样才能在virt-manager中做同样的事情?具体来说,我想做两件事 .
-
当virt-manager启动时,将上面的命令行选项传递给qemu
-
libvirt virt-manager使用 apparmor 隔离来宾,如何确保不拒绝访问
/tmp/ivshmem_socket
?
1 回答
Passing command line options
从virt-manager向qemu传递命令行选项需要执行以下步骤 .
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将尝试访问
/tmp/ivshmem_socket
,并且由于apparmor(在我的情况下libvirt使用apparmor,它也可能使用SeLinux),访问将被拒绝,并且将显示类似于以下的错误 .AppArmor
要修复此错误,需要执行以下两个步骤 .
1. Make qemu run as root (此步骤为
optional
,您可能不需要,继续第二步)vim
/etc/libvirt/qemu.conf
将行
user =
和group =
更改为以下内容重新启动PC或libvirt守护程序 .
2. AppArmor
从其xml配置文件中找到guest的uuid(使用virsh编辑并查找标记)
cd
/etc/apparmor.d/libvirt
检查是否存在
libvirt-<uuid>
文件,将<uuid>
替换为vm的uuid将AppArmor模式更改为抱怨,而不是强制执行,这将允许VM的所有操作,并记录应该被阻止的操作 .
sudo aa-complain libvirt-<uuid> //replace <uuid> with uuid of vm