Frage

Ich habe nicht in der Lage gewesen, eine Dokumentation zu finden, die Existenz einer API besagt, die verwendet werden können Dinge innerhalb eines qemu Gastes zu automatisieren.

Zum Beispiel würde Ich mag einen Prozess innerhalb der Gastmaschine von der Host-Maschine starten. Libvirt nicht erscheint eine solche Funktionalität enthalten.

War es hilfreich?

Lösung

Soweit ich weiß, ist der einzige Weg, um den Gast zu kommunizieren, ist durch die Netzwerkbrücke.

Andere Tipps

[Anmerkung: Automation ohne jede Virtualisierungs API. Aus meiner Blog-Post .]

Schritt 1:

Standardmäßig verwendet qemu SDL den VGA-Ausgang angezeigt werden soll. So ist der erste Schritt, um diese Wechselwirkung machen mit Qemu durch stdio. Qemu bietet eine Option für diese.

Von qemu docs:

-nographic Normalerweise QEMU verwendet SDL den VGA-Ausgang angezeigt werden soll. Mit dieser Option können Sie vollständig deaktivieren grafische Ausgabe, so dass QEMU eine einfache Kommandozeilen-Anwendung. Der emulierte serielle Schnittstelle auf der Konsole umgeleitet. Daher können Sie immer noch QEMU zu debuggen verwenden ein Linux-Kernel mit einer seriellen Konsole.

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

qemu -nographic -hda guest.disk

Schritt 2:

Nun, da Sie mit Ihrem Gast in Wechselwirkung treten können (oder Qemu-Prozess) über die Befehlszeile, müssen Sie diese Interaktion automatisieren. Der offensichtliche Weg, dies in Python zu tun ist, um den qemu Prozess starten (mit -nographic) mit erwarten . Es ist ein Automatisierungs-Tool für interaktive Anwendungen in Tcl geschrieben.

Dieser Leitfaden mit Erwarten in den ersten Schritten helfen Ihnen sollte. Hier ist das Skript einen Gast laufen mit Qemu mit Expect.

#!/usr/bin/expect -f

#starts guest vm, run benchmarks, poweroff
set timeout -1

#Assign a variable to the log file
set log     [lindex $argv 0]

#Start the guest VM
spawn qemu -nographic -hda guest.disk

#Login process
expect “login: “
#Enter username
send “user\r”

#Enter Password
expect “Password: “
send “user\r”

#Do whatever you want to do with in the guest VM. ( Run a process and write result to log )

#poweroff the Guest VM
expect “# “
send “shutdown -h now\r”

Die QEMU-Monitor mit Gastsystemen in begrenztem Umfang in Wechselwirkung treten können unter Verwendung ihrer eigenen Konsole . Dazu gehören Register, die Steuerung der Maus / Tastatur, und immer Bildschirm Dumps zu lesen. Es gibt eine QEMU-Monitor Protocol (QMP) dass Lassen Sie sich übergeben Sie JSON-Befehle und lesen Werte aus dem Gastsystem .

Ich benutze Python mit pexpect mit gelaicht VMs mit ihren seriellen Konsolen zu interagieren. Ich automatisieren allgemein Szenarien, die auf diese Weise 128VMs haben auf, seine ziemlich schnell. Ich benutze im Allgemeinen instantiate Gäste-virt installieren und verwenden „virsh Konsole (Domain Name)“ pexpect mit auf jede Konsole einen „Griff“ zu bekommen, so dass ich Befehle Konfigurieren von Netzwerken, Start-up-Tool / Utilities / scripts, Monitor-Betrieb senden, usw. Ziemlich süß in Bezug auf Einfachheit, und da die Skripte Shell-Befehle nur erteilen, Sie sind nicht zu APIs, dass Wechsel von Version zu Version ausgesetzt, zB die serielle Konsole wird immer da sein. Manchmal benutze ich Qemu direkt, (in letzter Zeit mich mit einem QEMU arbeite, dass libvirt nicht da sein zu neu unterstützt), in diesem Fall muß ich die Gast-Konsole verwenden, um ein Telnet-Port, so kann ich „telnet localhost Port-Nummer“ a machen Konsolenverbindung anstelle von „virsh Konsole (Domain Name)“. So oder so, Python-Skripte mit dem pexpect Modul mit VMs für die Interaktion ist groß.

Sie können einen Reverse-SSH-Tunnel von Gast zu Host erstellen, das jede Anforderung an Host auf bestimmt Port zu Gast umleitet. Auf diese Weise wird Ihnen helfen, Gast von Host zu steuern.

PyQemu kann dies theoretisch tun. Ich habe es in der Vergangenheit verwendet, obwohl es jetzt wie ein abgestanden Projekt aussieht. Es bietet einen Python-Agenten (das äquivalent von VMWare Gast-Tool) auf dem Gast zu laufen, mit dem Host über die serielle Schnittstelle in Verbindung steht. Sie können im Rahmen der VM läuft Proxies Python-Modulen erhalten, und jede Kommunikation mit ihnen ist die serielle Schnittstelle gemarshallt über. Im folgenden Beispiel wird AutoIt verwendet 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 die serielle Schnittstelle verwendet es bei weitem nicht schnell ist (unabhängig von den seriellen Geschwindigkeitseinstellungen), so vielleicht am besten mit anderen Mitteln keine Massendaten übertragen, z.B. Virtual FAT Disk-Image.

Wenn Sie Linux im Gast laufen lassen, konnte nicht einfach ssh / Bildschirm verwenden Remote-Prozesse auf dem Gast zu starten?

Alternativ, ich habe gesehen, wie Menschen schreiben Python-Wrapper, dass die Verwendung popen() zu greifen stdin / stdout und diejenigen, verwenden einige Befehle zu automatisieren (das heißt, wenn Sie die Login-Prompt sehen, zu stdin von QEMU den Login-Namen senden.

Sie können durch das Setzen Netzbrücke oder mit -hostfwd Option Gast durch Netz zugreifen.

Letzteres ist einfacher. Es lässt Sie Gast TCP / UDP-Port-Host exportieren. Sie können Gast TCP-Port 22 auf Host-Karte und den Gast verwalten, wie Sie echte Remote-Computer zu verwalten. Sehen Sie dieses Blog Laufende Qemu im Hintergrund .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top