Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Agen tetamu Golang libvirt tidak tersedia

Agen tetamu Golang libvirt tidak tersedia

WBOY
WBOYke hadapan
2024-02-09 20:48:19736semak imbas

Golang libvirt guest-agent 不可用

Editor PHP Youzi mendapati bahawa baru-baru ini beberapa pengguna melaporkan bahawa mereka menghadapi masalah ketaksediaan apabila menggunakan libvirt guest-agent di Golang. libvirt guest-agent ialah sebahagian daripada perpustakaan libvirt dan digunakan untuk berkomunikasi dengan sistem pengendalian tetamu dalam mesin maya. Walau bagaimanapun, sesetengah pengguna mengalami masalah sambungan atau gangguan fungsi apabila cuba menggunakannya. Ini adalah isu yang mengecewakan bagi pembangun yang bergantung pada ejen tetamu libvirt untuk pengurusan dan pemantauan mesin maya. Seterusnya, kami akan meneroka kemungkinan punca dan penyelesaian untuk membantu menyelesaikan isu ini.

Kandungan soalan

Saya cuba berkomunikasi dengan ejen tetamu pada instance qemu melalui libvirt golang api. Walau bagaimanapun, ia sentiasa menolak sambungan saya dengan

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

Walaupun contoh qemu dimulakan sepenuhnya dan ejen tetamu tersedia melalui baris arahan

sudo virsh qemu-agent-command test-vm '{"execute":"guest-info"}'

Adakah ini pepijat dalam pelaksanaan atau adakah saya perlu mendaftarkan proksi di suatu tempat dalam kod go? Saya tidak dapat mencari rujukan dalam dokumentasi.

    <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>

Terima kasih!

Penyelesaian

Saya tidak tahu apa sebab terakhir. Saya mempunyai gelung dan sedang mengakses, atau lebih khusus lagi, cuba mengakses proksi. Saya menukarnya untuk menggunakan tamat masa 500ms tetapi ia tidak berfungsi.

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

Selain itu, saya menghadapi beberapa isu kestabilan (iaitu apabila berbilang permintaan serentak dibuat kepada sambungan, kadangkala ia akan rosak). Saya menjumpai beberapa artikel dalam talian yang mencadangkan penambahan pengguna pada kumpulan kvm. Ini berfungsi untuk saya.

Atas ialah kandungan terperinci Agen tetamu Golang libvirt tidak tersedia. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam