2010-06-30 6 views
6

Ich konnte keine Dokumentation finden, die die Existenz einer API angibt, die verwendet werden kann, um Dinge innerhalb eines qemu Gastes zu automatisieren.qemu Gast Automatisierung

Zum Beispiel möchte ich einen Prozess innerhalb der Gastmaschine von der Host-Maschine starten. Libvirt scheint diese Funktionalität nicht zu enthalten.

Antwort

3

Soweit ich weiß, ist die einzige Möglichkeit zur Kommunikation mit dem Gast über die Netzwerkbrücke.

+0

was bedeutet, ich muss ein Werkzeug schreiben, das auf jedem meiner Gäste läuft für Befehle abfragen ... – Raindog

+2

das ist nicht wahr, können Sie den Monitor verwenden, um Tastenanschläge zu senden. Es gibt auch einen parallelen Port und einen seriellen Port. –

0

Wenn Sie Linux im Gast verwenden, können Sie nicht einfach ssh/screen verwenden, um entfernte Prozesse auf dem Gast zu starten?

Alternativ Ich habe gesehen, wie Leute schreiben Python Wrapper, die popen() verwendet stdin/stdout zu greifen und die einige Befehle zu automatisieren (dh, wenn Sie die Login-Prompt sehen, den Login-Namen zu stdin von QEMU senden.

8

[Anmerkung:. Automation ohne jede Virtualisierungs API Von meinem blog post.]

Schritt 1:

verwendet standardmäßig qemu SDL den VGA-Ausgang zur Anzeige So ist der erste Schritt, um diese Wechselwirkung machen mit. qemu durch s TDIO. Qemu bietet hierfür eine Option.

Von qemu docs:

-nographic Normalerweise QEMU verwendet SDL den VGA-Ausgang angezeigt werden soll. Mit dieser Option können Sie die grafische Ausgabe vollständig deaktivieren, sodass QEMU eine einfache Befehlszeilenanwendung ist. Der emulierte serielle Port ist umgeleitet auf der Konsole. Daher können Sie QEMU weiterhin verwenden, um einen Linux-Kernel mit einer seriellen Konsole zu debuggen.

Also alles, was Sie tun müssen, ist qemu mit -nographic aufrufen.

qemu -nographic -hda guest.disk

Schritt 2:

Jetzt, wo Sie mit Ihrem Gast (oder Qemu-Prozess) in Wechselwirkung treten kann über die Befehlszeile, müssen Sie automatisieren diese Interaktion. Der offensichtliche Weg, dies in Python zu tun, ist den qemu-Prozess (mit -nographic) mit subprocess module zu starten und dann mit diesem Prozess zu kommunizieren. Aber zu meiner Überraschung hat das für mich einfach nicht geklappt. Also habe ich nach einem anderen Weg gesucht.

Später fand ich heraus, dass das großartigste Werkzeug für diese Art von Jobs Expect ist. Es ist ein Automatisierungswerkzeug für interaktive Anwendungen, die in tcl geschrieben sind.

This guide sollte Ihnen helfen, mit Expect zu beginnen. Hier ist das Skript, um einen Gast mit qemu mit Expect laufen zu lassen.

+0

Sie sollten für diese Antwort wie hundert Punkte erhalten! Also verdammt großartig! Vielen Dank! –

1

Sie können einen umgekehrten SSH-Tunnel von Gast zu Host erstellen, der jede Anfrage an den Host auf einem bestimmten Port zum Gast weiterleitet. Auf diese Weise können Sie Gäste vom Host aus steuern.

3

Die QEMU Monitor kann in begrenztem Umfang mit Gast-Systemen interagieren, indem sie eine eigene Konsole verwendet. Dies umfasst das Lesen von Registern, das Steuern der Maus/Tastatur und das Abrufen von Bildschirm-Dumps. Es gibt eine QEMU Monitor Protocol (QMP), mit der Sie JSON-Befehle an das Gastsystem übergeben und Werte daraus lesen können.

0

Sie können auf Gast über das Netz zugreifen, indem Sie net bridge einstellen oder -hostfwd verwenden.

Letzteres ist einfacher. Damit können Sie den Gast-TCP/UDP-Port zum Host exportieren. Sie können guest tcp port 22 zuordnen, um den Gast so zu hosten und zu verwalten, wie Sie echte Remote-Computer verwalten. Sehen Sie diesen Blog Running qemu at background.

2

Ich benutze Python mit Pexpect, um mit erzeugten VMs mit ihren seriellen Konsolen zu interagieren. Ich automatisiere in der Regel Szenarien, die auf diese Weise bis zu 128VMs haben, es ist ziemlich schnell. Ich benutze in der Regel virt-install, um Gäste zu instanziieren, und benutze "virsh console (domainname)" mit pexpect, um eine "Handle" zu jeder Konsole zu bekommen, also kann ich Befehle senden, um Netzwerk, Start-Tools/Dienstprogramme/Skripte zu konfigurieren, usw. Ziemlich süß in Sachen Einfachheit, und da die Skripte nur Shell-Befehle ausgeben, sind Sie keinen APIs ausgesetzt, die sich von Version zu Version ändern, z Die serielle Konsole wird immer da sein. Manchmal benutze ich qemu direkt, (in letzter Zeit arbeite ich mit einem QEMU, das libvirt nicht unterstützt, da es zu neu ist), in diesem Fall benutze ich einen telnet-Port, damit ich "telnet localhost portnumber" erstellen kann Konsolenverbindung anstelle von "virsh console (domainname)". So oder so, Python-Skripte mit dem Pexpect-Modul für die Interaktion mit VMs ist großartig.

1

PyQemu kann dies theoretisch tun. Ich habe es in der Vergangenheit benutzt, obwohl es jetzt wie ein abgestandenes Projekt aussieht. Es stellt einen Python-Agenten (das Äquivalent zu den VMWare-Gast-Tools) bereit, der auf dem Gast ausgeführt wird und über den seriellen Anschluss mit dem Host kommuniziert. Sie können Proxys für Python-Module abrufen, die im Kontext der VM ausgeführt werden, und jede Kommunikation mit ihnen wird über den seriellen Port gemarshallt. Im folgende Beispiel verwendet wird AutoIt Notepad zu automatisieren:

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

Caveat: Durch Verwendung der serielle Schnittstelle aus schnell weit ist (unabhängig von den seriellen Geschwindigkeitseinstellungen), so vielleicht am besten keine Massendaten zu übertragen, indem andere Mittel, z Virtuelles FAT-Disk-Image.