Maison > développement back-end > Golang > le corps du texte

L'agent invité Golang libvirt n'est pas disponible

WBOY
Libérer: 2024-02-09 20:48:19
avant
750 Les gens l'ont consulté

Golang libvirt guest-agent 不可用

L'éditeur PHP Youzi a découvert que récemment certains utilisateurs ont signalé avoir rencontré des problèmes d'indisponibilité lors de l'utilisation de l'agent invité libvirt dans Golang. L'agent invité libvirt fait partie de la bibliothèque libvirt et est utilisé pour communiquer avec le système d'exploitation invité dans une machine virtuelle. Cependant, certains utilisateurs ont rencontré des problèmes de connectivité ou des problèmes de fonctionnalité en essayant de l'utiliser. Il s'agit d'un problème frustrant pour les développeurs qui s'appuient sur l'agent invité libvirt pour la gestion et la surveillance des machines virtuelles. Nous explorerons ensuite les causes possibles et les solutions pour aider à résoudre ce problème.

Contenu de la question

J'essaie de communiquer avec un agent invité sur une instance qemu via l'API libvirt golang. Cependant, il refuse toujours ma connexion avec

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')"}
Copier après la connexion

Même si l'instance qemu est entièrement démarrée et que l'agent invité est disponible via la ligne de commande

sudo virsh qemu-agent-command test-vm '{"execute":"guest-info"}'
Copier après la connexion

Est-ce un bug dans l'implémentation ou dois-je enregistrer le proxy quelque part dans le code go ? Je ne trouve pas de référence dans la documentation.

    <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>
Copier après la connexion

Merci !

Solution

Je ne sais pas quelle est la raison finale. J'ai une boucle et j'accède, ou plus précisément, j'essaie d'accéder à un proxy. Je l'ai modifié pour utiliser un délai d'attente de 500 ms mais cela n'a pas fonctionné.

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()
        }
    }
}
Copier après la connexion

De plus, j'ai rencontré quelques problèmes de stabilité (c'est-à-dire que lorsque plusieurs requêtes simultanées étaient faites sur la connexion, celle-ci était parfois interrompue). J'ai trouvé des articles en ligne suggérant d'ajouter des utilisateurs au groupe kvm. Cela fonctionne pour moi.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!