QEMU
QEMU es un software que recrea una máquina virtual. La máquina virtual cuenta con su propio procesador (igual o diferente al de la máquina física en la que corre QEMU), memoria y todos los elementos necesarios para ejecutar un SO con sus aplicaciones.
QEMU ha sido desarrollado por Fabrice Bellard, y es software libre GPL. En un principio KQEMU no se desarrolló como software libre, pero desde el 6 de febrero de 2007 está cubierto por la GPL.
Modos de funcionamiento
QEMU puede funcionar de dos manera diferentes:
- Como un emulador de otro hardware
- En este modo QEMU emula todos los componentes físicos de un ordenador real (procesador, memoria, buses, periféricos...). La CPU emulada puede ser diferente de la CPU física que se utiliza para ejecutar QEMU, de esta manera es posible ejecutar en el emulador programas para una arquitectura diferente. Se utiliza traducción dinámica para aumentar la velocidad de emulación.
- Como un virtualizador
- Este modo depende de un componente llamado "acelerador QEMU" o bien KQEMU, que es un driver que permite ejecutar el código de la máquina huésped directamente en la CPU física. De esta manera se alcanza una velocidad de ejecución similar a la velocidad de ejecución nativa. En este caso la máquina hospedada y la CPU física deben ser x86.
QEMU aporta soluciones al desarrollo cruzado (es posible ejecutar los binarios compilados para una arquitectura diferente de la nativa) y permite acercarse al mundo de la virtualización en la arquitectura x86 sin la complejidad de otras soluciones. Cuando funciona como virtualizador no necesita soporte hardware específico (la máquina anfitrión no es necesario que implemente las instrucciones Intel VT o AMD-V) y puede ejecutar cualquier SO sin modificaciones.
Cuando funciona como emulador puede emular sólo el µP o bien el hardware de todo el sistema informático.
Componentes
Puede instalarse QEMU a través de los paquetes preparados para la distribución de GNU/Linux que se esté utilizando o bien desde la web del proyecto http://fabrice.bellard.free.fr/qemu/download.html que proporciona:
- El código y documentación de QEMU
- Algunas versiones precompiladas para GNU/Linux, Mac OS X y Windows
- Imágenes de ejemplo para algunos sistemas emulados
La distribución de QEMU y KQEMU se ha realizado de forma diferente pues este último, aunque gratuito no era software libre. Cabe esperar que a partir de ahora las distribuciones empaqueten KQEMU de forma predeterminada.
Al instalar QEMU se obtienen diferentes herramientas. La mayor parte de las veces la aplicación qemu será la que utilizaremos para lanzar una nueva máquina virtual, pero existirá una aplicación (qemu-img) destinada a preparar y manipular imágenes de disco para las máquinas emuladas y un conjunto de aplicaciones qemu-<µP> y qemu-system-<µP> que nos permitirán emular determinado microprocesador o bien todo un sistema basado en dicho µP.
Función | Herramienta |
---|---|
Emulador/Virtualizador x86 | qemu |
Preparar/convertir imágenes de disco | qemu-img |
Emular diferentes microprocesadores | qemu-arm qemu-armeb qemu-i386 qemu-img qemu-mipsel qemu-ppc qemu-sparc |
Emular diferentes sistemas | qemu-system-arm qemu-system-mips qemu-system-mipsel qemu-system-ppc qemu-system-sparc qemu-system-x86_64 |
Opciones generales
Al escribir qemu o bien qemu-system-<µP> sin argumentos, se imprimen en pantalla la lista de opciones disponibles. Algunas de las opciones más frecuentes serán:
Opción | Función |
---|---|
M | Permite indicar la máquina a emular. Por ejemplo, al hacer qemu -M ? se nos muestra: pc -> Standard PC (default) isapc -> ISA-only PC |
fda/fdb hda/hdb hdc/hdd | Permitirán especificar el 'fichero' a utilizar como disco en la máquina emulada. Podemos indicar un fichero imagen o bien un dispositivo. Ejemplo: qemu -hda MandrivaFree2007.img |
cdrom | Permitirá especificar el 'fichero' a utilizar como CDROM (maestro primer IDE) en la máquina emulada. Ejemplo: qemu -cdrom MandrivaFree.iso Ejemplo: qemu -cdrom /dev/cdrom |
boot [a|c|d|n] | Permiten especificar la configuración de arranque para la máquina emulada a -> Arrancar desde el floppy c -> Arrancar desde el disco duro d -> Arrancar desde el cdrom n -> Arrancar desde la red |
snapshot | Indica a qemu que no debe escribir en las imágenes de disco, para guardar los cambios se utilizarán ficheros temporales |
m | Cantidad de RAM (en MB) para la máquina emulada, por defecto 128 Ejemplo: qemu -m 512 |
smp | Número de CPUs en la máquina emulada, por defecto 1 Ejemplo: qemu -smp 2 |
localtime | Fija el RTC a la hora local en lugar de utilizar la hora UTC (para Windows) |
kernel-kqemu | Utiliza virtualización para ejecutar el núcleo de la máquina virtual, por defecto sólo se utiliza virtualización para el espacio de usuario. |
loadvm | Carga una máquina virtual a partir de un fichero que almacena su estado |
vnc | Lanza un servidor VNC para mostrar el vídeo de la máquina emulada |
daemonize | Arranca QEMU como un servicio |
Ejemplo: Lanzar una máquina virtual de qemu con 256MB de RAM y ejecutando una imagen iso del CD de DSL
qemu -m 256 -cdrom DSL.iso -boot d
Combinaciones de teclas durante la emulación y monitor
Al arrancar una máquina virtual, es posible realizar las siguientes combinaciones de teclas:
Combinación | Función |
---|---|
ctrl-alt | Desengancha el ratón de la máquina virtual para poder utilizarlo en el SO anfitrión |
ctrl-alt-f | Conmuta el modo de visualización para la máquina virtual entre pantalla completa o ventana |
ctrl-alt-1 | Pantalla de la máquina virtual |
ctrl-alt-2 | Monitor de QEMU |
ctrl-alt-3 | Consola serie |
ctrl-alt-4 | Consola paralelo |
ctrl-alt-avance página ctrl-alt-retroceso página ctrl-alt-arriba ctrl-alt-abajo | Controlan el desplazamiento de pantalla en el monitor y las consolas |
Aunque el foco se encuentre en la ventana de la máquina virtual, algunas combinaciones de teclas siguen siendo problemáticas. Por ejemplo, pulsar ctrl-alt-f1 en el teclado hará que seleccionemos la primera terminal de la máquina huésped, no de la máquina virtual. Ocurre lo mismo con ctrl-alt-delete y otras combinaciones.
Con QEMU funcionando es posible conmutar entre la salida de vídeo de la máquina virtual y el Monitor de QEMU (pulsando ctrl-alt-1 y ctrl-alt-2). El monitor permite controlar la máquina virtual, al escribir help se mostrará la lista de comandos disponibles.
Para comprobar si se está utilizando KQEMU deberemos escribir: info kqemu
Algunos de los comandos más frecuentes del monitor son:
Comando | Función |
---|---|
commit device|all | Aplica los cambios a las imágenes de disco (cuando se utiliza la opción snapshot) |
info subcommand | Muestra información sobre la máquina virtual |
q|quit | Cierra QEMU |
eject [-f] dispositivo | Expulsa uno de los soportes de la máquina emulada (CD/floppy) |
change device filename | Cambia uno de los soportes de la máquina emulada (CD/floppy) |
screendump filename | Realiza una captura de pantalla |
savevm tag|id loadvm tag|id delvm tag|id | Guarda, recupera y borra instantáneas de la máquina virtual |
stop c|cont | Detiene y reanuda la emulación |
sendkey keys | Envia una secuencia de teclas a la máquina virtual Ejemplo: Para iniciar sesión en Windows hay que escribir sendkey ctrl-alt-delete |
system_reset system_powerdown | Equivalentes a pulsar el botón de reset y de apagado en una torre |
Opciones de red
Las aplicaciones de ejecutar una máquina virtual con QEMU estarian muy reducidas si la máquina virtual no se pudiese comunicar con el resto del mundo a través de la red. QEMU presenta un conjunto de opciones para definir las tarjetas de red que estarán disponibles en la máquina virtual y su conexión con el mundo real.
Estas opciones permiten:
- Definir el número de adaptadores de red ethernet, su hardware (NE2000, RTL8139, SMC91C111) y sus direcciones físicas que estarán disponibles en la máquina virtual.
- Definir de forma virtual conmutadores que conectaran las NIC de las diferentes máquinas virtuales. Pudiendo estar las máquinas a comunicar en el mismo host o en diferentes equipos.
- Definir adaptadores de red (tap) en el equipo anfitrión que estarán conectados a uno de los conmutadores del punto anterior.
- Redirigir puertos TCP o UDP del ordenador anfitrión a una de las máquinas virtuales.
Red en modo usuario (por defecto)
Cuando se lanza una máquina virtual QEMU sin indicar ninguna opción de red, o bien al indicar -net user, se utiliza la red en modo usuario.
Este modo está pensado para:
- Ser fácil de utilizar
- Proporcionar una NIC Ethernet a la máquina virtual
- Permitir el acceso de la máquina virtual a la red a través de un NAT
QEMU utilizará un router virtual para dar servicio DHCP a la máquina virtual y permitirle el acceso a la red. Desde el punto de vista de la máquina virtual:
- Se cuenta con una tarjeta Ethernet con MAC 52:54:00:12:34:56 (por defecto)
- Si se realiza una petición DHCP el router virtual asigna la IP 10.0.2.15/24 a la interfaz de red
- Se utiliza como puerta de enlace por defecto a 10.0.2.2 (única dirección a la que se pueden hacer pings)
- Se utiliza como servidor DNS 10.0.2.3
- El SO alojado puede acceder a los servicios de red del SO anfitrión a través de 10.0.2.2 y al resto de equipos de la red física haciendo NAT con la IP del anfitrión
- Desde el anfitrión o la red no es posible acceder a la máquina virtual
Las siguientes capturas de pantalla muestran QEMU ejecutando DSL en modo texto y en modo gráfico. Es posible comprobar la configuración de red en la máquina virtual y como esta permite acceder al exterior.
Modo texto | Modo gráfico |
---|---|
Opciones -net nic
El sistema alojado puede contar con más de un adaptador de red, se pueden utilizar diferentes opciones -net nic para definir estas tarjetas de red.
Para cada tarjeta es posible especificar:
- la VLAN (no confundir con IEE802.1Q)
- la dirección física (MAC)
- el modelo de hardware
Aquí el valor VLAN se refiere a un entero (por defecto 0) que identifica a un 'switch virtual' en el que diferentes instancias de QEMU pueden estar conectadas. No se refiere al concepto de VLAN 802.1Q.
Opciones -net socket
Permiten comunicar diferentes instancias de QEMU que pueden ejecutarse en el mismo anfitrión o en diferentes equipos.
Es posible:
- Utilizar un socket TCP para comunicar diferentes QEMU (una instancia actúa como servidor y las otras como clientes).
- Utilizar una multidifusión
Ejemplo:
qemu -hda linux-A.img -boot c -net nic,macaddr=52:54:00:12:34:56 -net socket,listen=:1234
qemu -hda linux-B.img -boot c -net nic,macaddr=52:54:00:12:34:56 -net socket,connect=127.0.0.1:1234
Redirección de puertos
Es posible redirigir un puerto del anfitrión hacia la máquina huesped. De este modo, desde la red se puede acceder a los servicios ejecutados por instancias de QEMU.
Ejemplo: Redirigir el puerto 5555 del anfitrión al servidor telnet de la máquina virtual
qemu -hda linux-A.img -boot c -redir tcp:5555::23