php小編柚子發(fā)現(xiàn),最近一些用戶(hù)反饋在Golang中使用libvirt guest-agent時(shí)遇到了不可用的問(wèn)題。libvirt guest-agent是libvirt庫(kù)的一部分,用于與虛擬機(jī)中的客戶(hù)操作系統(tǒng)進(jìn)行通信。然而,一些用戶(hù)在嘗試使用它時(shí)遇到了連接問(wèn)題或功能失效的情況。這對(duì)于那些依賴(lài)libvirt guest-agent進(jìn)行虛擬機(jī)管理和監(jiān)控的開(kāi)發(fā)人員來(lái)說(shuō)是一個(gè)令人沮喪的問(wèn)題。接下來(lái),我們將探討可能的原因和解決方案,幫助解決這個(gè)問(wèn)題。
問(wèn)題內(nèi)容
我嘗試通過(guò) libvirt golang api 與 qemu 實(shí)例上的來(lái)賓代理進(jìn)行通信。但是,它總是拒絕我與的連接
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')"}
登錄后復(fù)制
即使 qemu 實(shí)例已完全啟動(dòng)并且可以通過(guò)命令行使用來(lái)賓代理
sudo virsh qemu-agent-command test-vm '{"execute":"guest-info"}'
登錄后復(fù)制
這是實(shí)現(xiàn)中的錯(cuò)誤還是我必須在 go 代碼中的某個(gè)位置注冊(cè)代理?我無(wú)法在文檔中找到參考資料。
登錄后復(fù)制
謝謝!
解決方法
不知道最后是什么原因。我有一個(gè)循環(huán)并且正在訪問(wèn),或者更具體地說(shuō),嘗試訪問(wèn)代理。我將其更改為使用 500 毫秒的超時(shí),但它不起作用。
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()
}
}
}
登錄后復(fù)制
此外,我遇到了一些穩(wěn)定性問(wèn)題(即,當(dāng)對(duì)連接執(zhí)行多個(gè)并發(fā)請(qǐng)求時(shí),它有時(shí)會(huì)被破壞)。我在網(wǎng)上發(fā)現(xiàn)一些文章建議將用戶(hù)添加到 kvm 組。這對(duì)我有用。






