我正在使用以下代码段来获取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
答案 0 :(得分:0)
我希望您在这两种方案中作为不同的用户运行virsh,并且由于您不提供任何URI,因此它连接到不同的libvirtd实例。如果你以非root身份运行virsh,那么它通常会连接到qemu:/// session,但是如果你以root身份运行virsh,那么它通常会连接到qemu:/// system。在连接到其他URI时,将针对一个URI注册的VM不可见。
顺便说一下,如果你正在使用go,你最好不要使用libvirt的原生Go库绑定而不是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)
(显然也是错误处理)