php小编柚子发现,最近一些用户反馈在Golang中使用libvirt guest-agent时遇到了不可用的问题。libvirt guest-agent是libvirt库的一部分,用于与虚拟机中的客户操作系统进行通信。然而,一些用户在尝试使用它时遇到了连接问题或功能失效的情况。这对于那些依赖libvirt guest-agent进行虚拟机管理和监控的开发人员来说是一个令人沮丧的问题。接下来,我们将探讨可能的原因和解决方案,帮助解决这个问题。
问题内容
我尝试通过 libvirt golang api 与 qemu 实例上的来宾代理进行通信。但是,它总是拒绝我与的连接
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 实例已完全启动并且可以通过命令行使用来宾代理
sudo virsh qemu-agent-command test-vm '{"execute":"guest-info"}'
这是实现中的错误还是我必须在 go 代码中的某个位置注册代理?我无法在文档中找到参考资料。
谢谢!
解决方法
不知道最后是什么原因。我有一个循环并且正在访问,或者更具体地说,尝试访问代理。我将其更改为使用 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()
}
}
}
此外,我遇到了一些稳定性问题(即,当对连接执行多个并发请求时,它有时会被破坏)。我在网上发现一些文章建议将用户添加到 kvm
组。这对我有用。
以上就是Golang libvirt guest-agent 不可用的详细内容,更多请关注编程网其它相关文章!