Heim >Backend-Entwicklung >Golang >Der Golang libvirt-Gastagent ist nicht verfügbar

Der Golang libvirt-Gastagent ist nicht verfügbar

WBOY
WBOYnach vorne
2024-02-09 20:48:19798Durchsuche

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')"}

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!

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()
        }
    }
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen