Der Golang libvirt-Gastagent ist nicht verfügbar

WBOY
Freigeben: 2024-02-09 20:48:19
nach vorne
750 Leute haben es durchsucht

Golang libvirt guest-agent 不可用

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.

Frageninhalt

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')"}
Nach dem Login kopieren

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"}'
Nach dem Login kopieren

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>
Nach dem Login kopieren

Danke!

Lösung

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()
        }
    }
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!