2017-01-18 15 views
0

다음 코드 세그먼트를 사용하여 XEN Hypervisor에서 실행되는 가상 시스템의 정의 XML을 얻습니다. 이 코드는 VM의 XML을 줄 것이다 명령 virsh dumpxml Ubutnu14Ubuntu14golang 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 Ubuntu14을 실행하면

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

는하지만, 올바른 XML 정의를 얻을.

누군가 내가 잘못하고있는 것에 대한 힌트를 줄 수 있다면 감사하겠습니다. 내 호스트 시스템은 Ubuntu-16.04하고 golang 버전은 당신이 두 시나리오에서 다른 사용자로 virsh를 실행하는 기대, 그리고 당신이 어떤 URI를 제공하지 않기 때문에, 그것은 다른 libvirtd 인스턴스에 연결하는 go1.6.2 linux/amd64

+0

는 virsh를 명령은 환경 변수의 종류에 의존 하는가 (분명히 오류가 너무 처리합니까)? 당신이 쉘 환경에서 실행되지 않는다는 것과 같은 명령을 실행할 때 – jcbwlkr

+0

그것이 이유라고 생각하지 않습니다. 내 코드에서 "virsh dumpxml"명령을 실행하면 올바르게 실행되고 "오류 : 명령'dumpxml'에 옵션이 필요합니다"라는 메시지가 표시됩니다. 쉘 환경에서 실행하면 동일한 결과를 얻습니다. – azizulhakim

+0

그것은 단지 직감이지만 도메인을 찾는 위치를 어떻게 알 수 있는지에 따라 여전히 문제가 될 수 있습니다. 그냥 시도해보십시오'virshCmd : = exec.Command ("sh", "-c", "virsh dumpxml Ubuntu14")' – jcbwlkr

답변

0

입니다. virsh를 비 루트로 실행하면 보통 qemu : /// 세션에 연결되지만 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