Emular Windows XP usando Qemu

En esta entrada explico los pasos para emular desde Gentoo Linux el sistema operativo completo Windows XP en un AMD64 usando el programa Qemu. En principio, se trata de emular un sistema operativo dentro de otro sin tener que hacer reparticionamiento del disco duro, empleando para su ubicación cualquier directorio dentro de este. El resultado es ejecutar Windows XP en una ventana de Linux, como muestra la siguiente imagen:
Qemu

Al final del documento, a modo de referencia rápida, están resumidos los pasos para lanzar Qemu una vez instalado.

Introducción

Qemu es un programa que ejecuta máquinas virtuales dentro de un sistema operativo, ya sea Linux, Windows, etc. Esta máquina virtual puede ejecutarse en cualquier tipo de microprocesador o arquitectura (x86, x86-64, PowerPC, MIPS, SPARC, etc.). Está licenciado en parte con la LGPL y la GPL de GNU pero opcionalmente se puede usar un módulo propietario para acelerar la emulación de un PC en un PC. Este módulo permite a Qemu ejecutar la mayoría del código de la aplicación directamente en el procesador anfitrión para conseguir un rendimiento cercano al nativo.

Instalación de Qemu

Desenmascarar los paquetes necesarios añadiendolos al archivo /etc/portage/package.keywords:

app-emulation/qemu
app-emulation/qemu-softmmu
app-emulation/qemu-user
app-emulation/kqemu

Dar soporte al módulo acelerador añadiendo al archivo /etc/portage/package.use la siguiente línea:

app-emulation/qemu-softmmu kqemu

Instalar Qemu

# emerge -av qemu

Configurar los permisos para ahorrar futuros problemas. Para ello, modificar /etc/udev/rules.d/48-qemu.rules y dejarlo con un aspecto similar a este:

KERNEL="kqemu*", NAME="%k", GROUP="users", MODE="0666"

Instalación de la imagen virtual de Windows XP

Para poder usar Qemu con el módulo de aceleración, es necesario cargar dicho módulo primero

# modprobe -v kqemu

En realidad hay que cargar el módulo con la opcion major=0 pero el ebuild ya se ha encargado de crear /etc/modules.d/kqemu, por lo que no tenemos que preocuparnos.

Los siguientes pasos ya se pueden ejecutar como usuario normal, no como root.

Crear el archivo que servirá como imagen de la partición de Windows. Cambia la ruta de dicho archivo o su tamaño a tu conveniencia, yo he elegido una partición de 4GB en ~/qemu_windows/winxp.img

# qemu-img create /home/stolz/qemu_windows/winxp.img 4G

Una vez creada la imagen ya podemos instalar en ella el sistema operativo a emular. Introduce el CD de instalación de Windows en tu unidad CD-ROM y ejecuta

# qemu-system-x86_64 -localtime -hda /home/stolz/qemu_windows/winxp.img -cdrom /dev/cdrom -m 450 -boot d
  • -localtime establece la hora del sistema virtual a la misma que la de tu sistema.
  • -hda es una opción y no un parámetro, no lo cambies aunque tu imagen se encuentre en otro disco, por ejemplo sda.
  • /dev/cdrom es la ruta al dispositivo de CD-ROM de tu sistema. Si UDEV no te crea /dev/cdrom puedes probar con /dev/cdrw o /dev/hdc.
  • -m 450 reserva 450MB dememoria para la máquina virtual. Ajusta este valor según la cantidad de memoria que tengas libre en tu sistema.
  • -boot d le dice a Qemu que inicie el sistema desde el CD-ROM, no desde la imagen.

En este punto, se abrirá la ventana de Qemu con el proceso de instalacion de Windows XP que todos conocemos (y muchos odiamos). La instalación sin el módulo acelerador es muy lenta, por eso es mejor comprobar ahora si el módulo está funcionando. Para ello, en la ventana de Qemu, pulsar alt+cntrl+2 y escribir en la consola info kqemu. Si el módulo está funcionando debería mostrar kqemu is enabled. Para salir de la consola de Qemu ejecutar quit. Como el comando anterior cierra Qemu, es necesario repetir de nuevo el comando que lanza el proceso de instalación:

