Tutorial QEMU

 

 

QEMU es un emulador y virtualizador genérico de la CPU, lo que le diferencia de VMware y similares, que sólo permiten virtualizar. La faceta emuladora de QEMU le permite ejecutar sistemas operativos y programas creados para una determinada máquina en otra diferente (como puede ser nuestro PC). Cuando se utiliza como virtualizador requiere un acelerador (denominado KQEMU) y necesita que tanto la máquina huésped como la máquina invitada utilicen procesadores compatibles x86. QEMU es software libre.

En este tutorial -y a modo de ejemplo- virtualizaremos Windows XP en una máquina Linux...

Windows XP en Linux con QEMU

Necesitarás instalar antes QEMU y KQEMU, siguiendo el método usual en tu distribución. Este tutorial lo he realizado sobre Arch Linux 0.8, utilizando qemu 0.9.0-1 y kqemu 1.3.0pre11-2.

En primer lugar, crearemos la imagen de disco, es decir, un fichero que contendrá la imagen del disco duro del sistema invitado, al que daremos un tamaño -por ejemplo- de 4 Gigabytes:

qemu-img create -f qcow xp.qcow 4G

Crearemos ahora una imagen superpuesta a ésta, de modo que los cambios se almacenen en un fichero aparte y podamos regresar a la imagen original en caso en caso de problemas o inestabilidades:

qemu-img create -b xp.qcow -f qcow xp2.qcow

A continuación habremos de insertar el CD de Windows XP en la unidad y preparar el medio de instalación del sistema invitado. Por ejemplo:

dd if=/dev/cdrom of=xp.iso

Procedemos ahora a instalar el sistema operativo:

qemu -cdrom xp.iso -boot d xp2.qcow

Correcto:

La instalación sigue el proceso habitual. El puntero del ratón quedará "atrapado" en la ventana de instalación; para liberarlo pulsa Ctrl y Alt a la vez.

Si te fijas ahora en la consola desde la que arrancaste, es posible que veas dos mensajes de aviso.

El primero dice:

Could not configure '/dev/rtc' to have a 1024 Hz timer. This is not a fatal
error, but for better emulation accuracy either use a 2.6 host Linux kernel or
type 'echo 1024 > /proc/sys/dev/rtc/max-user-freq' as root.

Si te aparece, la solución es inmediata. Teclea lo que se te indica como root en una consola:

echo 1024 > /proc/sys/dev/rtc/max-user-freq

Se supone que eso acelera la ejecución.

El segundo mensaje sólo indica que no estás utilizando el acelerador KQEMU:

Could not open '/dev/kqemu' - QEMU acceleration layer not activated

Para cargar el acelerador has de teclear (una sola vez) esto como root:

echo "options kqemu major=0" >> /etc/modprobe.conf

Tras el primer rearranque automático prosigue la instalación. Al final, tenemos el sistema virtualizado funcionando:

Desde este mismo momento puedes conectarte a cualquier servidor que corra en el host Linux sin más que utilizar para ello la dirección 10.0.2.2. Por ejemplo, aquí estamos conectados a un servidor web Apache corriendo en el Arch Linux anfitrión:

En algunos casos (ver comentarios) también se podría disponer ya de acceso a Internet en este punto. Compruébalo, apagando tu máquina virtual y arrancándola de nuevo con un comando como el siguiente:

qemu -hda /home/tu_nombre_usuario/xp2.qcow -m 384 -kernel-kqemu -localtime

El número que sigue a la m es la memoria RAM que quieres dedicar a tu máquina virtual XP y la opción localtime hace que se muestre la hora correcta (si no, emplea la UTC).

Si puedes salir a Internet, enhorabuena. Para ti, el tutorial acaba aquí.

Si no (o si quieres además que tu máquina virtual sea visible para tu red local), continúa leyendo.

Si no puedes salir a Internet...

En mi caso, por alguna razón el XP no pilla la IP de forma automática, así que tuve que configurar a mano la conexión de red. No me sirvió utilizar la IP de la pasarela de mi sistema y dar al XP una IP en ese rango, sino que tuve que dar ambas en el rango que utiliza QEMU, es decir:

IP : 10.0.2.15
Pasarela: 10.0.2.2

Con esto logré salir a Internet incluso en un caso tan atípico como el mío.

