Der PHP-Editor Youzi hat herausgefunden, dass kürzlich einige Benutzer berichteten, dass bei der Verwendung des libvirt-Gastagenten in Golang Probleme mit der Nichtverfügbarkeit aufgetreten seien. Der libvirt-Gastagent ist Teil der libvirt-Bibliothek und wird zur Kommunikation mit dem Gastbetriebssystem in einer virtuellen Maschine verwendet. Bei einigen Benutzern kam es jedoch zu Verbindungsproblemen oder Funktionsstörungen, als sie versuchten, es zu verwenden. Dies ist ein frustrierendes Problem für Entwickler, die sich für die Verwaltung und Überwachung virtueller Maschinen auf den libvirt-Gastagenten verlassen. Als Nächstes untersuchen wir mögliche Ursachen und Lösungen, um dieses Problem zu beheben.
Ich versuche, über die libvirt golang API mit einem Gastagenten auf einer Qemu-Instanz zu kommunizieren. Allerdings verweigert es mir immer die Verbindung zu
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')"}
Auch wenn die qemu-Instanz vollständig gestartet ist und der Gastagent über die Befehlszeile verfügbar ist
sudo virsh qemu-agent-command test-vm '{"execute":"guest-info"}'
Ist das ein Fehler in der Implementierung oder muss ich den Proxy irgendwo im Go-Code registrieren? Ich kann in der Dokumentation keinen Hinweis finden.
<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>
Danke!
Ich weiß nicht, was der letzte Grund ist. Ich habe eine Schleife und greife auf einen Proxy zu, oder genauer gesagt, ich versuche, darauf zuzugreifen. Ich habe es so geändert, dass ein Timeout von 500 ms verwendet wird, aber es hat nicht funktioniert.
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() } } }
Außerdem bin ich auf einige Stabilitätsprobleme gestoßen (z. B. wenn mehrere gleichzeitige Anfragen an die Verbindung gestellt wurden, kam es manchmal zu Unterbrechungen). Ich habe online einige Artikel gefunden, in denen vorgeschlagen wird, Benutzer zur kvm
-Gruppe hinzuzufügen. Das funktioniert bei mir.
Das obige ist der detaillierte Inhalt vonDer Golang libvirt-Gastagent ist nicht verfügbar. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!