QEMU

per Victor Carceler darrera modificació 2020-03-25T15:31:36+01:00

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ónHerramienta
 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ónFunción
MPermite 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
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

DSL_boot.png


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-fConmuta el modo de visualización para la máquina virtual entre pantalla completa o ventana
ctrl-alt-1Pantalla de la máquina virtual
ctrl-alt-2Monitor de QEMU
ctrl-alt-3Consola 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
Cuando se lanza una máquina QEMU sin indicar la opción nographic o vnc, se abre una ventana que representa la pantalla de la máquina virtual. Cuando la ventana recibe el foco, la entrada por teclado se dirije a la máquina virtual. Si se hace click con el ratón en el interior de la ventana, el ratón físico pasará a controlar el ratón de la máquina virtual.


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

info_kqemu.png


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|quitCierra 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
 DSL_red_texto.png DSL_navegando.png

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