Pregunta

No he sido capaz de encontrar ninguna documentación que indica la existencia de una API que se puede utilizar para automatizar cosas en el interior de un invitado qemu.

Por ejemplo, me gustaría poner en marcha un proceso en el interior de la máquina invitado de la máquina host. Libvirt no parece contener dicha funcionalidad.

¿Fue útil?

Solución

Por lo que yo sé, la única manera de comunicarse con el cliente es a través del puente de red.

Otros consejos

[Nota: La automatización sin necesidad de utilizar cualquier API de virtualización. Desde mi entrada de blog .]

Paso 1:

Por defecto, qemu utiliza SDL para mostrar la salida VGA. Por lo tanto, el primer paso es hacer que esta interacción con qemu través de stdio. Qemu proporciona una opción para esto.

A partir de documentos qemu:

  

-nographic normalmente, QEMU utiliza SDL para mostrar la salida VGA. Con esta opción, puede desactivar por completo la salida gráfica de manera que es QEMU   una aplicación de línea de comandos sencilla. El puerto serie es emulado   redirigida en la consola. Por lo tanto, todavía se puede utilizar para depurar QEMU   kernel de Linux con una consola serie.

Por lo tanto, todo lo que tiene que hacer es invocar qemu con -nographic.

  

qemu -nographic -hda guest.disk

Paso 2:

Ahora que se puede interactuar con su huésped (o qemu proceso) a través de línea de comandos, hay que automatizar esta interacción. La manera obvia de hacerlo en Python es iniciar el proceso qemu (con -nographic) con subproceso módulo y luego comunicarse con ese proceso. Pero para mi sorpresa, esto simplemente no funcionó para mí. Por lo tanto, me puse a buscar alguna otra manera.

Más tarde, descubrí que la herramienta más impresionante para este tipo de trabajos es esperar . Es una herramienta de automatización para aplicaciones interactivas escritos en TCL.

Esta guía que debería ayudar a empezar con esperar. Aquí está la secuencia de comandos para ejecutar un invitado con QEMU usando esperar.

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

El QEMU monitor puede interactuar con sistemas invitados de forma limitada utilizando su propia consola . Esto incluye la lectura de registros, el control del ratón / teclado, y conseguir descargas de pantalla. Hay una QEMU Monitor protocol (QMP) que vamos a pasar a los comandos de JSON y leer los valores del sistema invitado .

Yo uso pitón con pexpect para interactuar con engendrado máquinas virtuales mediante sus consolas de serie. Yo por lo general automatizar escenarios que tienen hasta 128VMs esta manera, su razonablemente rápida. Yo generalmente uso de virt-install para huéspedes instanciar, y el uso de "consola virsh (nombre de dominio)" mediante pexpect para conseguir un "mango" para cada consola, por lo que puede enviar comandos a la creación de redes de configuración, herramientas de inicio / utilidades / scripts, el funcionamiento del monitor, etc. Muy dulce en términos de simplicidad, y dado que los scripts se acaba de emitir comandos de shell, no está expuesto a las API que el cambio de versión en versión, por ejemplo, la consola serie siempre estará ahí. A veces uso qemu directamente, (últimamente estoy trabajando con un QEMU que libvirt no soporta desde su demasiado nuevo), en ese caso tendré el uso consola de invitado un puerto telnet para que pueda "telnet localhost número de puerto" para hacer una conexión de consola en lugar de "consola virsh (nombre de dominio)". De cualquier manera, los scripts de Python con el módulo pexpect para interactuar con las máquinas virtuales es grande.

Se puede crear un túnel ssh inverso de invitado a anfitrión, que redirigirá cada solicitud de host en el puerto específico de alojamiento. De esta manera le ayudará a controlar invitado de acogida.

PyQemu puede hacer teóricamente esto. Lo he utilizado en el pasado, a pesar de que parece un proyecto rancio ahora. Se proporciona un agente de pitón (el equivalente de herramientas de los huéspedes VMWare) para funcionar en el huésped, la comunicación con el host a través del puerto serie. Puede obtener proxies a los módulos de Python que se ejecutan en el contexto de la máquina virtual, y cualquier comunicación con ellos se calculan referencias través del puerto serie. En el siguiente ejemplo, AutoIt está siendo utilizado para automatizar Bloc de notas:

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

Advertencia: Debido a través del puerto serie que está lejos de rápida (independientemente de la configuración de la velocidad de serie), así que quizás mejor para transferir los datos a granel por otros medios, por ejemplo, imagen de disco FAT virtual.

Si está ejecutando Linux en el invitado, no se puede simplemente usar ssh / pantalla para iniciar procesos remotos en el invitado?

personas Alternativamente, he visto escribir envoltorios de pitón que el uso popen() para agarrar stdin / stdout y las usará para automatizar algunos comandos (es decir, cuando vea el indicador de conexión, enviar el nombre de inicio de sesión a la entrada estándar de QEMU.

Se puede acceder a través de red de invitados mediante el establecimiento de puente de red o utilizando la opción -hostfwd.

Este último es más simple. Se le permite exportar tcp puerto de invitados / UDP al host. Puede asignar el puerto TCP 22 invitados para alojar y gestionar los huéspedes como a manejar las máquinas remotas reales. Ver este blog Correr qemu en el fondo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top