# qemu-system-x86_64 -localtime -hda /home/stolz/qemu_windows/winxp.img -cdrom /dev/cdrom -m 450 -boot d

Al acabar de instalar Windows, si te sobra espacio, haz una copia de la imagen recien instalada porque conociendo a Windows no tardará en fallar y es mejor tener a mano una imagen para no tener que repetir el proceso de instalación

# bzip2 -k winxp.img

Ejecutar el sistema emulado

Para lanzar Windows XP, el comando es el mismo que antes pero sin las opciones de CD-ROM y remplazando -boot d por -boot c

# qemu-system-x86_64 -localtime -hda /home/stolz/qemu_windows/winxp.img -m 450 -boot c

En este instante ya tienes el sistema emulado (Windows) funcionando bajo el sistema anfitrión (Linux), pero sin soporte de red. Para poder acceder a la red, continua leyendo.

Configurar el sistema emulado para tener acceso a la red

Aunque parezca mentira, esta es la parte más compleja de la guía. Para que el sistema emulado (Windows) tenga acceso a Internet, será necesario usar dos tarjetas de red virtuales, una en el sistema emulado (Windows) y la otra en el sistema anfitrión (Linux).

Tarjeta del anfitrión

La tarjeta virtual del sistema anfitrión se consigue activando en el Kernel la siguiente opción

Device Drivers  --->
  Network device support  --->
    <M> Universal TUN/TAP device driver support

Al igual que antes, hay que configurar los permisos para que nuestro usuario pueda acceder al dispositivo de la tarjeta virtual y ahorrar futuros problemas. Para ello, modificar /etc/udev/rules.d/48-qemu.rules y añadir la siguiente línea:

KERNEL=="tun", NAME="net/%k",  GROUP="users", MODE="0666"

y cargar el módulo tun

# modprobe -v tun

Para indicar a Qemu que la tarjeta virtual del sistema anfitrión es de tipo TUN hay que ejecutarlo añadiendo la opción -net tap. Al añadir esta opción, cada vez que lancemos Qemu se ejecutará el archivo /etc/qemu-ifup que se encarga de levantar el interfaz virtual del anfitrión. A destacar que este interfaz solo existirá mientras Qemu se está ejecutando.

Crear /etc/qemu-ifup con el siguiente contenido

#!/bin/sh
sudo /sbin/ifconfig $1 10.0.0.1

y darle permisos de ejecución

# chmod 755 /etc/qemu-ifup

Como /etc/qemu-ifup será ejecutado por nuestro usuario e ifconfig solo puede ser ejecutado por el usuario root, será necesario instalar y configurar app-admin/sudo.

# emerge app-admin/sudo
# visudo

Añadir la siguiente línea y guardar los cambios (Recuerda cambiar stolz por el nombre del usuario que va a ejecutar Qemu)

stolz ALL=NOPASSWD:/sbin/ifconfig

Tarjeta del sistema emulado

Crear la tarjeta virtual del sistema emulado es mucho más sencillo. Tan solo hay que lanzar Qemu con la opción -net nic.

Una vez lanzado, recuerda configurar el interfaz de red de Windows XP con una IP del mismo rango, en mi caso 10.0.0.2 y además establecer como puerta de enlace la IP que indicaste en /etc/qemu-ifup, en mi caso 10.0.0.1. Como DNS indica los mismos que tengas en el archivo /etc/resolv.conf del sistema anfitrión.

Puente entre ambas tarjetas virtuales

Para poder establecer un puente entre ambas tarjetas virtuales es necesario instalar y configurar iptables.

Configuración del Kernel para iptables

