2010-06-30 2 views
6

qemu 게스트 내부의 작업을 자동화하는 데 사용할 수있는 API의 존재를 설명하는 문서를 찾을 수 없었습니다.qemu 게스트 자동화

예를 들어 호스트 컴퓨터에서 게스트 시스템 내부의 프로세스를 시작하고 싶습니다. Libvirt에는 이러한 기능이 포함되어 있지 않습니다.

답변

3

내가 아는 한, 게스트와 통신하는 유일한 방법은 네트워크 브리지를 이용하는 것입니다.

+0

즉, 각 게스트가 명령을 폴링하는 도구를 작성해야합니다 ... – Raindog

+2

이 사실이 아니므로 모니터를 사용하여 키 입력을 보낼 수 있습니다. 또한 병렬 포트와 직렬 포트가 있습니다. –

0

게스트에서 Linux를 실행중인 경우 ssh/screen을 사용하여 게스트에서 원격 프로세스를 시작할 수 없습니까? 당신이 로그인 프롬프트를 볼 때, QEMU의 표준 입력에 로그인 이름을 보내 즉

또는 내가 본 사람들은 표준 입력/표준 출력을 잡고 (몇 가지 명령을 자동화하는 사람들을 사용 popen()을 사용하여 파이썬 래퍼를 작성합니다.

8

[참고 :.. 어떤 가상화 API를 사용하지 않고 자동화 내 blog post에서]

1 단계 : 기본적으로

, QEMU는 VGA 출력을 표시하는 SDL을 사용 그래서, 첫 번째 단계로이 상호 작용을합니다. qemu부터 s까지 tdio. Qemu는이를위한 옵션을 제공합니다. QEMU 워드 프로세서에서

:

-nographic 보통은 QEMU는 VGA 출력을 표시하는 SDL을 사용한다. 이 옵션을 사용하면 QEMU가 간단한 명령 줄 응용 프로그램 이되도록 그래픽 출력을 완전히 비활성화 할 수 있습니다. 에뮬레이트 된 직렬 포트는 콘솔에 리디렉션 된 입니다. 따라서 QEMU를 사용하여 직렬 콘솔이있는 Linux 커널 을 디버깅 할 수 있습니다.

이렇게하려면 qemu를 -nographic과 함께 호출해야합니다.

QEMU -nographic -hda guest.disk

2 단계 : 당신이, 당신이 자동화 할 수있는 명령 줄을 통해 손님 (또는 QEMU 프로세스)와 상호 작용할 수 있습니다 이제

이 상호 작용. 파이썬에서 이것을하는 분명한 방법은 subprocess module으로 qemu 프로세스 (--nographic)를 시작한 다음 그 프로세스와 통신하는 것입니다. 그러나 놀랍게도, 이것은 단지 나를 위해 잘되지 않았습니다. 그래서 나는 다른 방법을 찾았습니다.

나중에이 종류의 작업에 가장 유용한 도구는 Expect입니다. 이것은 tcl로 작성된 대화 형 응용 프로그램을위한 자동화 도구입니다.

This guide은 Expect를 시작하는 데 도움이됩니다. 다음은 Expect를 사용하여 qemu로 게스트를 실행하는 스크립트입니다.

+0

이 답을 얻으려면 100 점이되어야합니다! 너무 괴물 같아! 고맙습니다! –

1

게스트에서 호스트로 역 ssh 터널을 만들면 각 요청을 특정 포트의 호스트에서 guest로 리디렉션 할 수 있습니다. 이 방법은 호스트에서 게스트를 제어하는 ​​데 도움이됩니다.

3

QEMU Monitor은 자체 콘솔을 사용하여 게스트 시스템과 제한된 범위로 상호 작용할 수 있습니다. 여기에는 레지스터 읽기, 마우스/키보드 제어 및 화면 덤프 가져 오기가 포함됩니다. QEMU Monitor Protocol (QMP)은 JSON 명령을 전달하고 게스트 시스템에서 값을 읽도록합니다.

0

net bridge를 설정하거나 -hostfwd 옵션을 사용하여 게스트를 통해 게스트에 액세스 할 수 있습니다.

후자는 더 간단합니다. 게스트 tcp/udp 포트를 호스트로 내보낼 수 있습니다. 게스트 tcp 포트 22를 호스트로 매핑하고 실제 원격 시스템을 관리하는 것처럼 게스트를 관리 할 수 ​​있습니다. 이 블로그 Running qemu at background을 참조하십시오.

2

나는 시리얼 콘솔을 사용하여 생성 된 VM과 상호 작용하기 위해 pexpect와 함께 python을 사용합니다. 필자는 일반적으로 합리적인 속도로 최대 128VM을 가진 시나리오를 자동화합니다. 필자는 일반적으로 virt-install을 사용하여 게스트를 인스턴스화하고 pexpect를 사용하여 "virsh console (domainname)"을 사용하여 각 콘솔에 "핸들"을 제공하므로 네트워킹, 시작 도구/유틸리티/스크립트, 모니터 작동, 예를 들어, 단순성 측면에서 보면 꽤 다행스럽고 스크립트가 쉘 명령을 발행하기 때문에 버전간에 변경되는 API에는 노출되지 않습니다. 시리얼 콘솔이 항상있을 것입니다. 때때로 저는 qemu를 직접 사용합니다. (최근에는 libvirt가 너무 새로운 QEMU를 지원하고 있습니다.) 그런 경우에는 게스트 콘솔에 텔넷 포트를 사용하여 "telnet localhost portnumber"를 사용하여 "virsh console (domainname)"대신 콘솔 연결. 어느 쪽이든, VM과 상호 작용하기위한 pexpect 모듈을 가진 python 스크립트는 훌륭합니다.

1

PyQemu가 이론적으로이를 수행 할 수 있습니다. 나는 과거에 그것을 사용했지만 지금은 부실한 프로젝트처럼 보입니다. VMWare 게스트 도구와 동일한 Python 에이전트를 제공하여 게스트에서 실행하고 직렬 포트를 통해 호스트와 통신합니다. VM의 컨텍스트에서 실행되는 Python 모듈에 프록시를 가져올 수 있으며이 프록시와의 모든 통신은 직렬 포트를 통해 마샬링됩니다. 그래서 아마도 가장에 의한 대량의 데이터를 전송하기 때문에 그것까지 (에 관계없이 시리얼 속도 설정의) 빠른로부터 직렬 포트를 사용하여 :

machine = PyQemu.GetProxy("win2k") 

# Wrap the machine object in another proxy representing the 'os' 
# module running inside the VM. 
os = PyQemu.vm.Module(machine,"os") 

# NOTE: This is running on the VM! 
os.system("notepad") 

# Get an IDispatch object representing the autoit ActiveX control 
autoit = PyQemu.vm.Dispatch(machine,"AutoItX3.Control") 

# See if a window is active on the VM 
state = autoit.WinActive("Untitled -") 

경고 : 다음 예에서 AutoIt이는 메모장을 자동화하는 데 사용되는 다른 수단, 예. 가상 FAT 디스크 이미지.