Golang libvirt客户代理不可用

2wnc66cl  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(193)

我尝试通过libvirt golang API与qemu示例上的guest代理通信。

2022-12-02T00:10:43.799+0100    DPANIC  test/main.go:335    Failed to connect to guest  {"error": "virError(Code=86, Domain=10, Message='Guest agent is not responding: QEMU guest agent is not connected')"}

即使qemu示例已完全引导并且可以通过命令行使用guest代理

sudo virsh qemu-agent-command test-vm '{"execute":"guest-info"}'

这是实现中的一个bug还是我必须在go代码中的某个地方注册代理?我在文档中找不到引用。

<channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-6-test-vm/org.qemu.guest_agent.0'/>
      <target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
      <alias name='channel0'/>
      <address type='virtio-serial' controller='0' bus='0' port='1'/>
    </channel>

谢谢你!

ecbunoof

ecbunoof1#

不知道最后是什么原因。我有一个循环,正在访问,或者更具体地说,试图访问代理。我把它改成使用500毫秒的超时,它不起作用。

type qemuStatusResponse struct {
    Return struct {
        Exitcode int    `json:"exitcode,omitempty"`
        OutData  string `json:"out-data,omitempty"`
        Exited   bool   `json:"exited,omitempty"`
        ErrData  string `json:"err-data,omitempty"`
    } `json:"return,omitempty"`
}

func (l *LibvirtInstance) waitForCompletion(ctx context.Context, pid int, domain *libvirt.Domain) (response *qemuStatusResponse, err error) {
    response = &qemuStatusResponse{}

    ticker := time.NewTicker(500 * time.Millisecond)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            result, err := domain.QemuAgentCommand(
                fmt.Sprintf(`
                {
                    "execute": "guest-exec-status",
                    "arguments": {
                        "pid": %d
                    }
                    }`, pid),
                libvirt.DOMAIN_QEMU_AGENT_COMMAND_BLOCK, 0)
            if err != nil {
                return nil, err
            }
            if err := json.Unmarshal([]byte(result), response); err != nil {
                return nil, err
            }
            if response.Return.Exited {
                return response, nil
            }
        case <-ctx.Done():
            return nil, ctx.Err()
        }
    }
}

此外,我还遇到了一些稳定性问题(例如,当执行多个并发请求时,连接有时会中断)。我在Web上找到了一些建议将用户添加到kvm组的文章。这对我很有效。

相关问题