golang exec行为不正确

时间:2017-01-18 18:48:15

标签: go libvirt virsh

我正在使用以下代码段来获取XML上运行的虚拟机的XEN Hypervisor定义。代码正在尝试执行命令virsh dumpxml Ubutnu14,该命令将提供名为XML

的VM的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.04golang版本为go1.6.2 linux/amd64

1 个答案:

答案 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)

(显然也是错误处理)