2

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

  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 中做同样的事情?具体来说,我想做两件事。

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

1 回答 1

3

传递命令行选项

从 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

应用装甲

要修复此错误,需要执行以下两个步骤。

1. 让qemu以root身份运行(这一步是optional,你可能不需要,继续第二步)

  • vim/etc/libvirt/qemu.conf
  • 将行user =, 和group =, 更改为以下

用户=“根”
组=“根”

重新启动 PC 或 libvirt 守护程序。

2.AppArmor

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

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

于 2016-08-06T00:52:28.947 回答