2017-01-18 14 views
0

我正在使用以下代碼段來獲取運行於XEN Hypervisor上的虛擬機的XML定義。該代碼試圖執行命令virsh dumpxml Ubutnu14這將給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()) 

該代碼總是進入用於指定域名的錯誤情況,我得到下面的輸出。

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

+0

是否命令的virsh依賴於任何類型的環境變量?當你運行這樣的命令時,它不會在你的shell環境中運行 – jcbwlkr

+0

我不認爲這是原因。因爲如果我從代碼運行「virsh dumpxml」命令,它會正確運行,並說「錯誤:命令'dumpxml'需要選項」。如果我從shell環境運行它,我會得到相同的輸出。 – azizulhakim

+0

這只是一種預感,但依賴於它如何知道在哪裏尋找這些域名,這仍然可能是問題。試試吧'virshCmd:= exec.Command(「sh」,「-c」,「virsh dumpxml Ubuntu14」)' – jcbwlkr

回答

0

我希望你在這兩種情況不同的用戶運行的virsh,因爲你不提供任何URI,它連接到一個不同的libvirtd實例。如果將virsh作爲非root用戶運行,那麼它通常會連接到qemu:///會話,但是如果以root身份運行virsh,那麼它通常會連接到qemu:///系統。針對一個URI註冊的VM在連接到其他URI時不可見。

順便說一句,如果你使用go,你會更好地使用libvirt的原生Go庫綁定而不是exec'ing virsh。你「的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