在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管理器中,我如何才能做到这一点?具体来说,我想做两件事。
- 当virt管理器启动qemu时,将上面的命令行选项传递给它
- libvirt-virt-manager使用apparmor隔离来宾,如何确保VM不会拒绝访问
/tmp/ivshmem_socket
传递命令行选项
从virt管理器向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: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
,您可能不需要,请继续执行第二步(
- vim
/etc/libvirt/qemu.conf
- 将行
user =
和group =
更改为以下内容
user="root">
group="root">
重新启动PC或libvirt守护程序。
2.AppArmor
- 从其xml配置文件中查找guest的uuid(使用virsh-edit并查找标记(
- cd
/etc/apparmor.d/libvirt
- 检查是否存在
libvirt-<uuid>
文件,将<uuid>
替换为vm的uuid 将AppArmor模式更改为抱怨,而不是强制执行,这将允许VM的所有操作,并记录那些应该被阻止的操作。
sudo aa-complain libvirt-<uuid> //replace <uuid> with uuid of vm