Golang Exec неправильное поведение

Я использую следующий сегмент кода, чтобы получить XML определение виртуальной машины, работающей на XEN Hypervisor, Код пытается выполнить команду virsh dumpxml Ubutnu14 который даст XML ВМ им. Ubuntu14

virshCmd := exec.Command("virsh", "dumpxml", "Ubuntu14")

var virshCmdOutput bytes.Buffer
var stderr bytes.Buffer
virshCmd.Stdout = &virshCmdOutput
virshCmd.Stderr = &stderr
err := virshCmd.Run()
if err != nil {
    fmt.Println(err)
    fmt.Println(stderr.String())
}

fmt.Println(virshCmdOutput.String())

Этот код всегда входит в состояние ошибки для данного имени домена, и я получаю следующий вывод.

exit status 1
error: failed to get domain 'Ubuntu14'
error: Domain not found: no domain with matching name 'Ubuntu14'

Но если я запускаю отдельную команду virsh dumpxml Ubuntu14Я получаю правильный XML определение.

Буду признателен, если кто-нибудь подскажет, что я делаю не так. Мой хост-компьютер Ubuntu-16.04 а также golang версия go1.6.2 linux/amd64

1 ответ

Решение

Я ожидаю, что вы используете virsh как другой пользователь в этих двух сценариях, и, поскольку вы не предоставляете никакой URI, он подключается к другому экземпляру libvirtd. Если вы запускаете virsh от имени пользователя root, он обычно подключается к сеансу qemu:///, но если вы запускаете virsh от имени пользователя root, он обычно подключается к системе qemu:///. Виртуальные машины, зарегистрированные для одного URI, не будут видны при подключении к другому URI.

Кстати, если вы используете go, вам будет гораздо лучше использовать привязки нативной библиотеки Go для libvirt, а не exec'ing virsh. Ваш вызов virsh dumpxml в значительной степени эквивалентен следующему:

   import (
      "github.com/libvirt/libvirt-go"
   )

   conn, err := libvirt.NewConnect("qemu:///system")

   dom, err := conn.LookupDomainByName("Ubuntu14")

   xml, err := dom.GetXMLDesc(0)

(очевидно, делать обработку ошибок тоже)

Другие вопросы по тегам