Maison  >  Article  >  développement back-end  >  L'agent invité Golang libvirt n'est pas disponible

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

WBOY
WBOYavant
2024-02-09 20:48:19738parcourir

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

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

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>

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer