Domanda

Non sono stato in grado di trovare alcuna documentazione attestante l'esistenza di un'API che può essere utilizzato per automatizzare le cose all'interno di un ospite QEMU.

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

È stato utile?

Soluzione

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

Altri suggerimenti

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

Passaggio 1:

Per impostazione predefinita, QEMU utilizza SDL per visualizzare l'output VGA. Quindi, il primo passo è rendere questa interazione con QEMU attraverso stdio. Qemu fornisce un'opzione per questo.

Da documentazione QEMU:

  

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

Quindi, tutto quello che dovete fare è invoke QEMU con -nographic.

  

QEMU -nographic -hda guest.disk

Passaggio 2:

Ora che è possibile interagire con il vostro ospite (o qemu processo) attraverso la linea di comando, è necessario automatizzare questa interazione. Il modo più ovvio per fare questo in pitone è avviare il processo di QEMU (con -nographic) con sottoprocesso modulo e quindi comunicare con tale processo. Ma con mia sorpresa, questo proprio non ha funzionato per me. Così, ho cercato qualche altro modo.

Più tardi, ho scoperto che lo strumento più impressionante per questo tipo di posti di lavoro è Aspettatevi . Si tratta di uno strumento di automazione per le applicazioni interattive scritte in Tcl.

Questa guida dovrebbe aiutare a iniziare con Expect. Ecco lo script per eseguire un ospite con QEMU usando Aspettatevi.

#!/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”

Il QEMU Monitor può interagire con i sistemi guest in misura limitata usando il suo propria console . Questo include la lettura di registri, il controllo del mouse / tastiera, e ottenere discariche schermo. C'è un QEMU Monitor Protocol (QMP) che ti permette di inviare comandi a JSON e leggere i valori dal sistema guest .

Io uso python con pexpect di interagire con le macchine virtuali generato usando le loro console seriali. Io generalmente automatizzare scenari che hanno fino a 128VMs questo modo, la sua ragionevolmente veloce. Io generalmente uso virt-install per gli ospiti istanziare e utilizzare "console virsh (Domain Name)" utilizzando pexpect per ottenere un "manico" per ogni console, in modo da poter inviare comandi al networking configurazione, strumenti di avvio / utilities / script, il funzionamento del monitor, ecc abbastanza dolce in termini di semplicità, e dal momento che gli script sono solo inviare comandi di shell, non sono esposti alle API che il cambiamento di versione in versione, ad esempio, la console seriale sarà sempre lì. A volte uso QEMU direttamente, (ultimamente sto lavorando con un QEMU che libvirt non supporta fin dalla sua anche nuovo), in questo caso avrò l'uso della console degli ospiti una porta telnet in modo da poter "telnet localhost portnumber" per fare un connessione alla console invece di "console virsh (Domain Name)". In entrambi i casi, gli script Python con il modulo di pexpect per l'interazione con le macchine virtuali è grande.

È possibile creare un tunnel ssh inversa da ospite a ospite, che reindirizzare ogni richiesta di host sulla porta specifica di ospitalità. In questo modo vi aiuterà a controllare ospite da host.

PyQemu può teoricamente fare questo. L'ho usato in passato, anche se sembra un progetto stantio ora. Esso fornisce un agente pitone (l'equivalente di VMWare degli strumenti) per eseguire nel guest, comunicante con l'host tramite porta seriale. È possibile ottenere deleghe ai moduli Python in esecuzione nel contesto della macchina virtuale, e ogni comunicazione con loro è il marshalling tramite la 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 meglio trasferire dati bulk con altri mezzi, ad esempio immagine del disco Virtual FAT.

Se stai usando Linux nel guest, non potresti semplicemente usare ssh / schermo per lanciare processi remoti l'ospite?

In alternativa la gente, ho visto scrivere wrapper python che l'uso popen() per afferrare stdin / stdout e usare quelli per automatizzare alcuni comandi (vale a dire quando si vede il login pronta, inviare il nome di login per stdin di QEMU.

È possibile accedere ospiti tramite rete impostando bridge di rete o utilizzando l'opzione -hostfwd.

Il secondo è più semplice. Esso consente di esportare ospite porta TCP / UDP all'host. È possibile mappare la porta ospite TCP 22 per ospitare e gestire l'ospite come gestire macchine remote reali. Vedere questo blog QEMU Esecuzione a sfondo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top