Networking  --->
  [*] Networking support
    Networking options  --->
      [*] Network packet filtering (replaces ipchains)  --->
        Core Netfilter Configuration  --->
          <M> Netfilter Xtables support (required for ip_tables)
        IP: Netfilter Configuration  --->
          <M> Connection tracking (required for masq/NAT)
          <M> IP tables support (required for filtering/masq/NAT)
          <M>   Packet filtering
          <M>   Full NAT 
          <M>     MASQUERADE target support

Instalación de iptables
# emerge iptables

Reglas para conectar ambas tarjetas virtuales

Resumen de pasos

Una vez instalados y configurados todos los programas, estos son los pasos que hay que jecutar para lanzar el sistema emulado
Como root:

# modprobe -v kqemu tun

Como usuario normal:

# qemu-system-x86_64 -localtime -hda /home/stolz/qemu_windows/winxp.img -m 450 -boot c -net tap -net nic

Por supuesto, sería posible incluir los pasos ejecutados como root dentro del script /etc/qemu-ifup para que sean lanzados mediante sudo y configurar el archivo sudoers para que los permita ejecutar a nuestro usuario. Tambien és posible incluir de forma predeterminada las reglas de iptables para que se ejecuten al lanzar iptables mediante /etc/init.d/iptables start.

Algunas cosas que debes saber

  • Al pulsar sobre la ventana de Qemu, ésta capturará el movimiento del ratón y las acciones del teclado.
  • Para volver a liberar el ratón y el teclado pulsar alt+cntrl.
  • Para pasar al modo de pantalla completa pulsar alt+cntrl+f.
  • La forma correcta de apagar la máquina virtual es seguir el proceso de apagado normal de Windows y cuando aparezca el mensaje "Ya puede apagar su equipo", abrir una consola Qemu pulsando alt+cntrl+2, y ejecutar en ella el comando quit.

Créditos

La idea surge de este mensaje de los foros de Gentoo y parte de las descripciones están tomadas de la Wikipedia.

kqemu: not compiled

Buenas Stolz, he seguido tu guia y al provar si tengo aceleración por kqemu me dice que no esta compilado...

He seguido tu guia tal cual y he mirado el post de los foros de Gentoo y nada... al compilar me ha dicho que si que lo compilaba con kqemu y tengo los modulos cargados y tal...

Lo único que he visto que vaya lento en la instalación és el copiar archivos... lo demas es rápido.

Sabes que puede ser?

Gracias.

PD: Cuanto tiempo eh? xD

Prueba esto

Hola Marcalj, si que hace tiempo ;)

No se cual puede ser el problema. Se que determinadas versiones de qemu necesitan unas versiones concretas de kqemu y no siempre coinciden las ultimas versiones disponibles en portage para cada uno con las adecuadas. Tal vez en tu caso ese sea el problema. Si quieres, estas son mis versiones concretas:

# USE="kqemu" emerge -av =app-emulation/kqemu-1.3.0_pre7 =app-emulation/qemu-0.8.1 =app-emulation/qemu-softmmu-0.8.1 =app-emulation/qemu-user-0.8.1

Para que los cambios tengan efecto, borrar el modulo y vuelve a cargarlo

# rmmod kqemu ; modprobe -v kqemu

Espero que sea eso.

pos va a ser que no

El otro dia, hice un emerge -e kdevelop, para arreglar unas cosillas que aún no he solucionado i aparte actualizé de kernel i todo nuevo...

La versión del qemu-softmmu es =app-emulation/qemu-softmmu-0.8.1-r1, no creo que pete por eso... xD

Sigue dando el mismo mensaje... Vaya rollo...

I vmware que tal? antes lo tenía pero no me iba muy fino, provaré ahora a ver que tal...

Gracias.

PD: Si me puedes ayudar visita: http://forums.gentoo.org/viewtopic-p-3482474.html

Excelente aunque por gusto

Ya me acostumbre a Linux y no quiero Windows para nada,aunque por mi novia lo voy a hacer.
Muy buena tu explicación.Gracias por estos trucos.

Todos tenemos un genio dentro.((((El asunto es saber encontrarlo)))))).
Linux user #418229..
Distro :Gentoo 2006..
Estudiante de Informática de 2do año...
Cuba...