首页 文章

将IVSHMEM与libvirt virt-manager一起使用

提问于
浏览
1

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 回答

  • 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: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:命令行>

    执行此操作后,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. Make qemu run as root (此步骤为 optional ,您可能不需要,继续第二步)

    • vim /etc/libvirt/qemu.conf

    • 将行 user =group = 更改为以下内容

    user =“root”group =“root”

    重新启动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

相关问题