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)
(очевидно, делать обработку ошибок тоже)