将IVSHMEM与libvirt virt-manager一起使用

时间:2016-08-06 00:19:45

标签: shared-memory virtualization qemu libvirt apparmor

qemu 中使用 ivshmem 需要执行以下步骤。

  1. 在主机./ivshmem_server中启动ivshmem服务器,这将创建一个unix域套接字/tmp/ivshmem_socket
  2. 使用以下命令行选项 - -chardev socket,path=/tmp/ivshmem_socket,id=ivshmem_socket -device ivshmem,chardev=ivshmem_socket,size=1m
  3. 启动qemu

    现在,如果我们在访客中lspci,则会显示ivshmem pci设备。

    我怎样才能在virt-manager中做同样的事情? 具体来说,我想做两件事。

    • 当virt-manager启动时,将上面的命令行选项传递给qemu
    • libvirt virt-manager使用 apparmor 来隔离访客,如何确保不会拒绝访问/tmp/ivshmem_socket

1 个答案:

答案 0 :(得分:1)

传递命令行选项

从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: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 =&#34; root&#34;
  group =&#34; root&#34;

重启PC或libvirt守护程序。

<强> 2。 AppArmor的

  • 从其xml配置文件中找到guest的uuid(使用virsh编辑并查找标记)
  • cd /etc/apparmor.d/libvirt
  • 检查是否存在libvirt-<uuid>文件,将<uuid>替换为umid of vm
  • 将AppArmor模式更改为抱怨,而不是强制执行,这将允许VM的所有操作,并记录那些应该被阻止的操作。

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