2017-01-18 8 views
0

Ich benutze folgenden Code-Segment, um die XML Definition einer virtuellen Maschine unter XEN Hypervisor zu erhalten. Der Code versucht der Befehl virsh dumpxml Ubutnu14 auszuführen, die die XML der VM Ubuntu14 Namen gebenGolang Exec falsches Verhalten

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()) 

Dieser Code geht immer in den Fehlerzustand für den angegebenen Domain-Namen, und ich bekomme die folgende Ausgabe.

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

Aber wenn ich den Standalone-Befehl virsh dumpxml Ubuntu14 laufen lasse, erhalte ich die richtige XML Definition.

Ich würde mich freuen, wenn mir jemand Hinweise geben könnte, was ich falsch mache. Meine Host-Maschine ist Ubuntu-16.04 und golang Version ist go1.6.2 linux/amd64

+0

Hat der Befehl virsh verlassen sich auf jede Art von Umgebungsvariablen? Wenn Sie einen solchen Befehl ausführen, wird er nicht in Ihrer Shell-Umgebung ausgeführt. – jcbwlkr

+0

Ich glaube nicht, dass das der Grund ist. Wenn ich den "virsh dumpxml" -Befehl aus meinem Code ausführe, wird er korrekt ausgeführt und sagt "error: command' dumpxml' erfordert Option ". Ich erhalte dieselbe Ausgabe, wenn ich sie von der Shell-Umgebung aus starte. – azizulhakim

+0

Es ist nur eine Ahnung, aber das könnte immer noch das Problem sein, abhängig davon, wie es weiß, wo man nach diesen Domänen suchen soll. Nur um es zu versuchen, vielleicht 'virshCmd: = exec.Command (" sh "," -c "," virsh dumpxml Ubuntu14 ")' – jcbwlkr

Antwort

0

Ich erwarte, dass Sie laufen virsh als ein anderer Benutzer in diesen beiden Szenarien, und da Sie jede URI nicht angeben, an eine andere Instanz libvirtd verbindet. Wenn Sie virsh als nicht-root ausführen, wird normalerweise eine Verbindung zu qemu: /// session hergestellt, aber wenn Sie virsh als root ausführen, wird normalerweise eine Verbindung zu qemu: /// system hergestellt. VMs, die für einen URI registriert sind, sind bei der Verbindung mit dem anderen URI nicht sichtbar.

Übrigens, wenn Sie go verwenden, wäre es viel besser, die nativen Go-Bibliotheksbindungen für libvirt zu verwenden, anstatt virsh auszuführen. Ihre „virsh dumpxml“ Invokation ist so ziemlich das entspricht dies:

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

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

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

    xml, err := dom.GetXMLDesc(0) 

(offensichtlich keine Bedienungsfehler zu)

+0

ja, du hast Recht. Irgendwann habe ich es herausgefunden und meine Funktion entsprechend geändert. – azizulhakim