golang exec 不正确的行为

golang exec incorrect behavior

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

的 VM 的 XML
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

我希望您在这两种情况下 运行将 virsh 作为不同的用户使用,并且由于您没有提供任何 URI,它正在连接到不同的 libvirtd 实例。如果您 运行 virsh as non-root,那么它通常会连接到 qemu:///session,但是如果您 运行 virsh as root,那么它通常会连接到 qemu: ///系统。针对一个 URI 注册的 VM 在连接到另一个 URI 时将不可见。

顺便说一句,如果您使用的是 go,最好使用 libvirt 的本机 Go 库绑定,而不是执行 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)

(显然也要进行错误处理)