Otra forma más complicada de lograrlo consiste en configurar una conexión bridged (puenteada), que da una IP propia al equipo virtual, lo que -a cambio de una mayor complicación- comporta la ventaja añadida de que lo hace visible desde el host u otros equipos de la red.

El método que sigo a continuación funcionó tal cual en Arch Linux, pero seguramente habrá que modificarlo para otras distribuciones [disponemos también un tutorial para Fedora, gentileza de Jonsito]. Requiere tener instalados los paquetes bridge-utils y uml_utilities.

Lo que haremos será reconfigurar la red para poder disponer de un interfaz puente, llamado br0.

Crearemos el fichero /etc/qemu-ifup con el siguiente contenido (insisto: las rutas serán las de distribución):

#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
sudo /usr/sbin/brctl addif br0 $1
sleep 2

Para dar a este fichero permisos de ejecución tecleamos:

chmod a+x /etc/qemu-ifup

Crearemos /etc/udev/rules.d/70-kqemu.rules, con el siguiente contenido:

KERNEL=="kqemu", MODE="0666"
KERNEL=="tun", MODE="0666"

Crearemos ~/bin/qemu_setup (es decir, en tu home) con el siguiente contenido:

# insert the tuntap module
modprobe tun

# insert the bridge module
modprobe bridge

# insert the kqemu module
modprobe kqemu major=0

# setup bridge
ifconfig eth0 down
brctl addbr br0
ifconfig eth0 up
brctl addif br0 eth0
ifconfig br0 192.168.0.111 up
ifconfig eth0 down
ifconfig eth0 0.0.0.0 up
route add default gw 192.168.0.1

(ojo: la primera IP será la que quieras darle a tu máquina invitada y la segunda la de tu pasarela a Internet).

Hazlo ejecutable:

chmod a+x ~/bin/qemu_setup

Por último nos creamos un script (~/bin/windows) para arrancar la máquina Windows con las opciones que deseemos (Así, el número que sigue a m representa la RAM que queremos utilizar, etc. Puedes observar todas las opciones disponibles tecleando qemu en la línea de comandos).

Nuestro ~/bin/windows será algo así:

#!/bin/sh
USERID=`whoami`
iface=`sudo tunctl -b -u $USERID`
qemu -hda /home/turing/xp2.qcow -m 384 -cdrom /dev/cdrom -kernel-kqemu -localtime -snapshot -net nic -net tap,ifname=$iface 
sudo tunctl -d $iface &>/dev/null

Hazlo ejecutable:

chmod a+x ~/bin/windows

Tecleamos ahora visudo para añadir las siguientes líneas a /etc/sudoers y poder ejecutar QEMU como usuario normal:

tu_nombre_de_usuario ALL=(ALL) NOPASSWD: /usr/sbin/brctl
tu_nombre_de_usuario ALL=(ALL) NOPASSWD: /usr/bin/tunctl
tu_nombre_de_usuario ALL=(ALL) NOPASSWD: /sbin/ifconfig

Tras reiniciar, ahora, siempre que queramos usar la máquina virtualizada, hemos de ejecutar -como root- el script qemu_setup para poner en marcha la conexión de red y después arrancar -con tu usuario- el script windows.

Ahora ya tenemos salida a Intenet, como demuestra el hecho de que Explorer ya puede encontrar felizmente su casa:

Hasta aquí sólo hemos visto un ejemplo del uso de QEMU como virtualizador, pero QEMU es también un emulador y dispone de muchas otras opciones y posibilidades (y también de una versión para Windows) así que, a poco que me demostréis que el tema os interesa, ésta que ahora contemplas podría ser sólo la primera entrega de toda una saga.

Referencias:

Comentarios

Selecciona arriba tu forma preferida de visualizar los comentarios y pulsa el botón para guardar tu elección para próximas visitas (sólo si eres usuario registrado).
El Nigromante's picture

Es un tema interesante


Si el admin. está por la labor, me parece que sería interesante publicar más artículos sobre el tema.

Viene bastante bien a la hora de probar nuevas distribuciones de linux/unix y de Windows (que todavía me resisto a borrar únicamente por la familia y el Chessmaster, la verdad).

