2017-01-18 14 views
0

次のコードセグメントを使用して、XEN Hypervisor上で実行されている仮想マシンの定義をXMLにしています。コードは、VMのXMLは、このコードは常に指定したドメイン名のエラー状態になり、私は次の出力を得るUbuntu14golang execの動作が正しくありません

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

と名付け与えるコマンドvirsh dumpxml Ubutnu14を実行しようとしています。

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バージョンである私はあなたがこれらの2つのシナリオで別のユーザーとしてvirshを実行している、とあなたが任意のURIを提供していないので、それは別のにlibvirtdインスタンスに接続されて期待していgo1.6.2 linux/amd64

+0

はvirshをコマンドを環境変数のいずれかの種類に依存していますか?そのようなコマンドをシェル環境で実行していないときは、 – jcbwlkr

+0

私はそれが理由だとは思わない。私のコードから "virsh dumpxml"コマンドを実行すると正しく動作し、 "error:command' dumpxml'はオプションが必要です "というメッセージが表示されます。シェル環境から実行すると同じ出力が得られます。 – azizulhakim

+0

これは単なる勘違いですが、それはどのようにそれらのドメインを探すかを知る方法によっては依然として問題になるかもしれません。試してみてください。 'virshCmd:= exec.Command(" sh "、" -c "、" virsh dumpxml Ubuntu14 ")' – jcbwlkr

答えて

0

です。 virshを非rootとして実行すると、通常はqemu:/// sessionに接続しますが、rootとしてvirshを実行すると、通常はqemu:/// systemに接続します。あるURIに対して登録されたVMは、他のURIに接続するときには表示されません。

ところで、あなたがgoを使っているのであれば、virshを実行するのではなく、libvirtのネイティブGoライブラリバインディングを使うほうがずっと良いでしょう。あなたの「virshをdumpxml」invokationはこれにほとんど同等です:

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

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

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

    xml, err := dom.GetXMLDesc(0) 

(明らかにエラーがあまりにも取り扱いん)

+0

はい、あなたは正しいです。最終的に私はそれを見つけ出し、それに従って関数を修正しました。 – azizulhakim

関連する問題