2010-06-30 13 views
6

Non sono stato in grado di trovare alcuna documentazione attestante l'esistenza di un'API che può essere utilizzata per automatizzare le cose all'interno di un guest qemu.qemu guest automation

Ad esempio, vorrei avviare un processo all'interno della macchina guest dalla macchina host. Libvirt non sembra contenere tale funzionalità.

risposta

3

Per quanto ne so, l'unico modo per comunicare all'ospite è attraverso il bridge di rete.

+0

il che significa che devo scrivere uno strumento che viene eseguito su ciascun ospite che esegue il polling dei comandi ... – Raindog

+2

non è vero, è possibile utilizzare il monitor per inviare sequenze di tasti. c'è anche una porta parallela e una porta seriale. –

0

Se si sta eseguendo Linux nel guest, non è possibile utilizzare ssh/screen per avviare processi remoti sul guest?

persone In alternativa, ho visto scrivere wrapper python che utilizzano popen() per afferrare stdin/stdout e usare quelli per automatizzare alcuni comandi (ad esempio quando si vede il prompt di login, inviare il nome di login per stdin di QEMU.

8

[Nota:. automazione senza l'utilizzo di qualsiasi API di virtualizzazione Dal mio blog post.]

fase 1:

per impostazione predefinita, qemu usa SDL per visualizzare l'output VGA Quindi, il primo passo è rendere questa interazione con. qemu attraverso s tdio. Qemu offre un'opzione per questo.

Da documenti qemu:

-nographic Normalmente, QEMU utilizza SDL per visualizzare l'output VGA. Con questa opzione, è possibile disabilitare completamente l'output grafico in modo che QEMU sia una semplice applicazione a riga di comando. La porta seriale emulata è reindirizzata sulla console. Pertanto, è ancora possibile utilizzare QEMU per eseguire il debug di un kernel Linux con una console seriale.

Quindi, tutto ciò che dovete fare è invocare qemu con -nografico.

QEMU -nographic -hda guest.disk

Fase 2:

Ora che è possibile interagire con il vostro ospite (o il processo qemu) attraverso la linea di comando, è necessario automatizzare questa interazione Il modo ovvio per farlo in python è avviare il processo qemu (con -nographic) con subprocess module e quindi comunicare con quel processo. Ma con mia sorpresa, questo non ha funzionato per me. Quindi, ho cercato un altro modo.

Successivamente, ho scoperto che lo strumento più eccezionale per questo tipo di lavoro è Expect. È uno strumento di automazione per applicazioni interattive scritto in tcl.

This guide dovrebbe aiutarti a iniziare con Expect. Ecco lo script per eseguire un guest con qemu usando 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” 
+0

Dovresti ottenere un centinaio di punti per questa risposta! Così fantastico! Grazie! –

1

È possibile creare un tunnel ssh inversa da ospite per ospitare, che reindirizzare ogni richiesta di ospitare sul porta specifica di ospitalità. In questo modo sarai in grado di controllare l'ospite dall'host.

3

Il QEMU Monitor può interagire con i sistemi guest in misura limitata utilizzando la propria console. Ciò include la lettura di registri, il controllo del mouse/tastiera e l'acquisizione di dump dello schermo. C'è un QEMU Monitor Protocol (QMP) che consente di passare i comandi JSON e leggere i valori dal sistema guest.

0

È possibile accedere ai guest attraverso la rete impostando net bridge o usando l'opzione -hostfwd.

Quest'ultimo è più semplice. Ti consente di esportare la porta tcp/udp guest in host. Puoi mappare la porta tcp guest 22 per ospitare e gestire il guest come se gestissi macchine remote reali. Vedi questo blog Running qemu at background.

2

Io uso python con pexpect per interagire con VM generate utilizzando le loro console seriali. Generalmente automatizzo gli scenari che hanno fino a 128 VM in questo modo, è ragionevolmente veloce. In genere utilizzo virt-install per istanziare gli ospiti e utilizzare "virsh console (domainname)" usando pexpect per ottenere un "handle" su ogni console, quindi posso inviare comandi per configurare networking, strumenti di avvio/utilità/script, operazioni di monitoraggio, ecc. Abbastanza dolce in termini di semplicità, e dal momento che gli script inviano comandi di shell, non sei esposto alle API che cambiano da versione a versione, ad esempio la console seriale sarà sempre lì. A volte uso direttamente qemu, (ultimamente sto lavorando con un QEMU che libvirt non supporta dal momento che è troppo nuovo), in quel caso avrò la console ospite che usa una porta telnet così posso "telnet localhost portnumber" per fare un connessione console invece di "virsh console (domainname)". In ogni caso, gli script Python con il modulo pexpect per interagire con VM sono grandiosi.

1

PyQemu può teoricamente farlo. L'ho usato in passato, anche se ora sembra un progetto obsoleto. Fornisce un agente python (l'equivalente degli strumenti guest di VMWare) per l'esecuzione sul guest, comunicando con l'host tramite la porta seriale. È possibile ottenere proxy per moduli Python in esecuzione nel contesto della VM e qualsiasi comunicazione con essi viene eseguita il marshalling sulla porta seriale. Nel seguente esempio, AutoIt viene utilizzato per automatizzare Blocco note:

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: A causa tramite la porta seriale è tutt'altro che breve (indipendentemente dalle impostazioni di velocità seriali), quindi forse migliore per trasferire i dati bulk da altri mezzi, ad es Immagine del disco FAT virtuale.

Problemi correlati