Por otra parte - ya puestos -, también me gustaría conocer opiniones sobre el citado Arch Linux, sobre todo en cuanto a posibles quebraderos de cabeza (configuración), y posibles ventajas sobre otras distribuciones (parece que es una distribución bastante "cruda" ¿? )

Un saludo

admin's picture

Todavía está en portada


Aquí le hemos dado un pequeño repaso a Arch...

mogojojo's picture

Para servidores???


Excelente tutorial, al igual que los otros de Virtual Box y demás. Felicitaciones no te detengas...

Será que lo puedes usar para virtualizar servidores guin2 2k y/o 2k3??? tendrá alguna limitación para crear unos servidores virtuales en guin2 y comunicarlos entre ellos estando en el mismo host, que tal será el rendimiento??? tratandose por supuesto del host en gnu/linux y un monstruito con 16 a 32 GB de RAM y 4 Procesadores.

Alguien conoce una mejor alternativa para virtualizar servidores??? y preferiblemente que sea software libre, gracias.

Lo mejor de la vida es gratis...

Lo mejor de la vida es libre y a veces es gratis...

TriDeck's picture

Virtualización de servidores


De lo que he podido probar, la solución que ofrece un mejor rendimiento es Xen que dispone de una versión open source.

Eso sí, para virtualizar máquinas en Windows, tienen que ser Windows 2003 o XP, dicen que en breve ofrecerán soporte para Windows 2000.

michel's picture

No es necesario el puente de red para salir a internet


Al menos a mí me funciona sin necesidad de ello.

Para lo que sirve el interface tun/tap es para acceder desde el sistema host al sistema guest, es decir, permite al host "ver" la tarjeta de red del guest.

Pero con la configuración red por defecto el guest se comporta de cara a la red como si fuera un proceso más en el host. Es decir, que se puede conectar sin problemas a internet.

admin's picture

Pues no en mi caso


Si no establezco el puente no puedo salir.

¿Te importa decirme tus parámetros de arranque?

michel's picture

Estos:


qemu y kqemu instalados directamente del árbol de portage y sin tocar nada de la configuración.

Arrancando qemu sin ninguna variable extrauuuuuuu.

Y me funciona tanto con kqemu (en modo kernel y en modo usuario) como sin él.

Puesto que otro usuario comenta que en Debian también funciona sobre la marcha, sospecho que es el paquete de arch linux el que trae una configuración exótica. Prueba con los parámetros "-net nic -net user".

admin's picture

Pues no


Ya había probado todos los posibles parámetros de net y sólo tengo salida a Inet con el bridge.

En fin; gracias y seguiremos investigando.

empanada's picture

¿y como es que me funciona la red sin configurar nada?


Pues yo instalé qemu (mas kqemu) en Debian unstable hace unas semanas....y funciona la red sin configurar nada. No lo entiendo. Pero es que no lo entiendo por ningun lado:

Uso Qemu Launcher como interfaz para usar Qemu, el caso es que ni en Qemu Launcher ni por línea de comandos he configurado nada. Además no tengo activado el NAT en el sistema ni cargados los módulos de iptables_nat, ni sevidor dhcp, ni tun, ni bridge, y no tengo configuradas mas que las interfaces loopback y eth0 (estoy tras un router)....¿¿??

Tiene que ser el módulo kqemu que hace un bridge+DHCP el solito, porque es increible. Al hacer un ipconfig /all me da que la ip es 10.0.2.15 y la gateway 10.0.2.2. ¿¿??.

Debian unstable, qemu 0.8.2.5, kqemu 1.3.0.pre9-12

¿¿?? , ¿¿?? y ¿¿??

"Me separé de mi esposa cuando me di cuenta de que teníamos los mismos gustos: las mujeres" Groucho Marx

"Me separé de mi esposa cuando me di cuenta de que tení­amos los mismos gustos: las mujeres" Groucho Marx

admin's picture

No en mi caso (2)


Tiene que ser el módulo kqemu que hace un bridge+DHCP el solito, porque es increible. Al hacer un ipconfig /all me da que la ip es 10.0.2.15 y la gateway 10.0.2.2. ¿¿??.

Pues al menos en mi Arch no ocurre.

Cargo kqemu y sin TUN/TAP no puedo salir a Internet.

Para colmo de males no puedo investigar mucho porque este Windows es un Fundamentals y no tengo ipconfig (?!).