2010-06-30 13 views
6

No he podido encontrar ninguna documentación que indique la existencia de una API que se puede usar para automatizar las cosas dentro de un qemu guest.qemu guest automation

Por ejemplo, me gustaría iniciar un proceso dentro de la máquina invitada desde la máquina host. Libvirt no parece contener tal funcionalidad.

Respuesta

3

Hasta donde yo sé, la única forma de comunicarse con el huésped es a través del puente de red.

+0

lo que significa que tengo que escribir una herramienta que se ejecuta en cada uno de mis invitados sondeando para obtener comandos ... – Raindog

+2

eso no es cierto, puede usar el monitor para enviar las teclas presionadas. también hay un puerto paralelo y un puerto serie. –

0

Si está ejecutando Linux en el invitado, ¿no podría simplemente usar ssh/screen para iniciar procesos remotos en el invitado?

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

8

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

paso 1:

Por defecto, qemu utiliza SDL para mostrar la salida VGA Así, el primer paso es hacer que esta interacción con. qemu a través de s tdio. Qemu ofrece 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 deshabilitar totalmente la salida gráfica para que QEMU sea una aplicación de línea de comando simple. El puerto serie emulado es redirigido en la consola. Por lo tanto, aún puede usar QEMU para depurar un kernel de Linux con una consola serie.

Entonces, 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 proceso qemu) a través de línea de comandos, hay que automatizar esta interacción La forma obvia de hacerlo en python es iniciar el proceso qemu (con -nographic) con subprocess module y luego comunicarse con ese proceso. Pero para mi sorpresa, esto no funcionó para mí. Entonces, busqué de otra manera.

Más tarde, descubrí que la herramienta más increíble para este tipo de trabajos es Expect. Es una herramienta de automatización para aplicaciones interactivas escritas en tcl.

This guide debería ayudarlo a comenzar 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” 
+0

¡Debe obtener como cien puntos para esta respuesta! ¡Tan increíble! ¡Gracias! –

1

Puede crear un túnel ssh inverso de invitado a host, que redireccionará cada solicitud de host en un puerto específico a invitado. De esta forma, te ayudará a controlar a los invitados desde el host.

3

El QEMU Monitor puede interactuar con sistemas invitados de forma limitada utilizando su propia consola. Esto incluye leer registros, controlar el mouse/teclado y obtener volcados de pantalla. Hay un QEMU Monitor Protocol (QMP) que le permite pasar comandos JSON y leer valores del sistema invitado.

0

Puede acceder al invitado a través de net configurando net bridge o utilizando la opción -hostfwd.

Este último es más simple. Le permite exportar el puerto tcp/udp invitado al host. Puede asignar el puerto 22 de tcp invitado para alojar y administrar al huésped como si administrara máquinas remotas reales. Ver este blog Running qemu at background.

2

Uso python con pexpect para interactuar con máquinas virtuales generadas usando sus consolas serie. Por lo general, automatizo los escenarios que tienen hasta 128 VM de esta manera, es razonablemente rápido. Generalmente utilizo virt-install para crear instancias de invitados y uso "virsh console (domainname)" usando pexpect para obtener un "handle" para cada consola, así puedo enviar comandos para configurar networking, herramientas de inicio/utilidades/scripts, supervisar el funcionamiento, etc. Muy dulce en términos de simplicidad, y dado que los scripts solo emiten comandos de shell, usted no está expuesto a API que cambian de una versión a otra, por ejemplo la consola serial siempre estará allí. A veces uso qemu directamente, (últimamente estoy trabajando con un QEMU que libvirt no admite porque es demasiado nuevo), en ese caso tendré la consola invitada usando un puerto telnet para poder "telnet localhost portnumber" para hacer un conexión de la consola en lugar de "virsh console (domainname)". De cualquier manera, las secuencias de comandos de Python con el módulo pexpect para interactuar con las máquinas virtuales son geniales.

1

PyQemu teóricamente puede hacer esto. Lo he usado en el pasado, aunque ahora parece un proyecto obsoleto. Proporciona un agente de python (el equivalente de las herramientas de invitado de VMWare) para ejecutarse en el invitado, comunicándose con el host a través del puerto serie. Puede obtener proxies para los módulos de python que se ejecutan en el contexto de la máquina virtual, y cualquier comunicación con ellos se calcula a través del puerto serie. En el siguiente ejemplo, AutoIt se utiliza para automatizar el 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 ser rápida (independientemente de la configuración de velocidad de serie), así que quizás mejor forma de transferir los datos a granel por otros medios, por ejemplo Imagen de disco FAT virtual.

Cuestiones relacionadas