| Kriptópolis alojado en |
| Zilos-Veloxia Network |
| Tu mejor defensa: |
| Bufet Almeida |
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...

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:
- QEMU [Home Page].
- QEMU [Archwiki].
- QEMU setup [Wisdom is the prime thing].
- QEMU and TUN/TAP networking [Felipe Alfaro Blog].




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
Todavía está en portada
Aquí le hemos dado un pequeño repaso a Arch...
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...
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.
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.
Pues no en mi caso
Si no establezco el puente no puedo salir.
¿Te importa decirme tus parámetros de arranque?
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".
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.
¿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
No en mi caso (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 (?!).
Opinar